Skip to content

Commit de83a42

Browse files
committed
Merge remote-tracking branch 'origin/main' into claude/issue-6484-same-dir-bare-path-fromcategory
2 parents ffc4bfb + c804f19 commit de83a42

19 files changed

Lines changed: 1214 additions & 56 deletions
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
'@objectstack/objectql': patch
3+
---
4+
5+
LifecycleService 的空间回收(VACUUM 级)与分片轮转(DROP 过期分片)现在也尊重 #4747 的 teardown abort 位。
6+
7+
PR #5956 / #5755 / PR #6397 依次给 reap 分页循环、Archiver 批循环和冷侧 `keep` prune 补上了 abort 判定,但 `sweep()` 里还剩两条同形的腿:
8+
9+
- **空间回收**:abort 判定在对象循环的**头部**,teardown 落在**最后一个**声明对象的 reap 内时,`batchedReap` 因读到 `aborted === true` 而 break,对象循环随即自然结束(不再经过那个判定),控制流直接落到回收循环 —— 向正在关闭的 datasource 发一次 VACUUM 级操作。
10+
- **分片轮转**:对象同时声明 `ttl``storage.strategy: 'rotation'` 时,ttl reap 已经读过位并 break,返回后轮转仅由 strategy 与驱动能力把关,无判定地 DROP 过期物理分片。
11+
12+
两条腿都是「已经拿到答案之后作出的决定」,而不是恰好横跨 teardown 的一次 await。推迟均无代价:回收是纯粹的页面归还,不删任何行;轮转是 O(1) 的窗口回收,下一轮 sweep 用同一个 `shards × unit` 推出同一个窗口、清同一批分片 —— 至多晚一个 sweep 间隔。
13+
14+
仅声明 `rotation`(无 `ttl`)的一路行为不变:该形态下 `reapObject` 在轮转之前没有任何 await,位在结构上必为 false,而非「无人读过」。

.changeset/notification-dual-source-c3.md

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,36 +10,63 @@ each resolved to **two different declarations** depending on the import
1010
path — the #4411 dual-source trap. Resolution (three-repo,
1111
import-statement-level consumer scan: framework, cloud, objectui):
1212

13+
> **Correction (#5781): the `./ui` declarations were NOT consumer-free — the
14+
> removal stands, the evidence sentence does not.** The scan above matched
15+
> `import … from` statement text, and objectui reached these two names by two
16+
> hops it could not see: `packages/types/src/index.ts` re-exported both with
17+
> `export … from '@objectstack/spec/ui'`, and
18+
> `packages/core/src/protocols/NotificationProtocol.ts` consumed them via the
19+
> `@object-ui/types` barrel in the public signatures of
20+
> `resolveNotificationConfig` / `specNotificationToToast` (objectui#3310, at
21+
> 17.0.0-rc.1). objectui does not ask for the retirement back: that bridge had
22+
> zero in-repo callers, `@object-ui/react`'s locally-declared
23+
> `NotificationSystemConfig` is what runs, and objectui deleted the bridge to
24+
> follow this retirement. A cross-repo liveness verdict must be read off the
25+
> resolved SYMBOL GRAPH — covering `export … from` re-exports and
26+
> barrel-indirect consumption — never off import-statement text; this was the
27+
> third miss of that class, after #4667 / #4709 (`app.homePageId`).
28+
1329
- **Removed** `NotificationSchema` / `Notification` from
1430
`@objectstack/spec/ui`. This was a toast/banner "notification instance"
1531
shape (`type`/`severity`/`message`/`duration`/`actions`/`position` + ARIA
16-
props) with **zero importers** in all three repos — objectui's toaster
17-
never adopted it. The live contract is `./api`'s `Notification(Schema)`:
32+
props) that objectui's toaster never adopted — its only holders were the
33+
re-export bridge named in the correction above, which objectui has since
34+
deleted. The live contract is `./api`'s `Notification(Schema)`:
1835
the REST inbox row (`id`/`type`/`title`/`body`/`read`/`data`/`actionUrl`/
1936
`createdAt`) embedded in `ListNotificationsResponseSchema`, served by
2037
`/api/v1/notifications`, implemented by `@objectstack/client`, and
2138
mirrored by `InboxNotification` in `@objectstack/spec/contracts`
2239
(ADR-0030: the bell reads this shape).
2340
- FROM `import { NotificationSchema, type Notification } from '@objectstack/spec/ui'`
24-
TO `import { NotificationSchema, type Notification } from '@objectstack/spec/api'`.
25-
**Shape change**: the api row is an inbox record, not a presentation
26-
config — the ui shape's `severity` / `duration` / `dismissible` /
27-
`actions` / `position` / ARIA fields do not exist there. For the
41+
TO: **no replacement.** Do NOT re-point this import at
42+
`@objectstack/spec/api` — that is the same name under a different
43+
contract, and following it does not compile. The api `Notification` is the
44+
REST inbox row (`id` / `type` / `title` / `body` / `read` / `data` /
45+
`actionUrl` / `createdAt`); the removed ui shape was a toast instance
46+
(`message` / `severity` / `position` / `duration` / `dismissible` /
47+
`actions` + ARIA). The two share zero fields, and aliasing one to the
48+
other would re-create the dual-source trap this change closed. For the
2849
presentation vocabulary keep using the ui enums, which are unchanged:
29-
`NotificationTypeSchema`, `NotificationSeveritySchema`,
30-
`NotificationPositionSchema`, `NotificationActionSchema` (+ their
31-
types) still live in `@objectstack/spec/ui`.
50+
`NotificationTypeSchema`, `NotificationSeveritySchema` and
51+
`NotificationPositionSchema` (+ their types) still live in
52+
`@objectstack/spec/ui`. Declare the instance shape locally, as objectui
53+
does. (`NotificationActionSchema` was listed here too at the time of this
54+
change; #5015 retired it in 17.0.0-rc.3, so three enums survive, not
55+
four.)
3256
- **Removed** `NotificationConfigSchema` / `NotificationConfig` from **both**
3357
`@objectstack/spec/system` and `@objectstack/spec/ui` — the bare name left
34-
the spec export surface entirely. Both declarations had zero importers in
35-
all three repos and were wired into no parent schema. The system side (a
58+
the spec export surface entirely. Neither declaration was wired into any
59+
parent schema; the `./system` one had no importers in any of the three
60+
repos, and the `./ui` one was held only by the objectui re-export bridge
61+
named in the correction above. The system side (a
3662
channel + template + recipients + schedule + retryPolicy + tracking
3763
"unified notification management protocol") predates ADR-0030's accepted
3864
delivery architecture and advertised capability the runtime does not
3965
deliver (its channel enum's `push`/`slack`/`teams`/`webhook` dead-letter,
4066
#3197; nothing reads `schedule`/`retryPolicy`/`tracking`). The ui side (a
4167
toaster global config: `defaultPosition`/`defaultDuration`/`maxVisible`/
42-
`stackDirection`/`pauseOnHover`) was never adopted by objectui.
68+
`stackDirection`/`pauseOnHover`) was never adopted by objectui's toaster,
69+
which reads its own `NotificationSystemConfig` instead.
4370
- FROM `import { NotificationConfigSchema } from '@objectstack/spec/system'` (or `.../ui`) →
4471
TO: no direct replacement. The live delivery vocabulary is
4572
`NotificationService.emit` (`INotificationService`,
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
---
2+
'@objectstack/spec': patch
3+
---
4+
5+
docs(spec): correct two published claims about the #4610 Notification retirement, and forward-note the stale `areas` caveat in the shipped rc.2 changelog (#5781, #5809)
6+
7+
**What changes is what the repo SAYS, not what it does.** No schema byte, no
8+
export, no conversion and no baseline moves; `@objectstack/spec/ui` still does
9+
not publish `Notification(Schema)` / `NotificationConfig(Schema)` and
10+
`@objectstack/spec/system` still does not publish `NotificationConfig(Schema)`.
11+
Two of the three corrections are to live contract prose, one is a forward-note
12+
on a shipped changelog section, and one unconsumed changeset (a v17 GA release
13+
input) is corrected at the source.
14+
15+
**1. "zero importers in all three repos" was false for objectui (#5781).** #4610
16+
justified removing the two `./ui` notification wrappers with a three-repo,
17+
import-statement-level consumer scan. objectui#3310 measured the same names at
18+
17.0.0-rc.1 and found both alive: `packages/types/src/index.ts` re-exported them
19+
with `export … from '@objectstack/spec/ui'`, and
20+
`packages/core/src/protocols/NotificationProtocol.ts` consumed them through the
21+
`@object-ui/types` barrel, in the public signatures of `resolveNotificationConfig`
22+
/ `specNotificationToToast`. The scan matched `import … from` statement text and
23+
could see neither hop.
24+
25+
**The retirement is not reopened.** objectui does not ask for it back: the
26+
`@object-ui/core` bridge had zero in-repo callers, the implementation that runs
27+
is `@object-ui/react`'s locally-declared `NotificationSystemConfig`, and objectui
28+
deleted the bridge to FOLLOW the retirement rather than re-declare vocabulary the
29+
spec had just dropped. Only the sentence that justified the removal changes.
30+
31+
**2. The FROM → TO would have sent an author to code that does not compile
32+
(#5781).** #4610 published `from '@objectstack/spec/ui'` → `from
33+
'@objectstack/spec/api'` for `Notification(Schema)`. `./api`'s `Notification` is
34+
the REST inbox row (`id` / `type` / `title` / `body` / `read` / `data` /
35+
`actionUrl` / `createdAt`); the removed `./ui` shape was a toast instance
36+
(`message` / `severity` / `position` / `duration` / `dismissible` / `actions` +
37+
ARIA). They share zero fields — same name, a different contract, which is the
38+
dual-source trap #4610 closed rather than a new home for the old shape. The
39+
guidance is now **no replacement**: keep `./ui`'s presentation enums and declare
40+
the instance shape locally, as objectui does. Counted honestly while rewriting
41+
it: **three** enums survive (`NotificationType` / `NotificationSeverity` /
42+
`NotificationPosition`), not the four #4610 listed — #5015 retired
43+
`NotificationAction` at 17.0.0-rc.3.
44+
45+
**3. The methodology, written down beside the tombstone.** A cross-repo liveness
46+
verdict must be read off the RESOLVED SYMBOL GRAPH, covering at minimum
47+
`export … from` re-exports and consumption that reaches the spec indirectly
48+
through a downstream barrel package — never off import-statement text. This was
49+
the third miss of that class, after #4667 / #4709 (`app.homePageId`).
50+
51+
**4. Shipped changelog sections get forward-notes, never rewrites (#5809).** A
52+
changelog's value is in being a faithful record of what was shipped and said, so
53+
the stale sentences stay and a clearly-marked correction is added inside the
54+
section, pointing at where the corrected statement lives. Three notes land in
55+
`## 17.0.0-rc.2`: two on the #4610 entry (`0a936ea`, the evidence and the
56+
FROM → TO), and one on the #4651 app-area entry (`ad047d2`), whose caveat *"per-item
57+
gating inside an area is enforced by the shell only, because the server does not
58+
walk `areas`"* has not held since #4722`filterAppForUser` runs the same
59+
`filterNav` over every `areas[].navigation`. The same file's `## 17.0.0-rc.4`
60+
entry `e4c8b6c` (#5337 / PR #5796) already carries the corrected statement, so
61+
until now one `CHANGELOG.md` asserted a prescription in one section and refuted
62+
it in another; a reader arriving by keyword search could be sent off to do an
63+
unnecessary navigation-tree refactor.
64+
65+
Corrected directly (live contract text and GA inputs, not shipped records):
66+
`packages/spec/src/ui/notification.zod.ts`'s tombstone,
67+
`packages/spec/src/migrations/registry.ts`'s protocol-17 `#5015` rationale (which
68+
projects verbatim into `docs/protocol-upgrade-guide.md` and `spec-changes.json`
69+
via `gen:upgrade-guide` / `gen:spec-changes` — both regenerated, never hand-edited),
70+
and the still-unconsumed `.changeset/notification-dual-source-c3.md`, which is a
71+
legal input to the v17 GA release notes while the repo is in changesets pre mode.
72+
New pin tests keep both false premises from returning: the registry `reason` is
73+
pinned in `migrations.test.ts`, the tombstone's four verdicts in
74+
`notification.test.ts`. ⛔ `content/docs/releases/` is untouched.

0 commit comments

Comments
 (0)