[{"url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25198","id":4964990649,"node_id":"PR_kwDOQ8CKns8AAAABJ---uQ","html_url":"https://github.com/objectstack-ai/objectstack/pull/25198","diff_url":"https://github.com/objectstack-ai/objectstack/pull/25198.diff","patch_url":"https://github.com/objectstack-ai/objectstack/pull/25198.patch","issue_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/25198","number":25198,"state":"open","locked":false,"title":"fix(plugin-security): a controlled_by_parent detail's read scope is the engine's ReadableIds leaf over its master (ADR-0139 D6, seventh consumer); Q2 A in service-analytics; the Turso remote nested leaf","user":{"login":"objectstack-fleet[bot]","id":332303061,"node_id":"BOT_kgDOE86K1Q","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D","html_url":"https://github.com/apps/objectstack-fleet","followers_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/followers","following_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/repos","events_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"body":"Fixes #24932\n\nClause-②: no\nMetadata-protocol: none\n\n## What\n\n`controlled_by_parent` becomes the seventh consumer of the engine's `ReadableIds` leaf (ADR-0139 D6; ruling B `6303721609`; built as ruling Q1 C / Q2 A `6329027469` binds it, after #25144 / PR #25166 landed the boot-time refusal of the two master shapes the leaf cannot serve).\n\n- **plugin-security.** `computeControlledByParentFilter` answers `{ masterFK: { $in: ReadableIds.of(master) } }` for EVERY `controlled_by_parent` object on a read verb, with no up-front routing to an id list. The engine composes the leaf at its executor boundary from this plugin's own `canReadObject` / `getReadFilter` of the master, recursively down a master chain, and the driver runs ONE statement with the master inside a subquery. The four call sites (the middleware's principal and delegator halves, `getReadFilter`, `computeDelegatedReadFilter`) answer the leaf. The cycle guard and the depth bound stay and become a registry-only walk (`controlledByParentChainRefusal`) made BEFORE the leaf is written: a metadata cycle and a chain past `CBP_MAX_CHAIN_DEPTH` keep answering zero rows (`$in: []`), and the cut is the engine's own (`READABLE_IDS_MAX_CHAIN_DEPTH`), so the engine's refusals are never reached for a declared chain. A write verb's predicate carries no leaf (ADR-0139 D1): the derivation answers `null` for `update` / `delete`; a predicate write of a detail is narrowed to the rows the read door returns for the caller's own predicate (#21829, where the leaf composes) and judged per master by the 2.8 gate (#25012, a verdict, never a scope). The delegator half writes the same leaf, so a delegated read carries one subquery twice: correct rows, left as the ruling's execution parameter says.\n- **service-analytics (Q2 A).** The engine-bound merges — `ObjectQLStrategy.withReadScope`, `resolveFkAttr`, and the plugin's record-label pass (the third engine-bound merge of that family, the structural twin `resolveFkAttr`'s own comment names) — pass `admitReadableIds: true` to `assertReadScopeComparandsRunnable`. `NativeSQLStrategy.canHandle` declines a query whose base or joined object's read scope carries a leaf (`readScopeCarriesReadableIds`, the content-based decline the 2026-08-12 ruling on #7598 accepted), so the query routes to the ObjectQL strategy. `compileScopedFilterToSql` refuses a leaf-carrying scope first and by name, in its existing withheld `READ_SCOPE_COMPILE_FAILED` / 500 envelope.\n- **driver-turso.** `toRemoteWhere` resolves a composed leaf's scope through itself with the outer read's options, so a nested composed leaf (a two-level chain) resolves on the remote face instead of reaching the transport unresolved.\n- **spec.** One nested-leaf row in `READABLE_IDS_CASES` (every driver suite measures the shape), and the comparand-shape door's docblock names both callers that pass `admitReadableIds`. Measured: the docblock sentence reaches no generated surface — `check:api-surface`, `check:docs` and the rest of spec's `check:*` ran green on this head with nothing regenerated.\n- **ADR-0055 (Tier H).** The status line gains the 2026-10-22 amendment (mechanism (b) and the set-size limit retired for `controlled_by_parent`); the Consequences bullets `:74` (set-size ceiling) and `:75` (per-request cost, \"cached within the request\" — it never was, and it ran twice) each carry a dated correction; so do the amendment's `What both halves do now — Read` paragraph and its `Cost` sentence. **ADR-0139 (Tier H).** D5 gains the dated seventh-consumer note worded \"refuses at boot\" (engine seat 1's pointer `6333147990`, the late-registration limit included); D6's sentence \"whether that id set becomes a seventh consumer was ⛔ not decided here\" gains a dated parenthetical pointing at ADR-0055's amendment and D5's note. That D6 parenthetical is beside the ruling's named sentences, added because this PR falsifies the clause next to it; the seat may strike it.\n\n## Deviations, named\n\n1. **The `/api/v1/analytics/sql` dry-run echo of a `controlled_by_parent` object refuses** (`READ_SCOPE_COMPILE_FAILED` / 500, withheld) where it rendered the bound id list. The one visible change, on a debugging aid, as ruling ⑤ names it.\n2. **A delegated caller's detail now follows its master's delegated read.** `explain-enforce-parity`'s row `an agent on behalf of the org writer, a detail under someone else's master, update` moves from `RECORD_NOT_FOUND` / 404 to `PERMISSION_DENIED` / 403, and `controlled-by-parent-chain`'s delegated row (a hand-built two-human context) from `line_us` to `line_us, line_jp`. Cause: the engine composes the master's leaf with the delegated context, asking `getReadFilter(master)` — the ADR-0090 D10 spelling #25106 landed, the principal's leg at the ceiling's DECLARED depth (`org` when the ceiling declares none). The id-list derivation resolved that half at the ceiling's EFFECTIVE depth (`own` on a private master), so a detail was absent to a caller who could read its master: the parity row's sibling, `p_theirs` (the master shape), already answered 403 for the same caller. The detail now reads exactly the rows a delegated direct read of its master reads (ADR-0139 D5.1 as amended, ADR-0055 §2's equality). No row is served that the same caller could not already read on the master; the write is still refused at the master-edit gate. Reported here and in the dev report as a measured delta, with the recommendation to accept it; keeping the old narrower answer would need a second spelling of the master's delegated scope, which ruling B ③ refuses.\n3. **Bulk writes on a detail no longer carry the read derivation in their predicate** (ADR-0139 D1). For an addressed predicate write (`update` / `delete` with `multi`) the matched set is unchanged: #21829 narrows it to the rows the read door returns (through the leaf) and #25012 judges every master; pinned on the real stack (a bulk update by a caller touches exactly the rows under the masters it may read and edit). The two #21829 stand-down shapes — a nested operation and the engine's referential field clear — carry the RLS write filter only, where before this PR they also carried `masterFK IN (readable master ids)`. NOT MEASURED at run time: those two shapes are engine-internal writes (no caller addresses them); named here so the seat can ask for a measurement if it wants one.\n4. **PR opened on the dispatch base `72a302a9d` without merging the six `main` commits that landed meanwhile** (`b6e870707`..`14e7239e7`): none of their 71 files is among this branch's 29, and the queue's merge-ref run validates the merge; `02ad31a0c` (the spec parse refusing a `controlled_by_parent` master reference ADR-0055 §1 does not admit) is the one to watch on that run.\n\n## Measurement conditions (the ruling's)\n\n1. **PostgreSQL** — a local PostgreSQL 16 (`initdb` + `pg_ctl` as the `postgres` user, port 54329, torn down with this work). driver-sql's readable-ids conformance with `OS_TEST_POSTGRES_URL` set: `live postgres RAN`, 36 passed / 1 skipped (the suite's own MySQL carve-out), the nested row included. The switch's own rig ran its PostgreSQL cell too (`on postgres`, every pin below: row sets, statements with double-quoted identifiers, the 33,000-master read, the guards): `controlled-by-parent-leaf-switch`, `controlled-by-parent-master-object-read`, `explain-enforce-parity` together 3 files / 231 tests passed on `2b988305d`.\n2. **Dashboard latency, HotCRM fixture** (`objectstack-ai/hotcrm` @ `c8a7a7047`: the six `controlled_by_parent` objects the card names plus `crm_campaign_member` and `crm_article_feedback`, which HotCRM declares since; masters `crm_account` / `crm_opportunity` / `crm_event` private, `crm_campaign` / `crm_knowledge_article` public_read; the chain `crm_quote_line_item → crm_quote → crm_account`). Harness: the real engine, SecurityPlugin and SharingService; SCALE = 10,000 masters per master object (the caller owns every even one), 2 details each; 16 widgets = count and grouped-by-status per object, each run 7 times after 2 warm-ups, medians. Three cells: today's native face (NativeSQLStrategy over the pre-resolved id list, the pre-scan timed inside the cell as the retired derivation ran it), the engine face after the switch (the native strategy declines, the ObjectQL strategy composes the leaf), and a control (the engine face over the id list). SQLite, shared box:\n\n   | object | shape | today native (ms) | after engine (ms) | control engine+idlist (ms) | ratio after/today |\n   |:--|:--|--:|--:|--:|--:|\n   | crm_contact | count | 51.3 | 47.7 | 92.4 | 0.93 |\n   | crm_contact | grouped | 39.2 | 28.8 | 49.1 | 0.74 |\n   | crm_quote | count | 50.9 | 23.8 | 43.7 | 0.47 |\n   | crm_quote | grouped | 33.0 | 24.8 | 42.3 | 0.75 |\n   | crm_contract | count | 45.1 | 36.4 | 55.3 | 0.81 |\n   | crm_contract | grouped | 31.0 | 30.7 | 41.3 | 0.99 |\n   | crm_quote_line_item | count | 82.6 | 86.0 | 130.5 | 1.04 |\n   | crm_quote_line_item | grouped | 89.7 | 71.6 | 142.3 | 0.80 |\n   | crm_opportunity_line_item | count | 53.4 | 41.8 | 39.6 | 0.78 |\n   | crm_opportunity_line_item | grouped | 34.5 | 27.4 | 44.0 | 0.79 |\n   | crm_event_attendee | count | 32.7 | 38.7 | 55.1 | 1.18 |\n   | crm_event_attendee | grouped | 42.2 | 39.5 | 44.4 | 0.93 |\n   | crm_campaign_member | count | 39.1 | 13.2 | 72.3 | 0.34 |\n   | crm_campaign_member | grouped | 40.5 | 17.2 | 68.0 | 0.43 |\n   | crm_article_feedback | count | 48.7 | 21.4 | 57.3 | 0.44 |\n   | crm_article_feedback | grouped | 41.5 | 19.2 | 53.8 | 0.46 |\n   | **total, 16 widgets** | | **755.4** | **568.4** | **1031.5** | **0.75** |\n\n   Every cell answered the same counts. \"Material\" was judged as a widget whose after/today median ratio exceeds 1.5 or whose total exceeds today's by more than 20%; the two widgets above 1.0 (1.04, 1.18) sit inside their own max spread (82.6 → max 138.2; 32.7 → max 52.3), the total is 25% faster, and the control shows the gain is the subquery, not the routing. No regression to report. PostgreSQL: NOT MEASURED at the time this PR opened — the harness's PostgreSQL cell first hit a harness bug (knex binds `?` on pg too), and the fixed cell then spent four acquisition budgets of the shared verify lock behind sibling dogfood runs; it is queued once more with the dogfood battery and its reading goes in the dev report if it lands.\n3. **Turso remote nested leaf** — landed with the switch; the conformance row measures it on both faces (27 passed), and the ablation below shows the remote face refusing without the one line.\n4. The cloud seat's staging read of a two-level `controlled_by_parent` chain at its pin move: not this PR's; named here as owed.\n\n## Pins (every one on the real stack unless named as a double)\n\n`packages/plugins/plugin-security/src/controlled-by-parent-leaf-switch.test.ts` — ObjectQL over better-sqlite3 (and over live PostgreSQL when `OS_TEST_POSTGRES_URL` names one; both cells ran here), the real SecurityPlugin and SharingService, member contexts and the OAuth-assembled delegated context:\n\n- every caller shape keeps its row set — restricted (ownership + a share, both identities), unrestricted (`viewAllRecords`: every contact whose account exists, never the null or dangling pointer), child-only (`canReadObject(master)` false ⇒ no row, count 0), delegated (the ADR-0090 D10 intersection), the two-level chain (line ⊂ quote ⊂ account, for every caller), a system control;\n- statements per request: find = 1 statement reading the detail with the master inside its subquery and find + count = 2, for the plain, unrestricted and two-level shapes; zero statements read the master on its own; a delegated find is one statement carrying the master subquery twice; the two-level chain nests the subqueries;\n- past the dialect's variable limit: 33,000 masters (better-sqlite3 binds 32,766) — the detail answers 200 with exactly `bc1, bc2`, count 2, one statement binding the owner and no master id;\n- a metadata cycle and a chain past the depth bound answer zero rows, 200, reported (the log names the cycle and the bound), with no subquery statement; the cut is the engine's: eight derived objects compose into one statement with eight nested subqueries and serve the row, the ninth is the empty set;\n- ADR-0139 D1: a bulk update of the contacts by a caller lands, touching exactly the rows under the accounts it may read and edit;\n- the scope `getReadFilter` answers carries the branded leaf — one for a direct caller, one per leg for a delegated one, the leaf over ITS master for a derived master, and still the leaf for a caller the master object does not admit (the engine answers it `$in: []`).\n\n`readable-ids-nested-compose.test.ts` (reworked) — the stand-in wrapper that spelled the switch is retired; the switch's path and a consumer's leaf serve the same rows, one statement each, no pre-scan of the parent or the grandparent at either level; `getReadFilter(PARENT)` carries the leaf over GRAND, one per leg.\n\n`controlled-by-parent-chain.test.ts`, `controlled-by-parent-sharing.test.ts`, `check-only-write-scope.test.ts` (engine doubles) — evaluate the injected filter through `readable-ids-in-memory.testkit.ts`, the engine's five composition steps over the double's rows with the real service answering the master; their row-set pins stand unchanged except the two named under Deviations, and the two master-scan pins flip to \"the derivation does no store work; the grant table is read when the master's scope is composed\".\n\nTen real-stack rigs gain `wireEngineSecuritySource(engine, () => plugin)` (`engine-security-source.testkit.ts`), the slot `ObjectQLPlugin.init` fills on a kernel: without it an engine composes every leaf `$in: []`, and those suites' detail reads and by-id write probes saw no row (89 reds on the first run, all one cause).\n\n`packages/services/service-analytics/src/__tests__/controlled-by-parent-leaf-three-faces.test.ts` — a leaf-carrying scope on the three faces: the engine-bound face composes it and answers the find path's rows (the security service is asked `canReadObject` / `getReadFilter` of the master), and composes with the caller's own `where`; the native face declines in `canHandle` (direct context and the door's `readScopedObjects`) and through the service the raw-SQL seam is never called; a scope with no leaf is still served natively (the decline is content-based); the echo refuses in the withheld `READ_SCOPE_COMPILE_FAILED` / 500 envelope before any statement, the compiler naming the leaf and the object for the log; an authored look-alike (`{ \"$in\": { \"object\": … } }`) keeps `INVALID_FILTER` / 400 on every face with or without the leaf-carrying scope; the deny sentinel keeps serving nothing on the engine face and is still served natively.\n\n`packages/spec/src/data/readable-ids-conformance.ts` — the nested row runs in every driver suite: driver-sql (sqlite and live PostgreSQL), driver-turso (local and remote), driver-memory, driver-sqlite-wasm, driver-mongodb (refusing), and spec's own.\n\n## Ablations (negative pins put back to the old behaviour, red, restored, restore proven)\n\n`scripts/pm`-free legs, each: `git restore --source=BASE -- FILES` with the blob hash proven equal to BASE's, the pins run, `git checkout HEAD -- FILES` with the blob proven equal to HEAD's and `git diff HEAD` empty for the leg's files; a trap restores on any exit. BASE `72a302a9d`, HEAD `2b988305d`.\n\n- **security-plugin.ts at BASE** (the id-list derivation; on disk `ReadableIds.of(rel.master)` count 1 → 0): 30 pins red — on the SQLite and the PostgreSQL cells: every statements-per-request pin (the find reads the master on its own), the 33,000-master read (`DATABASE_ERROR` / 500, `too many SQL variables` on SQLite), the one-statement pins, the leaf-shape pins (`getReadFilter` answers bound ids), the engine's-cut pin; in the reworked suites the \"no store work\", \"the scope carries the leaf\", nested-compose \"one statement on both paths\" and the delegated-row pins. Restored: blob == HEAD, tree clean.\n- **the four analytics files at BASE** (admit count 2 → 0): 3 pins red — the engine-bound face refuses the leaf (`READ_SCOPE_COMPILE_FAILED`), `canHandle` answers true and the raw seam is called, the echo's compiler names no leaf. Restored.\n- **turso-driver.ts at BASE** (nested-resolve count 1 → 0): 1 pin red — the nested conformance row refuses on the remote face. Restored.\n\n## Tests and gates\n\nAll under `scripts/pm/os-verify-lock.sh` (shared box; the lock's VERDICT lines are in the dev report). On head `2b988305d`: `@objectstack/plugin-security` full suite 208 files / 4275 tests passed, 45 skipped; `@objectstack/service-analytics` 184 files / 4505 passed, 262 skipped; typechecks of plugin-security, service-analytics and driver-turso exit 0; readable-ids conformance: driver-sql sqlite 18 passed / 2 skipped and live PostgreSQL 36 passed / 1 skipped, driver-turso 27, driver-memory 15, driver-sqlite-wasm 11, driver-mongodb 13 (refusing), spec 48; the dependency closure built (22 tasks). Gates: `dispatch-gates --commands` derived 102 families on `2b988305d`; 100 ran exit 0 and 2 are NOT MEASURED locally (`check:dual-build-cjs-loads`, `check:i18n`: PREREQUISITE NOT MET, both read every package's `dist/`; CI's `Lint & Repo Gates` runs them); `--ran` reconciliation: 102 accounted, 0 unrun. `check:nul-bytes` OK. The full dogfood battery is owed under the lock and reported in the dev report.\n\n## Acceptance notes\n\n- `packages/spec/src/data/readable-ids.ts:50-53` (\"The engine's filter seam is the one caller that passes it\") and `packages/objectql/src/filter-comparand-shape.ts:109` (\"This is the one caller that passes `admitReadableIds`\") say the sentence this PR corrects in `filter-comparand-shape.ts`'s docblock; both are outside the claim's bound (the first is a second spec file, the second is objectql). Prose only; carrier: the seat.\n- ADR-0139 D6's clause \"§2's mechanism (b) for `controlled_by_parent` stands, set-size ceiling included\" is false since this PR; the dated parenthetical added beside it points at ADR-0055's amendment rather than rewriting the accepted sentence. Tier H; carrier: the seat.\n- The cloud seat's staging read of a two-level chain on Turso remote (measurement condition 4) is owed at its pin move; the remote-face fix and its conformance row are in this PR.\n- The `/analytics/sql` echo refuses for `controlled_by_parent` objects (Deviation 1); if the maintainer wants the echo to render for them, that is the raw-SQL compiler learning the engine's composition (ruling's option B for Q2), a separate card.\n- `readable-ids-in-memory.testkit.ts` is a test double of the engine's five composition steps for the fake-engine suites; parity with the engine's own composition is pinned on the real stack in this package and in objectql's suites. If a later change to the engine's composition is meant to reach those suites, the testkit must move with it.\n\n## 维护者速读(草稿)\n\n**改了什么:** 主从对象(`controlled_by_parent`)的读取范围不再预先把「能读的主记录 id 列表」查出来再绑进 SQL,而是交给引擎用子查询(ADR-0139 的 `ReadableIds` 叶子)在一条语句里完成;分析报表的原生 SQL 通道遇到这种范围主动让给引擎通道,`/analytics/sql` 试运行回显对主从对象改为响亮拒绝;Turso 远程端补上两级链;ADR-0055 与 ADR-0139 按裁决逐句更正。\n\n**为什么改:** HotCRM 规模下主记录超过约 3.3 万条时,子对象读取直接 500(SQL 变量数超限),且每次请求扫两遍主表。切换后一条语句、不随主表增长,实测 3.3 万主记录返回 200 且行集正确;16 个仪表盘小组件在 SQLite 上总耗时为切换前的 75%。\n\n**风险与代价(含回滚):** 行集实测不变(普通、受限、全部可见、两级链、空外键、悬空外键、无主对象读权限);一处代理读取的行集按已裁定的「子对象跟随主对象的代理读取」变宽(上文 Deviation 2,该主记录本来就对该调用者可见),请你拍板是否接受;唯一可见变化是试运行回显改为拒绝。回滚是一次 revert;#25144 的启动期拒绝独立成立。\n\n**席位意见:** (留空)\n\n**你要做的:** 本 PR 触及 `docs/adr/**`(Tier H),需要你的批准后由席位落地;并请对 Deviation 2 表态。\n\n---\n_Generated by [Claude Code](https://claude.ai/code/session_01UnHcTADjeg3VwxF21QHj7W)_\n","created_at":"2026-10-22T09:15:23Z","updated_at":"2026-10-22T09:19:00Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0e489271a8f86d1e19459e4b356b8bde83027ce0","assignees":[{"login":"os-bill","id":324100929,"node_id":"U_kgDOE1FjQQ","avatar_url":"https://avatars.githubusercontent.com/u/324100929?v=4","gravatar_id":"","url":"https://api.github.com/users/os-bill","html_url":"https://github.com/os-bill","followers_url":"https://api.github.com/users/os-bill/followers","following_url":"https://api.github.com/users/os-bill/following{/other_user}","gists_url":"https://api.github.com/users/os-bill/gists{/gist_id}","starred_url":"https://api.github.com/users/os-bill/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/os-bill/subscriptions","organizations_url":"https://api.github.com/users/os-bill/orgs","repos_url":"https://api.github.com/users/os-bill/repos","events_url":"https://api.github.com/users/os-bill/events{/privacy}","received_events_url":"https://api.github.com/users/os-bill/received_events","type":"User","user_view_type":"public","site_admin":false}],"requested_reviewers":[{"login":"hotlong","id":50353452,"node_id":"MDQ6VXNlcjUwMzUzNDUy","avatar_url":"https://avatars.githubusercontent.com/u/50353452?v=4","gravatar_id":"","url":"https://api.github.com/users/hotlong","html_url":"https://github.com/hotlong","followers_url":"https://api.github.com/users/hotlong/followers","following_url":"https://api.github.com/users/hotlong/following{/other_user}","gists_url":"https://api.github.com/users/hotlong/gists{/gist_id}","starred_url":"https://api.github.com/users/hotlong/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hotlong/subscriptions","organizations_url":"https://api.github.com/users/hotlong/orgs","repos_url":"https://api.github.com/users/hotlong/repos","events_url":"https://api.github.com/users/hotlong/events{/privacy}","received_events_url":"https://api.github.com/users/hotlong/received_events","type":"User","user_view_type":"public","site_admin":false}],"requested_teams":[],"labels":[{"id":10014765799,"node_id":"LA_kwDOQ8CKns8AAAACVO0y5w","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/documentation","name":"documentation","color":"0075ca","default":true,"description":"Improvements or additions to documentation","archived_at":null,"archived_by":null},{"id":10022036516,"node_id":"LA_kwDOQ8CKns8AAAACVVwkJA","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/size/xl","name":"size/xl","color":"ededed","default":false,"description":null,"archived_at":null,"archived_by":null},{"id":10026189828,"node_id":"LA_kwDOQ8CKns8AAAACVZuEBA","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/tests","name":"tests","color":"ededed","default":false,"description":null,"archived_at":null,"archived_by":null},{"id":10037531260,"node_id":"LA_kwDOQ8CKns8AAAACVkiSfA","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/tooling","name":"tooling","color":"ededed","default":false,"description":null,"archived_at":null,"archived_by":null},{"id":11886364921,"node_id":"LA_kwDOQ8CKns8AAAACxHuI-Q","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/protocol:data","name":"protocol:data","color":"ededed","default":false,"description":null,"archived_at":null,"archived_by":null}],"milestone":null,"draft":true,"commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25198/commits","review_comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25198/comments","review_comment_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/comments{/number}","comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/25198/comments","statuses_url":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/2b988305db70d3e67fb374cd50a723d11fb594d7","head":{"label":"objectstack-ai:claude/issue-24932-cbp-leaf-switch","ref":"claude/issue-24932-cbp-leaf-switch","sha":"2b988305db70d3e67fb374cd50a723d11fb594d7","user":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":1136691870,"node_id":"R_kgDOQ8CKng","name":"objectstack","full_name":"objectstack-ai/objectstack","private":false,"owner":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/objectstack-ai/objectstack","description":"The ontology is the software. One executable business ontology: AI writes it, the runtime runs it, agents operate it, you own it. Open protocol & runtime, Apache-2.0.","fork":false,"url":"https://api.github.com/repos/objectstack-ai/objectstack","forks_url":"https://api.github.com/repos/objectstack-ai/objectstack/forks","keys_url":"https://api.github.com/repos/objectstack-ai/objectstack/keys{/key_id}","collaborators_url":"https://api.github.com/repos/objectstack-ai/objectstack/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/objectstack-ai/objectstack/teams","hooks_url":"https://api.github.com/repos/objectstack-ai/objectstack/hooks","issue_events_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/events{/number}","events_url":"https://api.github.com/repos/objectstack-ai/objectstack/events","assignees_url":"https://api.github.com/repos/objectstack-ai/objectstack/assignees{/user}","branches_url":"https://api.github.com/repos/objectstack-ai/objectstack/branches{/branch}","tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/tags","blobs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/refs{/sha}","trees_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/trees{/sha}","statuses_url":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/{sha}","languages_url":"https://api.github.com/repos/objectstack-ai/objectstack/languages","stargazers_url":"https://api.github.com/repos/objectstack-ai/objectstack/stargazers","contributors_url":"https://api.github.com/repos/objectstack-ai/objectstack/contributors","subscribers_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscribers","subscription_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscription","commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/commits{/sha}","git_commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/commits{/sha}","comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/comments{/number}","issue_comment_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/comments{/number}","contents_url":"https://api.github.com/repos/objectstack-ai/objectstack/contents/{+path}","compare_url":"https://api.github.com/repos/objectstack-ai/objectstack/compare/{base}...{head}","merges_url":"https://api.github.com/repos/objectstack-ai/objectstack/merges","archive_url":"https://api.github.com/repos/objectstack-ai/objectstack/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/objectstack-ai/objectstack/downloads","issues_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues{/number}","pulls_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls{/number}","milestones_url":"https://api.github.com/repos/objectstack-ai/objectstack/milestones{/number}","notifications_url":"https://api.github.com/repos/objectstack-ai/objectstack/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/objectstack-ai/objectstack/labels{/name}","releases_url":"https://api.github.com/repos/objectstack-ai/objectstack/releases{/id}","deployments_url":"https://api.github.com/repos/objectstack-ai/objectstack/deployments","created_at":"2026-01-18T06:47:54Z","updated_at":"2026-10-22T09:57:09Z","pushed_at":"2026-10-22T09:57:07Z","git_url":"git://github.com/objectstack-ai/objectstack.git","ssh_url":"git@github.com:objectstack-ai/objectstack.git","clone_url":"https://github.com/objectstack-ai/objectstack.git","svn_url":"https://github.com/objectstack-ai/objectstack","homepage":"https://objectstack.ai","size":754868,"stargazers_count":76,"watchers_count":76,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":false,"has_wiki":true,"has_pages":false,"has_discussions":true,"forks_count":18,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":120,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"has_pull_requests":true,"pull_request_creation_policy":"all","topics":["business-ontology","fde","fde-enablement","metadata-driven","ontology","ontology-driven-development","ontology-engineering","ontology-native","palantir","palantir-alternative","palantir-fde","palantir-foundry","palantir-ontology","salesforce-alternative"],"visibility":"public","forks":18,"open_issues":120,"watchers":76,"default_branch":"main"}},"base":{"label":"objectstack-ai:main","ref":"main","sha":"a1e51d6442b1111d3519e3cb6314125d5b4f5e67","user":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":1136691870,"node_id":"R_kgDOQ8CKng","name":"objectstack","full_name":"objectstack-ai/objectstack","private":false,"owner":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/objectstack-ai/objectstack","description":"The ontology is the software. One executable business ontology: AI writes it, the runtime runs it, agents operate it, you own it. Open protocol & runtime, Apache-2.0.","fork":false,"url":"https://api.github.com/repos/objectstack-ai/objectstack","forks_url":"https://api.github.com/repos/objectstack-ai/objectstack/forks","keys_url":"https://api.github.com/repos/objectstack-ai/objectstack/keys{/key_id}","collaborators_url":"https://api.github.com/repos/objectstack-ai/objectstack/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/objectstack-ai/objectstack/teams","hooks_url":"https://api.github.com/repos/objectstack-ai/objectstack/hooks","issue_events_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/events{/number}","events_url":"https://api.github.com/repos/objectstack-ai/objectstack/events","assignees_url":"https://api.github.com/repos/objectstack-ai/objectstack/assignees{/user}","branches_url":"https://api.github.com/repos/objectstack-ai/objectstack/branches{/branch}","tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/tags","blobs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/refs{/sha}","trees_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/trees{/sha}","statuses_url":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/{sha}","languages_url":"https://api.github.com/repos/objectstack-ai/objectstack/languages","stargazers_url":"https://api.github.com/repos/objectstack-ai/objectstack/stargazers","contributors_url":"https://api.github.com/repos/objectstack-ai/objectstack/contributors","subscribers_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscribers","subscription_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscription","commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/commits{/sha}","git_commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/commits{/sha}","comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/comments{/number}","issue_comment_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/comments{/number}","contents_url":"https://api.github.com/repos/objectstack-ai/objectstack/contents/{+path}","compare_url":"https://api.github.com/repos/objectstack-ai/objectstack/compare/{base}...{head}","merges_url":"https://api.github.com/repos/objectstack-ai/objectstack/merges","archive_url":"https://api.github.com/repos/objectstack-ai/objectstack/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/objectstack-ai/objectstack/downloads","issues_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues{/number}","pulls_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls{/number}","milestones_url":"https://api.github.com/repos/objectstack-ai/objectstack/milestones{/number}","notifications_url":"https://api.github.com/repos/objectstack-ai/objectstack/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/objectstack-ai/objectstack/labels{/name}","releases_url":"https://api.github.com/repos/objectstack-ai/objectstack/releases{/id}","deployments_url":"https://api.github.com/repos/objectstack-ai/objectstack/deployments","created_at":"2026-01-18T06:47:54Z","updated_at":"2026-10-22T09:57:09Z","pushed_at":"2026-10-22T09:57:07Z","git_url":"git://github.com/objectstack-ai/objectstack.git","ssh_url":"git@github.com:objectstack-ai/objectstack.git","clone_url":"https://github.com/objectstack-ai/objectstack.git","svn_url":"https://github.com/objectstack-ai/objectstack","homepage":"https://objectstack.ai","size":754868,"stargazers_count":76,"watchers_count":76,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":false,"has_wiki":true,"has_pages":false,"has_discussions":true,"forks_count":18,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":120,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"has_pull_requests":true,"pull_request_creation_policy":"all","topics":["business-ontology","fde","fde-enablement","metadata-driven","ontology","ontology-driven-development","ontology-engineering","ontology-native","palantir","palantir-alternative","palantir-fde","palantir-foundry","palantir-ontology","salesforce-alternative"],"visibility":"public","forks":18,"open_issues":120,"watchers":76,"default_branch":"main"}},"_links":{"self":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25198"},"html":{"href":"https://github.com/objectstack-ai/objectstack/pull/25198"},"issue":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/issues/25198"},"comments":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/issues/25198/comments"},"review_comments":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25198/comments"},"review_comment":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25198/commits"},"statuses":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/2b988305db70d3e67fb374cd50a723d11fb594d7"}},"author_association":"CONTRIBUTOR","auto_merge":null,"assignee":{"login":"os-bill","id":324100929,"node_id":"U_kgDOE1FjQQ","avatar_url":"https://avatars.githubusercontent.com/u/324100929?v=4","gravatar_id":"","url":"https://api.github.com/users/os-bill","html_url":"https://github.com/os-bill","followers_url":"https://api.github.com/users/os-bill/followers","following_url":"https://api.github.com/users/os-bill/following{/other_user}","gists_url":"https://api.github.com/users/os-bill/gists{/gist_id}","starred_url":"https://api.github.com/users/os-bill/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/os-bill/subscriptions","organizations_url":"https://api.github.com/users/os-bill/orgs","repos_url":"https://api.github.com/users/os-bill/repos","events_url":"https://api.github.com/users/os-bill/events{/privacy}","received_events_url":"https://api.github.com/users/os-bill/received_events","type":"User","user_view_type":"public","site_admin":false},"active_lock_reason":null},{"url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25197","id":4964789367,"node_id":"PR_kwDOQ8CKns8AAAABJ-ysdw","html_url":"https://github.com/objectstack-ai/objectstack/pull/25197","diff_url":"https://github.com/objectstack-ai/objectstack/pull/25197.diff","patch_url":"https://github.com/objectstack-ai/objectstack/pull/25197.patch","issue_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/25197","number":25197,"state":"open","locked":false,"title":"fix(cli,create-objectstack): scaffolds override uuid below 12.0.0 to ^11.1.1, out of GHSA-w5hq-g745-h8pq","user":{"login":"objectstack-fleet[bot]","id":332303061,"node_id":"BOT_kgDOE86K1Q","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D","html_url":"https://github.com/apps/objectstack-fleet","followers_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/followers","following_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/repos","events_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"body":"Fixes #25174\nClause-②: no\nMetadata-protocol: none\n\n## What this changes\n\nEvery standalone scaffold's npm `overrides` block gains a `uuid` entry that routes every `uuid` edge below 12.0.0 to `^11.1.1`, out of GHSA-w5hq-g745-h8pq (`uuid` below 11.1.1). The scaffolds are the `create-objectstack` blank template, `os init -t app`, `-t plugin` and `-t empty`, and `os create plugin` (standalone).\n\n- `packages/cli/src/commands/init.ts`: two new constants, `SCAFFOLD_UUID_OVERRIDE_SELECTOR` (the npm override key: `uuid@`, a less-than sign, `12.0.0`) and `SCAFFOLD_UUID_OVERRIDE_RANGE` (`^11.1.1`). `SCAFFOLD_NPM_OVERRIDES` is built from them and from `SCAFFOLD_VITEST_RANGE`, so `os init` and `os create` emit it with no other code change.\n- `scripts/sync-scaffold-emission-policy.mjs`: one new `POLICY_STAMPS` row stamps the value into the bundled template from the constant (the same path PR #25173 used for vitest). The field regex now escapes the key, because the selector contains `.`. The self-test fixtures declare the new constant and key, with one new assertion (61 assertions in total).\n- `packages/create-objectstack/src/templates/blank/package.json`: the stamped entry, written by the script's write run.\n- Tests: `packages/cli/test/scaffold-npm-overrides.test.ts` pins the map, the target's floor (at or above the fix for its major) and the selector's bound (the major right above the target). `packages/cli/test/scaffold-emission-policy.e2e.test.ts` (nightly tier) adds a check that the on-ramp, `os init` and `os create` emit the SAME whole `overrides` block. The sync script's `--check` compares values only and cannot see a key spelled differently from the constant.\n- Changeset: `@objectstack/cli` and `create-objectstack`, patch. It includes the one-line fix for existing projects and for other npm consumers.\n\n`@objectstack/rest` is not changed: no route at its level reaches npm consumers (measured below).\n\n## Route measurements (npm 10.9.9 and npm 11.21.1)\n\nMethod: each manifest in its own empty directory under the scratchpad, with a fresh `--cache` per leg, and one install tree at a time. The `@objectstack/*` ranges `^18.0.0` resolve to the published 18.0.0. The `os init` / `os create` manifests were emitted by this tree's source CLI (`bin/run-dev.js`), and the blank template was taken from the tree. `uuid` was read from `node_modules`, then `npm audit --json` was run. Two npm 10 audits and one npm 11 audit hit a registry endpoint error (400 on `audits/quick` after the bulk endpoint failed, and a 503 on `advisories/bulk`). Those were re-run, and only completed audits are counted.\n\n| Route | Manifests | npm 10.9.9 | npm 11.21.1 |\n|---|---|---|---|\n| Baseline (main at b6e870707, with #25173) | blank, init -t app, -t plugin, -t empty | exit 0, `uuid` 8.3.2, audit 9 moderate, all GHSA-w5hq-g745-h8pq | same |\n| Baseline | os create plugin (no `@objectstack/rest` in its closure) | exit 0, no `uuid`, audit 0 | same |\n| A: newer exceljs | n/a | no such release: `latest` is 4.4.0 (2023-10-19), and `4.4.1-prerelease.0` also declares `uuid ^8.3.0` | same |\n| B: `overrides` inside the published `@objectstack/rest` (18.0.0 repacked with `overrides.uuid ^11.1.1`, installed as a dependency) | bare consumer | exit 0, `uuid` 8.3.2, audit 3 moderate (rest, exceljs, uuid): **ignored** | same, **ignored** |\n| C: scaffold `overrides`, selector `uuid@` + less-than `12.0.0` → `^11.1.1` (**chosen**) | blank, init -t app, -t plugin, -t empty | exit 0, `uuid` 11.1.1, audit 0 | same |\n| C | os create plugin | exit 0, no `uuid`, audit 0 (the entry is inert) | same |\n| C': the same with a bare `uuid` key | bare `@objectstack/rest` consumer | exit 0, `uuid` 11.1.1, audit 0 | same |\n| D: replace the dependency (`exceljs` aliased to the `exceljs-community@5.2.1` fork, as a published swap would resolve) | blank; bare consumer | exit 0, no `uuid`, audit 0 | same |\n\nFollow-up on a consumer of the published `@objectstack/rest` 18.0.0, root override as in C or C'. A later `npm install uuid@14` exits 0 under C (declares `^14.0.3`, exceljs keeps 11.1.1), and exits 1 with `EOVERRIDE` under C'. A spec-less `npm install uuid` exits 1 with `EOVERRIDE: Override for uuid@* conflicts with direct dependency` under both. Same on both npm versions. This is why the key is a selector and not bare `uuid`.\n\n**Runtime under route C (H3), measured rather than read from a changelog.** On the installed blank and `os init -t app` trees, on both npm versions, exceljs resolved `uuid` 11.1.1. A buffered write with a `dataBar` rule ran: `CfRuleExtXform.prepare` calls `uuid.v4()`, and the sheet carried 2 generated ids. The streaming `WorkbookWriter` ran, the shape `createXlsxStream` bridges onto HTTP. A buffered `load` ran. `@objectstack/rest`'s own `parseXlsxToRows` read both workbooks back to the expected rows. exceljs calls no other `uuid` export. In the monorepo, the same pairing (exceljs 4.4.0 on `uuid` 11.1.1, through the workspace override) runs the 16 rest test files that touch xlsx: 16 passed, 737 tests.\n\n## Why C, by the four axes\n\n- **Actual business need:** the measured reach is every fresh npm-installed scaffold (9 entries). C closes exactly that reach, and B does not reach it at all. D also closes it for every npm consumer, not only scaffolds.\n- **Long-term soundness:** C uses the mechanism this repo already uses for the same advisory (the workspace's pnpm override, same selector and range), so a scaffold resolves the `uuid` the monorepo's exceljs suites run on. It has a written retirement re-check on the constant. D would move a published runtime dependency onto a fork. The measured candidate is maintained by one person, was created 2026-08-09 and declares `engines.node >=22.12.0`, narrower than `@objectstack/rest`'s `>=22.0.0`. That is a supply-chain decision, not a dependency bump.\n- **Hard for AI to get wrong:** one constant feeds all three scaffolders. The value is stamped, and the key is held equal by the nightly e2e check. Floor and selector pins red when the advisory boundary is left. Both ablations are below.\n- **Startup focus:** no new dependency, and no change to any published package's runtime. It adds one map entry and one stamp row.\n\n## Acceptance notes\n\n- **Residual reach, by design and stated in the changeset:** an npm project that installs `@objectstack/rest` other than through a fresh scaffold still audits GHSA-w5hq-g745-h8pq. This covers projects made before this change and hand-written projects, and the bare consumer measured 3 moderate entries on npm 10.9.9 and 11.21.1. npm reads `overrides` only from the root manifest (route B), so only replacing `exceljs` (route D) reaches them. That choice is raised for the maintainer in the report on #25174, and is not made here.\n- Severity, as each source states it (H4): the `pnpm-workspace.yaml` comment says \"high\". The npm registry's bulk advisory endpoint says `moderate`, with a CVSS 3.1 vector scoring 7.5. `npm audit` in the scaffolds says moderate. GitHub's global advisory API was not readable from this session (403, session-bound).\n- `scripts/sync-scaffold-emission-policy.mjs`'s `devDependencies.vitest` row comment still says the constant holds why the range is `~4.0.0`. The range has been `~4.1.12` since PR #25173. The comment is stale, has no runtime effect and is outside this change. Carrier: none.\n\n## Verification\n\nAll readings are at head `50d7f9c25`, which is this branch with `origin/main` `f7d740376` merged in. The two incoming commits touch `cli` migrate code and `platform-objects` translations, and none of these 6 paths. After the merge: `pnpm install` was unchanged (no lockfile or manifest moved), the non-docs build was 76/76, and `packages/runtime/.objectstack` was cleared.\n\n- `pnpm --filter @objectstack/cli exec vitest run --project unit --maxWorkers=2` under the verify lock: VERDICT command-exit 0, 323 test files passed, 4772 tests passed. The CLI integration tier is left to CI. The one integration-tier file in this diff is in the nightly tier, so it was run on its own: `OS_TEST_TIERS=nightly … vitest run --project integration test/scaffold-emission-policy.e2e.test.ts`, 1 file, 11 tests passed.\n- `pnpm --filter create-objectstack test`: 18 files, 278 tests passed. `pnpm --filter @objectstack/cli typecheck && pnpm --filter create-objectstack typecheck`: VERDICT command-exit 0. The cli `tsc -p tsconfig.test.json --listFiles` lists both edited cli test files.\n- `@objectstack/rest` xlsx export and import tests (the 16 files under `packages/rest/src` that touch xlsx or exceljs): 16 files, 737 tests passed. `@objectstack/rest` is unchanged; these run exceljs on `uuid` 11.1.1 through the workspace override.\n- `node scripts/sync-scaffold-emission-policy.mjs --self-test`: exit 0, 61 assertions. Its `--check` exited 1 on an unstamped key (`overrides.uuid@`… is `\"0.0.0-unstamped\"` but the policy declares `\"^11.1.1\"`). The write run then stamped it (1 value rewritten), and `--check` exited 0.\n- eslint `--no-inline-config` over the 4 changed code files: exit 0. Control-byte scan over the 6 changed files: no hits.\n- **Ablations**, run at `e7cf02f09` with the fix committed first, through `scripts/ablation-replace.mjs` in wrap mode. The later commits change only comments in `init.ts`. The tests import `../src`, so no `dist/` is on their path.\n  1. `SCAFFOLD_UUID_OVERRIDE_RANGE` changed from `^11.1.1` to `^11.1.0` (anchor 1 to 0, blob `827cf1e96177` to `33bed46cc4ef`). Result: `Tests 1 failed | 13 passed (14)`, failing on `admits 11.1.0, below the fix 11.1.1`. Restored: blob equals HEAD, `git diff HEAD` empty.\n  2. `SCAFFOLD_UUID_OVERRIDE_SELECTOR` with its bound moved to `13.0.0` (anchor 1 to 0, blob `827cf1e96177` to `98fd9e5105ca`). Result: unit `1 failed | 13 passed (14)` (`expected 13 to be 12`), and nightly e2e `1 failed | 10 passed (11)` (`npx create-objectstack must emit the shared npm overrides block`). That second failure is the key-spelling drift the stamp script cannot see. Restored: blob equals HEAD, `git diff HEAD` empty.\n- Gates: `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` derived 103 commands over 6 paths, against merge base `f7d740376`. Each ran byte for byte, with its exit code recorded before any pipe: all 103 exited 0. `--ran`: `103 derived, 103 run, 0 NOT-MEASURED, 0 UNRUN`, exit 0. This includes `check:scaffold-emission-policy`, `check:template-version-sync`, `check:cross-package-test-inputs` and `check:pm-dispatch-gates`. `check-governed-merges --branch`: 0 of 6 paths governed, 220 changed lines.\n\n---\n_Generated by [Claude Code](https://claude.ai/code/session_01AFrKwndmrCLtF5V9hNtrw3)_\n","created_at":"2026-10-22T08:59:25Z","updated_at":"2026-10-22T09:05:27Z","closed_at":null,"merged_at":null,"merge_commit_sha":"38a9ee353f6eeaf7b3789cbc339011c558db9280","assignees":[{"login":"os-bill","id":324100929,"node_id":"U_kgDOE1FjQQ","avatar_url":"https://avatars.githubusercontent.com/u/324100929?v=4","gravatar_id":"","url":"https://api.github.com/users/os-bill","html_url":"https://github.com/os-bill","followers_url":"https://api.github.com/users/os-bill/followers","following_url":"https://api.github.com/users/os-bill/following{/other_user}","gists_url":"https://api.github.com/users/os-bill/gists{/gist_id}","starred_url":"https://api.github.com/users/os-bill/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/os-bill/subscriptions","organizations_url":"https://api.github.com/users/os-bill/orgs","repos_url":"https://api.github.com/users/os-bill/repos","events_url":"https://api.github.com/users/os-bill/events{/privacy}","received_events_url":"https://api.github.com/users/os-bill/received_events","type":"User","user_view_type":"public","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":10014765799,"node_id":"LA_kwDOQ8CKns8AAAACVO0y5w","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/documentation","name":"documentation","color":"0075ca","default":true,"description":"Improvements or additions to documentation","archived_at":null,"archived_by":null},{"id":10022066246,"node_id":"LA_kwDOQ8CKns8AAAACVVyYRg","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/dependencies","name":"dependencies","color":"0366d6","default":false,"description":"Pull requests that update a dependency file","archived_at":null,"archived_by":null},{"id":10026046066,"node_id":"LA_kwDOQ8CKns8AAAACVZlScg","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/size/m","name":"size/m","color":"ededed","default":false,"description":null,"archived_at":null,"archived_by":null},{"id":10026189828,"node_id":"LA_kwDOQ8CKns8AAAACVZuEBA","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/tests","name":"tests","color":"ededed","default":false,"description":null,"archived_at":null,"archived_by":null},{"id":10037531260,"node_id":"LA_kwDOQ8CKns8AAAACVkiSfA","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/tooling","name":"tooling","color":"ededed","default":false,"description":null,"archived_at":null,"archived_by":null}],"milestone":null,"draft":true,"commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25197/commits","review_comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25197/comments","review_comment_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/comments{/number}","comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/25197/comments","statuses_url":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/50d7f9c254e0bbdc3b8491d5fc464e358b46f66a","head":{"label":"objectstack-ai:claude/issue-25174-rest-uuid-advisory","ref":"claude/issue-25174-rest-uuid-advisory","sha":"50d7f9c254e0bbdc3b8491d5fc464e358b46f66a","user":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":1136691870,"node_id":"R_kgDOQ8CKng","name":"objectstack","full_name":"objectstack-ai/objectstack","private":false,"owner":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/objectstack-ai/objectstack","description":"The ontology is the software. One executable business ontology: AI writes it, the runtime runs it, agents operate it, you own it. Open protocol & runtime, Apache-2.0.","fork":false,"url":"https://api.github.com/repos/objectstack-ai/objectstack","forks_url":"https://api.github.com/repos/objectstack-ai/objectstack/forks","keys_url":"https://api.github.com/repos/objectstack-ai/objectstack/keys{/key_id}","collaborators_url":"https://api.github.com/repos/objectstack-ai/objectstack/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/objectstack-ai/objectstack/teams","hooks_url":"https://api.github.com/repos/objectstack-ai/objectstack/hooks","issue_events_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/events{/number}","events_url":"https://api.github.com/repos/objectstack-ai/objectstack/events","assignees_url":"https://api.github.com/repos/objectstack-ai/objectstack/assignees{/user}","branches_url":"https://api.github.com/repos/objectstack-ai/objectstack/branches{/branch}","tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/tags","blobs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/refs{/sha}","trees_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/trees{/sha}","statuses_url":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/{sha}","languages_url":"https://api.github.com/repos/objectstack-ai/objectstack/languages","stargazers_url":"https://api.github.com/repos/objectstack-ai/objectstack/stargazers","contributors_url":"https://api.github.com/repos/objectstack-ai/objectstack/contributors","subscribers_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscribers","subscription_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscription","commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/commits{/sha}","git_commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/commits{/sha}","comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/comments{/number}","issue_comment_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/comments{/number}","contents_url":"https://api.github.com/repos/objectstack-ai/objectstack/contents/{+path}","compare_url":"https://api.github.com/repos/objectstack-ai/objectstack/compare/{base}...{head}","merges_url":"https://api.github.com/repos/objectstack-ai/objectstack/merges","archive_url":"https://api.github.com/repos/objectstack-ai/objectstack/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/objectstack-ai/objectstack/downloads","issues_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues{/number}","pulls_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls{/number}","milestones_url":"https://api.github.com/repos/objectstack-ai/objectstack/milestones{/number}","notifications_url":"https://api.github.com/repos/objectstack-ai/objectstack/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/objectstack-ai/objectstack/labels{/name}","releases_url":"https://api.github.com/repos/objectstack-ai/objectstack/releases{/id}","deployments_url":"https://api.github.com/repos/objectstack-ai/objectstack/deployments","created_at":"2026-01-18T06:47:54Z","updated_at":"2026-10-22T09:57:09Z","pushed_at":"2026-10-22T09:57:07Z","git_url":"git://github.com/objectstack-ai/objectstack.git","ssh_url":"git@github.com:objectstack-ai/objectstack.git","clone_url":"https://github.com/objectstack-ai/objectstack.git","svn_url":"https://github.com/objectstack-ai/objectstack","homepage":"https://objectstack.ai","size":754868,"stargazers_count":76,"watchers_count":76,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":false,"has_wiki":true,"has_pages":false,"has_discussions":true,"forks_count":18,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":120,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"has_pull_requests":true,"pull_request_creation_policy":"all","topics":["business-ontology","fde","fde-enablement","metadata-driven","ontology","ontology-driven-development","ontology-engineering","ontology-native","palantir","palantir-alternative","palantir-fde","palantir-foundry","palantir-ontology","salesforce-alternative"],"visibility":"public","forks":18,"open_issues":120,"watchers":76,"default_branch":"main"}},"base":{"label":"objectstack-ai:main","ref":"main","sha":"2069b81c266836fd6d7b52fc5e6679c734bdcd3c","user":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":1136691870,"node_id":"R_kgDOQ8CKng","name":"objectstack","full_name":"objectstack-ai/objectstack","private":false,"owner":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/objectstack-ai/objectstack","description":"The ontology is the software. One executable business ontology: AI writes it, the runtime runs it, agents operate it, you own it. Open protocol & runtime, Apache-2.0.","fork":false,"url":"https://api.github.com/repos/objectstack-ai/objectstack","forks_url":"https://api.github.com/repos/objectstack-ai/objectstack/forks","keys_url":"https://api.github.com/repos/objectstack-ai/objectstack/keys{/key_id}","collaborators_url":"https://api.github.com/repos/objectstack-ai/objectstack/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/objectstack-ai/objectstack/teams","hooks_url":"https://api.github.com/repos/objectstack-ai/objectstack/hooks","issue_events_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/events{/number}","events_url":"https://api.github.com/repos/objectstack-ai/objectstack/events","assignees_url":"https://api.github.com/repos/objectstack-ai/objectstack/assignees{/user}","branches_url":"https://api.github.com/repos/objectstack-ai/objectstack/branches{/branch}","tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/tags","blobs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/refs{/sha}","trees_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/trees{/sha}","statuses_url":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/{sha}","languages_url":"https://api.github.com/repos/objectstack-ai/objectstack/languages","stargazers_url":"https://api.github.com/repos/objectstack-ai/objectstack/stargazers","contributors_url":"https://api.github.com/repos/objectstack-ai/objectstack/contributors","subscribers_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscribers","subscription_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscription","commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/commits{/sha}","git_commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/commits{/sha}","comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/comments{/number}","issue_comment_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/comments{/number}","contents_url":"https://api.github.com/repos/objectstack-ai/objectstack/contents/{+path}","compare_url":"https://api.github.com/repos/objectstack-ai/objectstack/compare/{base}...{head}","merges_url":"https://api.github.com/repos/objectstack-ai/objectstack/merges","archive_url":"https://api.github.com/repos/objectstack-ai/objectstack/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/objectstack-ai/objectstack/downloads","issues_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues{/number}","pulls_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls{/number}","milestones_url":"https://api.github.com/repos/objectstack-ai/objectstack/milestones{/number}","notifications_url":"https://api.github.com/repos/objectstack-ai/objectstack/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/objectstack-ai/objectstack/labels{/name}","releases_url":"https://api.github.com/repos/objectstack-ai/objectstack/releases{/id}","deployments_url":"https://api.github.com/repos/objectstack-ai/objectstack/deployments","created_at":"2026-01-18T06:47:54Z","updated_at":"2026-10-22T09:57:09Z","pushed_at":"2026-10-22T09:57:07Z","git_url":"git://github.com/objectstack-ai/objectstack.git","ssh_url":"git@github.com:objectstack-ai/objectstack.git","clone_url":"https://github.com/objectstack-ai/objectstack.git","svn_url":"https://github.com/objectstack-ai/objectstack","homepage":"https://objectstack.ai","size":754868,"stargazers_count":76,"watchers_count":76,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":false,"has_wiki":true,"has_pages":false,"has_discussions":true,"forks_count":18,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":120,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"has_pull_requests":true,"pull_request_creation_policy":"all","topics":["business-ontology","fde","fde-enablement","metadata-driven","ontology","ontology-driven-development","ontology-engineering","ontology-native","palantir","palantir-alternative","palantir-fde","palantir-foundry","palantir-ontology","salesforce-alternative"],"visibility":"public","forks":18,"open_issues":120,"watchers":76,"default_branch":"main"}},"_links":{"self":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25197"},"html":{"href":"https://github.com/objectstack-ai/objectstack/pull/25197"},"issue":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/issues/25197"},"comments":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/issues/25197/comments"},"review_comments":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25197/comments"},"review_comment":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25197/commits"},"statuses":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/50d7f9c254e0bbdc3b8491d5fc464e358b46f66a"}},"author_association":"CONTRIBUTOR","auto_merge":null,"assignee":{"login":"os-bill","id":324100929,"node_id":"U_kgDOE1FjQQ","avatar_url":"https://avatars.githubusercontent.com/u/324100929?v=4","gravatar_id":"","url":"https://api.github.com/users/os-bill","html_url":"https://github.com/os-bill","followers_url":"https://api.github.com/users/os-bill/followers","following_url":"https://api.github.com/users/os-bill/following{/other_user}","gists_url":"https://api.github.com/users/os-bill/gists{/gist_id}","starred_url":"https://api.github.com/users/os-bill/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/os-bill/subscriptions","organizations_url":"https://api.github.com/users/os-bill/orgs","repos_url":"https://api.github.com/users/os-bill/repos","events_url":"https://api.github.com/users/os-bill/events{/privacy}","received_events_url":"https://api.github.com/users/os-bill/received_events","type":"User","user_view_type":"public","site_admin":false},"active_lock_reason":null},{"url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25196","id":4964754141,"node_id":"PR_kwDOQ8CKns8AAAABJ-wi3Q","html_url":"https://github.com/objectstack-ai/objectstack/pull/25196","diff_url":"https://github.com/objectstack-ai/objectstack/pull/25196.diff","patch_url":"https://github.com/objectstack-ai/objectstack/pull/25196.patch","issue_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/25196","number":25196,"state":"open","locked":false,"title":"fix(cli): os init -t plugin ships a starter test, so a fresh scaffold's npm test passes","user":{"login":"objectstack-fleet[bot]","id":332303061,"node_id":"BOT_kgDOE86K1Q","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D","html_url":"https://github.com/apps/objectstack-fleet","followers_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/followers","following_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/repos","events_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"body":"Part of #25175\nClause-②: no\nMetadata-protocol: none\n\n**This PR ships the `os init -t plugin` half of #25175. The `os create plugin` half is not in it.** That half cannot land without editing three public docs pages. Those pages are outside the file surface the dispatch declared, and the dispatch says to stop on a breach of it. The section \"Why `os create plugin` is not here\" below covers what that half needs and which option it takes. When that half lands on this branch, the seat changes the first line from \"Part of\" to the closing-keyword form.\n\n## What changes\n\n`os init NAME -t plugin` declared `\"test\": \"vitest run\"` and emitted no test file, so a fresh project's `npm test` exited 1 with `No test files found, exiting with code 1`. The template now emits one starter test, `package.test.ts`, next to `objectstack.config.ts`:\n\n- It imports the package's stack. That runs `defineStack()`, whose strict parse is the protocol's own refusal path, so a definition another stack would refuse fails the file before any test runs.\n- It asserts that the stack declares itself a `plugin` and contains every object that the `src/objects` barrel exports.\n- Its header links the documented harness for engine-level tests (`@objectstack/verify`, the \"Plugin Testing\" section of `protocol/kernel/plugin-spec`).\n\nThe `test` script stays `vitest run` (run mode, which does not watch).\n\nFiles: `packages/cli/src/commands/init.ts` (`TEMPLATES.plugin.srcFiles` only), the new pin `packages/cli/test/scaffold-test-script-passes.test.ts`, and `.changeset/25175-plugin-scaffold-test.md` (`@objectstack/cli` patch). `SCAFFOLD_ALLOWED_PEER_VERSIONS`, `SCAFFOLD_NPM_OVERRIDES` and `SCAFFOLD_VITEST_RANGE` are untouched.\n\n## The route, and why it is honest\n\nThe card allows two routes: one meaningful starter test, or a test script that does not fail on an empty suite. This PR takes the first.\n\n- **Not `--passWithNoTests`.** It turns \"nothing ran\" into exit 0, which is the very state the card describes, and it would also hide a misnamed test file or a broken glob. The pin below counts the tests that ran, so it fails on that route too.\n- **Not a placeholder.** I checked that the emitted test can fail on a real defect, on a real emission in a scratch project:\n  - with the config's `objects:` key emptied, it fails with `AssertionError: expected [] to include 'probe_pkg_item'`;\n  - with an undeclared key in `manifest:`, the file fails to load with `StackSchemaInvalidError: defineStack validation failed ... Unrecognized key(s) on this package manifest`.\n- **Not an engine boot.** The blank template's test boots the stack with `@objectstack/verify`. That is the documented style, and I measured it on a `-t plugin` emission: exit 0, `Test Files 1 passed`, the engine refused an item saved without its required `name`, about 30 s of wall in-repo. It was not chosen for three reasons:\n  - It needs `@objectstack/verify` declared as a devDependency. That package is already in the install closure through `@objectstack/cli@18.0.0`, so the declaration adds no package.\n  - It needs a `vitest.config.ts` for the boot's hook timeout, console intercept and registry log level. That file would be a second copy of the blank template's, free to drift from it.\n  - Its pin would run a stack boot in Test Core.\n\n  The shape chosen is the example the dispatch's H1 gives: the package loads and declares what the scaffold wrote. The test asserts what the package declares. It does not assert `required: true`, which would only restate a declaration rather than show it is enforced.\n\n## Measured end to end (npm 10.9.4, registry `@objectstack/*` 18.0.0, vitest 4.1.12)\n\nScaffolded with this branch's `bin/run-dev.js`, then `npx -y npm@10 install` in a scratch directory with a scratch npm cache:\n\n| `os init e2e-pkg -t plugin` | exit | reading |\n|:---|:---:|:---|\n| `npm test` | 0 | `Test Files  1 passed (1)`, `Tests  1 passed (1)`, 736 ms |\n| `npm test` with `package.test.ts` removed (baseline) | 1 | `No test files found, exiting with code 1` |\n| `npm run typecheck` | 0 | |\n| `npm run build` (`objectstack compile`) | 0 | `dist/objectstack.json` |\n| `npm run validate` | 0 | `Validation passed` |\n| `npm run lint` | 0 | `All checks passed` |\n\n## The pin, and its ablation\n\n`test/scaffold-test-script-passes.test.ts` (`unit` tier):\n\n- It takes every `os init` template whose emitted manifest declares a `test` script (today `plugin`) and renders it through `init`'s own renderers.\n- It writes the project under the OS temp directory, outside the repository. vitest looks for a config file in the project directory and in every parent, so a project nested in `packages/cli` would run under `packages/cli/vitest.config.ts`. I measured that it did. A case asserts that no ancestor of the sandbox carries a vitest or vite config.\n- It symlinks each declared dependency to the copy this package resolves.\n- It runs the emitted script with a JSON reporter added. It asserts exit 0, zero failed tests, at least one passed test, and that the files which ran are exactly the shipped test files.\n- **Control:** the same project with its shipped tests deleted must fail. That is the defect's own signature.\n\nAblation (one-off, through `scripts/ablation-replace.mjs` with a proven restore; `init.ts` is imported by relative source specifier, so no `dist/` is on the path):\n\n| mutation | result |\n|:---|:---|\n| emitted key `'package.test.ts'` renamed to `'package.ts'` | red: `` `os init -t plugin` declares a test script and emits no test file: expected 0 to be greater than 0 `` |\n| shipped assertion `toBe('plugin')` changed to `toBe('app')` | red: `` `vitest run` in a fresh `os init -t plugin` project: package.test.ts > this package is a plugin that hands every object in src/objects to the stack: AssertionError: expected 'plugin' to be 'app' `` |\n| after each run | restored: blob equals HEAD `3dff72ee5d0a`, `git diff HEAD` empty |\n\n`scaffold-emission-typechecks.test.ts` already compiles every `srcFiles` entry under the shipped `tsconfig.json`, so the new test's type layer is covered there.\n\n## Why `os create plugin` is not here\n\n`create-plugin-docs-parity.test.ts` holds the file tree printed on `content/docs/plugins/index.mdx`, `content/docs/protocol/kernel/index.mdx` and `content/docs/protocol/kernel/plugin-spec.mdx` equal to the emitted file set. Any starter test file therefore needs a listing line on each of those pages. They are outside the declared surface.\n\nI measured the options on a real `os create plugin e2e` scaffold (npm 10.9.4). The baseline `npm test` exits 1 with `No test files found`, and its `test` script is bare `vitest`, which watches in a terminal.\n\n| placement | `npm test` | after `npm run build` | `typecheck` covers the test |\n|:---|:---|:---|:---|\n| S1 `src/index.test.ts`, tsconfig unchanged | exit 0, 1 file | `tsc` emits `dist/index.test.js` and `.d.ts`; vitest 4's default `exclude` is only `node_modules` and `.git`, so `Test Files  2 passed (2)` | yes |\n| S2 `src/index.test.ts` plus `tsconfig.build.json` (extends `tsconfig.json`, excludes `src/**/*.test.ts`), build `tsc -p tsconfig.build.json` | exit 0, 1 file | `dist/` holds `index.js` and `index.d.ts` only; still 1 file | yes: a planted type error in the test fails `typecheck` with TS2322 |\n| S3 `test/index.test.ts` | exit 0 | clean | no: with `rootDir: 'src'`, including it fails with TS6059, under `--noEmit` too |\n| S4 `vitest run --passWithNoTests` | exit 0, nothing ran | | |\n\nS2 is the shape I recommend. The test inside it can use `PluginSchema` from `@objectstack/spec/kernel`, the contract both kernels run at `use()`, and assert `name` and `init`, which the kernel loader requires. The `test` script becomes `vitest run`, as in `-t plugin`.\n\nThat half touches `create.ts` (the plugin scaffold), the three docs listings, this pin (extended to `os create` templates) and the changeset.\n\n## Verification (head `88a38f333`, after merging `origin/main` `f7d740376`)\n\n- `pnpm --filter '@objectstack/cli...' build`: exit 0.\n- New pin plus every existing pin that sweeps the `os init` templates (17 files: `scaffold-emission-typechecks`, `init-template-comments-self-contained`, `init-scaffold-authoring-rules`, `init-scaffold-file-name-registry-parity`, `init`, `scaffold-manifest-schema`, `scaffold-npm-overrides`, `scaffold-object-declaration-shape`, `scaffold-workspace-consistency`, `starter-field-consumers`, `init-manifest-id`, `scaffold-ci-script-parity`, `create-objectstack-wiring-parity`, `vitest-tiers-partition`, `create`, `create-plugin-docs-parity`): `Test Files 17 passed (17)`, `Tests 268 passed (268)`.\n- `@objectstack/cli` `unit` tier, full: `Test Files 324 passed (324)`, `Tests 4775 passed (4775)`, lock verdict `command-exit 0`. The `integration` tier is declared to CI, because the diff touches no spawn entry and no integration-tier file.\n- `pnpm --filter @objectstack/cli typecheck`: exit 0 (`tsc --noEmit`; the test layer `check:test-typecheck` passes with no new error signatures).\n- Gates: all 69 families from `dispatch-gates.mjs --commands` (paths derived from merge base `f7d740376`), plus `check:template-version-sync`, exit 0. That includes `check:scaffold-emission-policy`, `check:template-version-sync`, `check:cli-test-child-env`, `check:cross-package-test-inputs`, `check:test-source-alias`, `check:doc-authoring` and `check:nul-bytes`. Two of them, `check:dual-build-cjs-loads` and `check:i18n-coverage`, first exited 3 with `PREREQUISITE NOT MET`: packages outside the CLI's closure had no `dist/`. Both exit 0 once those packages are built. `--ran` reconciliation: 69 derived, 69 run, 0 NOT-MEASURED, 0 UNRUN, and the zero is derived from the recorded exit codes.\n\n## Acceptance notes\n\n- **The new pin's wall.** Its four tests take about 4.7 s. Importing `init.ts` takes about 15 s, a cost every `os init` pin already pays. Locally the file reads about 20 s against the 10 s per-file line, which the timing report flags without failing anything.\n- **`os init` without a NAME overwrites existing files.** It scaffolds into the current directory and overwrites any existing file at a template path. Only the empty wired barrels are written where no file exists. `package.test.ts` joins the overwritten set, beside `src/objects/index.ts` and the item object, which were already in it. This is an observation from reading the code, not a measured reach. Carrier: none.\n\n---\n_Generated by [Claude Code](https://claude.ai/code/session_01AFrKwndmrCLtF5V9hNtrw3)_\n","created_at":"2026-10-22T08:56:28Z","updated_at":"2026-10-22T09:02:04Z","closed_at":null,"merged_at":null,"merge_commit_sha":"75dab335585f6316b4bfdc1d501193970459553f","assignees":[{"login":"os-bill","id":324100929,"node_id":"U_kgDOE1FjQQ","avatar_url":"https://avatars.githubusercontent.com/u/324100929?v=4","gravatar_id":"","url":"https://api.github.com/users/os-bill","html_url":"https://github.com/os-bill","followers_url":"https://api.github.com/users/os-bill/followers","following_url":"https://api.github.com/users/os-bill/following{/other_user}","gists_url":"https://api.github.com/users/os-bill/gists{/gist_id}","starred_url":"https://api.github.com/users/os-bill/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/os-bill/subscriptions","organizations_url":"https://api.github.com/users/os-bill/orgs","repos_url":"https://api.github.com/users/os-bill/repos","events_url":"https://api.github.com/users/os-bill/events{/privacy}","received_events_url":"https://api.github.com/users/os-bill/received_events","type":"User","user_view_type":"public","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":10014765799,"node_id":"LA_kwDOQ8CKns8AAAACVO0y5w","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/documentation","name":"documentation","color":"0075ca","default":true,"description":"Improvements or additions to documentation","archived_at":null,"archived_by":null},{"id":10026046066,"node_id":"LA_kwDOQ8CKns8AAAACVZlScg","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/size/m","name":"size/m","color":"ededed","default":false,"description":null,"archived_at":null,"archived_by":null},{"id":10026189828,"node_id":"LA_kwDOQ8CKns8AAAACVZuEBA","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/tests","name":"tests","color":"ededed","default":false,"description":null,"archived_at":null,"archived_by":null},{"id":10037531260,"node_id":"LA_kwDOQ8CKns8AAAACVkiSfA","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/tooling","name":"tooling","color":"ededed","default":false,"description":null,"archived_at":null,"archived_by":null}],"milestone":null,"draft":true,"commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25196/commits","review_comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25196/comments","review_comment_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/comments{/number}","comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/25196/comments","statuses_url":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/88a38f333c8ef60bca003e44b5415eb385060fae","head":{"label":"objectstack-ai:claude/issue-25175-plugin-scaffold-test","ref":"claude/issue-25175-plugin-scaffold-test","sha":"88a38f333c8ef60bca003e44b5415eb385060fae","user":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":1136691870,"node_id":"R_kgDOQ8CKng","name":"objectstack","full_name":"objectstack-ai/objectstack","private":false,"owner":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/objectstack-ai/objectstack","description":"The ontology is the software. One executable business ontology: AI writes it, the runtime runs it, agents operate it, you own it. Open protocol & runtime, Apache-2.0.","fork":false,"url":"https://api.github.com/repos/objectstack-ai/objectstack","forks_url":"https://api.github.com/repos/objectstack-ai/objectstack/forks","keys_url":"https://api.github.com/repos/objectstack-ai/objectstack/keys{/key_id}","collaborators_url":"https://api.github.com/repos/objectstack-ai/objectstack/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/objectstack-ai/objectstack/teams","hooks_url":"https://api.github.com/repos/objectstack-ai/objectstack/hooks","issue_events_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/events{/number}","events_url":"https://api.github.com/repos/objectstack-ai/objectstack/events","assignees_url":"https://api.github.com/repos/objectstack-ai/objectstack/assignees{/user}","branches_url":"https://api.github.com/repos/objectstack-ai/objectstack/branches{/branch}","tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/tags","blobs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/refs{/sha}","trees_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/trees{/sha}","statuses_url":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/{sha}","languages_url":"https://api.github.com/repos/objectstack-ai/objectstack/languages","stargazers_url":"https://api.github.com/repos/objectstack-ai/objectstack/stargazers","contributors_url":"https://api.github.com/repos/objectstack-ai/objectstack/contributors","subscribers_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscribers","subscription_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscription","commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/commits{/sha}","git_commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/commits{/sha}","comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/comments{/number}","issue_comment_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/comments{/number}","contents_url":"https://api.github.com/repos/objectstack-ai/objectstack/contents/{+path}","compare_url":"https://api.github.com/repos/objectstack-ai/objectstack/compare/{base}...{head}","merges_url":"https://api.github.com/repos/objectstack-ai/objectstack/merges","archive_url":"https://api.github.com/repos/objectstack-ai/objectstack/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/objectstack-ai/objectstack/downloads","issues_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues{/number}","pulls_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls{/number}","milestones_url":"https://api.github.com/repos/objectstack-ai/objectstack/milestones{/number}","notifications_url":"https://api.github.com/repos/objectstack-ai/objectstack/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/objectstack-ai/objectstack/labels{/name}","releases_url":"https://api.github.com/repos/objectstack-ai/objectstack/releases{/id}","deployments_url":"https://api.github.com/repos/objectstack-ai/objectstack/deployments","created_at":"2026-01-18T06:47:54Z","updated_at":"2026-10-22T09:57:09Z","pushed_at":"2026-10-22T09:57:07Z","git_url":"git://github.com/objectstack-ai/objectstack.git","ssh_url":"git@github.com:objectstack-ai/objectstack.git","clone_url":"https://github.com/objectstack-ai/objectstack.git","svn_url":"https://github.com/objectstack-ai/objectstack","homepage":"https://objectstack.ai","size":754868,"stargazers_count":76,"watchers_count":76,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":false,"has_wiki":true,"has_pages":false,"has_discussions":true,"forks_count":18,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":120,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"has_pull_requests":true,"pull_request_creation_policy":"all","topics":["business-ontology","fde","fde-enablement","metadata-driven","ontology","ontology-driven-development","ontology-engineering","ontology-native","palantir","palantir-alternative","palantir-fde","palantir-foundry","palantir-ontology","salesforce-alternative"],"visibility":"public","forks":18,"open_issues":120,"watchers":76,"default_branch":"main"}},"base":{"label":"objectstack-ai:main","ref":"main","sha":"2069b81c266836fd6d7b52fc5e6679c734bdcd3c","user":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":1136691870,"node_id":"R_kgDOQ8CKng","name":"objectstack","full_name":"objectstack-ai/objectstack","private":false,"owner":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/objectstack-ai/objectstack","description":"The ontology is the software. One executable business ontology: AI writes it, the runtime runs it, agents operate it, you own it. Open protocol & runtime, Apache-2.0.","fork":false,"url":"https://api.github.com/repos/objectstack-ai/objectstack","forks_url":"https://api.github.com/repos/objectstack-ai/objectstack/forks","keys_url":"https://api.github.com/repos/objectstack-ai/objectstack/keys{/key_id}","collaborators_url":"https://api.github.com/repos/objectstack-ai/objectstack/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/objectstack-ai/objectstack/teams","hooks_url":"https://api.github.com/repos/objectstack-ai/objectstack/hooks","issue_events_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/events{/number}","events_url":"https://api.github.com/repos/objectstack-ai/objectstack/events","assignees_url":"https://api.github.com/repos/objectstack-ai/objectstack/assignees{/user}","branches_url":"https://api.github.com/repos/objectstack-ai/objectstack/branches{/branch}","tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/tags","blobs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/refs{/sha}","trees_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/trees{/sha}","statuses_url":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/{sha}","languages_url":"https://api.github.com/repos/objectstack-ai/objectstack/languages","stargazers_url":"https://api.github.com/repos/objectstack-ai/objectstack/stargazers","contributors_url":"https://api.github.com/repos/objectstack-ai/objectstack/contributors","subscribers_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscribers","subscription_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscription","commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/commits{/sha}","git_commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/commits{/sha}","comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/comments{/number}","issue_comment_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/comments{/number}","contents_url":"https://api.github.com/repos/objectstack-ai/objectstack/contents/{+path}","compare_url":"https://api.github.com/repos/objectstack-ai/objectstack/compare/{base}...{head}","merges_url":"https://api.github.com/repos/objectstack-ai/objectstack/merges","archive_url":"https://api.github.com/repos/objectstack-ai/objectstack/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/objectstack-ai/objectstack/downloads","issues_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues{/number}","pulls_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls{/number}","milestones_url":"https://api.github.com/repos/objectstack-ai/objectstack/milestones{/number}","notifications_url":"https://api.github.com/repos/objectstack-ai/objectstack/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/objectstack-ai/objectstack/labels{/name}","releases_url":"https://api.github.com/repos/objectstack-ai/objectstack/releases{/id}","deployments_url":"https://api.github.com/repos/objectstack-ai/objectstack/deployments","created_at":"2026-01-18T06:47:54Z","updated_at":"2026-10-22T09:57:09Z","pushed_at":"2026-10-22T09:57:07Z","git_url":"git://github.com/objectstack-ai/objectstack.git","ssh_url":"git@github.com:objectstack-ai/objectstack.git","clone_url":"https://github.com/objectstack-ai/objectstack.git","svn_url":"https://github.com/objectstack-ai/objectstack","homepage":"https://objectstack.ai","size":754868,"stargazers_count":76,"watchers_count":76,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":false,"has_wiki":true,"has_pages":false,"has_discussions":true,"forks_count":18,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":120,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"has_pull_requests":true,"pull_request_creation_policy":"all","topics":["business-ontology","fde","fde-enablement","metadata-driven","ontology","ontology-driven-development","ontology-engineering","ontology-native","palantir","palantir-alternative","palantir-fde","palantir-foundry","palantir-ontology","salesforce-alternative"],"visibility":"public","forks":18,"open_issues":120,"watchers":76,"default_branch":"main"}},"_links":{"self":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25196"},"html":{"href":"https://github.com/objectstack-ai/objectstack/pull/25196"},"issue":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/issues/25196"},"comments":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/issues/25196/comments"},"review_comments":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25196/comments"},"review_comment":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25196/commits"},"statuses":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/88a38f333c8ef60bca003e44b5415eb385060fae"}},"author_association":"CONTRIBUTOR","auto_merge":null,"assignee":{"login":"os-bill","id":324100929,"node_id":"U_kgDOE1FjQQ","avatar_url":"https://avatars.githubusercontent.com/u/324100929?v=4","gravatar_id":"","url":"https://api.github.com/users/os-bill","html_url":"https://github.com/os-bill","followers_url":"https://api.github.com/users/os-bill/followers","following_url":"https://api.github.com/users/os-bill/following{/other_user}","gists_url":"https://api.github.com/users/os-bill/gists{/gist_id}","starred_url":"https://api.github.com/users/os-bill/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/os-bill/subscriptions","organizations_url":"https://api.github.com/users/os-bill/orgs","repos_url":"https://api.github.com/users/os-bill/repos","events_url":"https://api.github.com/users/os-bill/events{/privacy}","received_events_url":"https://api.github.com/users/os-bill/received_events","type":"User","user_view_type":"public","site_admin":false},"active_lock_reason":null},{"url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25192","id":4964697899,"node_id":"PR_kwDOQ8CKns8AAAABJ-tHKw","html_url":"https://github.com/objectstack-ai/objectstack/pull/25192","diff_url":"https://github.com/objectstack-ai/objectstack/pull/25192.diff","patch_url":"https://github.com/objectstack-ai/objectstack/pull/25192.patch","issue_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/25192","number":25192,"state":"open","locked":false,"title":"fix(spec)!: refuse an object's `external` binding on a managed datasource (ADR-0015 §4.2)","user":{"login":"objectstack-fleet[bot]","id":332303061,"node_id":"BOT_kgDOE86K1Q","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D","html_url":"https://github.com/apps/objectstack-fleet","followers_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/followers","following_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/repos","events_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"body":"<!-- claude-projects-attribution: {\"github_login\":\"os-bill\"} -->\n_Requested by **Bill** · [project thread](https://claude.ai/code/project/chan_016iMXWSZDzqWRWvWzdNo8wg?thread=cmsg_016iMXWSZDzqWRWvWzdNo8wg6zwDuV2XvoDkqC7bXgqnpc)_\n\nFixes #25168\n\nClause-②: no (narrowing)\nMetadata-protocol: narrowed\n\n## What\n\nADR-0015 §4.2 allows `object.external` only on a datasource whose `schemaMode` is not `'managed'`, and declares the rule \"enforced at metadata-load time\". No load door enforced it. This PR makes the spec judge it, once, through one predicate (`packages/spec/src/data/external-binding-datasource.ts`, internal), at each door that can see the halves it needs. This follows the route in triage comment 6333828054: a declaration rule at the parse, inherited by the save door and `os validate`, and no second check in `packages/objectql`.\n\n| The object's `datasource` | Where it is judged | Answer now |\n|---|---|---|\n| omitted or `'default'` (the primary, managed by construction) | `ObjectSchema`'s parse (superRefine), at `external` | `ObjectSchema.create` throws at module load. `defineStack` and `os validate` give `STACK_SCHEMA_INVALID` (422) at `objects.N.external`. `PUT /api/v1/meta/object/NAME` gives `422 INVALID_METADATA` with the finding at `external`, and nothing is stored. |\n| a datasource the same stack declares with `schemaMode: 'managed'` or with no `schemaMode` | `defineStack`'s cross-reference pass (`validateCrossReferences`) | `STACK_CROSS_REFERENCE_INVALID` (422), one finding per bound object. `os validate` and `os build` inherit it. |\n| a datasource declared `schemaMode: 'external'` or `'validate-only'` | (both doors) | accepted, as before |\n| a datasource the stack does not declare | no door can see its `schemaMode` | no verdict, as before (see Acceptance notes) |\n\nA package `defaultDatasource` or a `datasourceMapping` rule does not count as the object's datasource. They route queries, while the boot validation (`validateObjectUsing`) and the write gate (`assertWriteAllowed`) read only the object's own `datasource`. The refusal message says so.\n\nADR-0087 kit: the semantic entry `object-external-binding-managed-datasource-refused` (`packages/spec/src/migrations/entries/semantic/`), and a `REFUSED_STORED_SHAPES` detector that lists each stored object in the refused shape for `os migrate meta --stored` (no lossless rewrite: dropping `external` would turn the remote table into one ObjectStack creates). The changeset carries the `registered` disposition, `minor`, BREAKING with FROM and TO, and the one-line fix.\n\n## Measured on the base (b6e870707), before any edit\n\n- `defineStack` accepted all six probe stacks: datasource omitted, `'default'`, declared `managed`, declared with no `schemaMode`, declared `external` (control), and undeclared.\n- `os validate` answered `valid: true`, exit 0, for both a declared-`managed` and a no-`schemaMode` datasource. This was the card's first NOT MEASURED reading.\n- The object save door stored all three probes (datasource omitted, `'default'`, and a stored managed datasource named `wh`) and answered success. Each save logged the platform's own \"published but its storage was NOT created\" warning. This was the card's second NOT MEASURED reading.\n\n## After this PR (same probes)\n\n- `defineStack`: managed and no-`schemaMode` give `STACK_CROSS_REFERENCE_INVALID` 422. Omitted and `'default'` give `STACK_SCHEMA_INVALID` 422. The `external` control and the undeclared datasource are accepted.\n- `os validate`: exit 1, `valid: false`, with those codes and messages.\n- Save door: `422 INVALID_METADATA` at `external` for omitted and `'default'`, and nothing is stored. A named stored datasource still saves; see Acceptance notes.\n\n## Producers (the stop condition)\n\n- In the repo, outside tests and including `examples/**`, the only object with `external` is the showcase's, and it is compliant: `showcase_external` is declared `schemaMode: 'external'`.\n- Templates, CLI scaffolds and published skills have none.\n- The Sync/import producer is gone since #25167, which was already merged when this branch was cut.\n- HotCRM at c8a7a7047 has none.\n\nNo producer was found, so no conversion question applies.\n\n## Tests\n\n- `packages/spec/src/data/external-binding-datasource.test.ts`: the parse refuses at `['external']` (code `custom`) for datasource omitted, `'default'`, and an empty binding. `ObjectSchema.create` throws with the same issue. Controls and the predicate's unit cases.\n- `packages/spec/src/stack-external-binding-datasource.test.ts`: `code` + `status` for both stack verdicts, one finding per bound object, the `external` and `validate-only` controls, an undeclared datasource accepted, `strict: false` skips, and a manifest `defaultDatasource` does not count.\n- `packages/spec/src/conversions/refused-shapes.test.ts`: the stored-row detector lists each object.\n- `packages/metadata-protocol/src/protocol.external-binding-primary-datasource-refusal.test.ts`: the save door answers `INVALID_METADATA` 422, issues at `external`, and stores nothing; controls save.\n- `packages/spec/src/data/object-strictness-batch20.test.ts`: four fixtures bound `external` with no datasource. They now name their federated datasource (`remote_crm`), per fixture triage (add the missing declaration).\n\nAblation, one time, on 488c2fe49:\n- The mutation made the predicate answer nothing, which drops all three halves at once. It was checked on disk (grep of the injected text in the source, and in 12 built `.mjs` files), and `@objectstack/spec` was rebuilt.\n- Under the mutation, the three spec files went red, 16 failed of 76, and the save-door file went red, 2 failed of 4 (exactly the two refusal cases).\n- The source was restored with `git checkout HEAD`, and the restore was proved by comparing blob hashes (equal to HEAD) and by an empty `git diff HEAD`. `@objectstack/spec` was then rebuilt with declarations, and the mutation is in 0 dist files.\n- After the restore, the spec files pass 76 of 76 and the save-door file passes 4 of 4.\n\nFull `@objectstack/spec` suite on 03234e2d: 780 files passed and 1 skipped; 22737 tests passed, 1 skipped, 1 todo. The next commit, 488c2fe49, only narrows the assertions in two of the new test files, and those files pass 76 of 76 on it.\n\n## Acceptance notes\n\n- **The save door cannot see a named datasource's `schemaMode`.** `PUT /api/v1/meta/object/NAME` with `datasource: 'wh'`, where `wh` is a stored managed datasource, plus `external`, still saves (measured on this head). The spec parse sees only the object. The minimal place is the metadata-protocol object save door, calling this same predicate with the datasource it resolves, so the rule is not copied. That needs the predicate exported and is outside this card's file surface. Raised in the report as an open question.\n- **Not covered here, also noted in the report:** the `composeStacks` artifact pass (it does not re-run `validateCrossReferences`); the reverse direction (saving a datasource as `managed` while objects bind it with `external`); and the `/* ... */` example in `content/docs` external-datasources §5, which should show the object's `datasource`.\n- **Runtime fixtures not rewritten.** 62 fixtures in 37 test files across 12 packages hand an object with `external` and no datasource straight to a driver, the engine or a lint rule, without the parse. Those suites are green on this head. They describe a shape the parse now refuses, but they test runtime behaviour that a stored legacy row can still reach: such a row still registers under `[metadata_spec_invalid]`. They were left as they are.\n- **File surface.** `scripts/engine-double-contract.pinned.json` gains 15 rows from `node scripts/check-engine-double-contract.mjs --write`, for the save-door test's engine double. It is a mechanical ledger row, as in #25181 and #25122.\n- **Branch name.** The branch is the session's designated `claude/project-thread-5h4pzn`, not `claude/issue-25168-…`. The claim names it.\n\n---\n_Generated by [Claude Code](https://claude.ai/code/session_013dX1BHfcVSJNSkfA6cvwJN)_\n","created_at":"2026-10-22T08:51:44Z","updated_at":"2026-10-22T08:52:54Z","closed_at":null,"merged_at":null,"merge_commit_sha":"bd5c592d83901111f90d46de241455900e567eb9","assignees":[{"login":"os-bill","id":324100929,"node_id":"U_kgDOE1FjQQ","avatar_url":"https://avatars.githubusercontent.com/u/324100929?v=4","gravatar_id":"","url":"https://api.github.com/users/os-bill","html_url":"https://github.com/os-bill","followers_url":"https://api.github.com/users/os-bill/followers","following_url":"https://api.github.com/users/os-bill/following{/other_user}","gists_url":"https://api.github.com/users/os-bill/gists{/gist_id}","starred_url":"https://api.github.com/users/os-bill/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/os-bill/subscriptions","organizations_url":"https://api.github.com/users/os-bill/orgs","repos_url":"https://api.github.com/users/os-bill/repos","events_url":"https://api.github.com/users/os-bill/events{/privacy}","received_events_url":"https://api.github.com/users/os-bill/received_events","type":"User","user_view_type":"public","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":10014765799,"node_id":"LA_kwDOQ8CKns8AAAACVO0y5w","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/documentation","name":"documentation","color":"0075ca","default":true,"description":"Improvements or additions to documentation","archived_at":null,"archived_by":null},{"id":10021979845,"node_id":"LA_kwDOQ8CKns8AAAACVVtGxQ","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/size/l","name":"size/l","color":"ededed","default":false,"description":null,"archived_at":null,"archived_by":null},{"id":10026189828,"node_id":"LA_kwDOQ8CKns8AAAACVZuEBA","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/tests","name":"tests","color":"ededed","default":false,"description":null,"archived_at":null,"archived_by":null},{"id":10037531260,"node_id":"LA_kwDOQ8CKns8AAAACVkiSfA","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/tooling","name":"tooling","color":"ededed","default":false,"description":null,"archived_at":null,"archived_by":null},{"id":11886364921,"node_id":"LA_kwDOQ8CKns8AAAACxHuI-Q","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/protocol:data","name":"protocol:data","color":"ededed","default":false,"description":null,"archived_at":null,"archived_by":null}],"milestone":null,"draft":true,"commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25192/commits","review_comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25192/comments","review_comment_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/comments{/number}","comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/25192/comments","statuses_url":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/488c2fe49d4fbb2786a141e2628bc6e99ffbf402","head":{"label":"objectstack-ai:claude/project-thread-5h4pzn","ref":"claude/project-thread-5h4pzn","sha":"488c2fe49d4fbb2786a141e2628bc6e99ffbf402","user":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":1136691870,"node_id":"R_kgDOQ8CKng","name":"objectstack","full_name":"objectstack-ai/objectstack","private":false,"owner":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/objectstack-ai/objectstack","description":"The ontology is the software. One executable business ontology: AI writes it, the runtime runs it, agents operate it, you own it. Open protocol & runtime, Apache-2.0.","fork":false,"url":"https://api.github.com/repos/objectstack-ai/objectstack","forks_url":"https://api.github.com/repos/objectstack-ai/objectstack/forks","keys_url":"https://api.github.com/repos/objectstack-ai/objectstack/keys{/key_id}","collaborators_url":"https://api.github.com/repos/objectstack-ai/objectstack/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/objectstack-ai/objectstack/teams","hooks_url":"https://api.github.com/repos/objectstack-ai/objectstack/hooks","issue_events_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/events{/number}","events_url":"https://api.github.com/repos/objectstack-ai/objectstack/events","assignees_url":"https://api.github.com/repos/objectstack-ai/objectstack/assignees{/user}","branches_url":"https://api.github.com/repos/objectstack-ai/objectstack/branches{/branch}","tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/tags","blobs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/refs{/sha}","trees_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/trees{/sha}","statuses_url":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/{sha}","languages_url":"https://api.github.com/repos/objectstack-ai/objectstack/languages","stargazers_url":"https://api.github.com/repos/objectstack-ai/objectstack/stargazers","contributors_url":"https://api.github.com/repos/objectstack-ai/objectstack/contributors","subscribers_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscribers","subscription_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscription","commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/commits{/sha}","git_commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/commits{/sha}","comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/comments{/number}","issue_comment_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/comments{/number}","contents_url":"https://api.github.com/repos/objectstack-ai/objectstack/contents/{+path}","compare_url":"https://api.github.com/repos/objectstack-ai/objectstack/compare/{base}...{head}","merges_url":"https://api.github.com/repos/objectstack-ai/objectstack/merges","archive_url":"https://api.github.com/repos/objectstack-ai/objectstack/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/objectstack-ai/objectstack/downloads","issues_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues{/number}","pulls_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls{/number}","milestones_url":"https://api.github.com/repos/objectstack-ai/objectstack/milestones{/number}","notifications_url":"https://api.github.com/repos/objectstack-ai/objectstack/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/objectstack-ai/objectstack/labels{/name}","releases_url":"https://api.github.com/repos/objectstack-ai/objectstack/releases{/id}","deployments_url":"https://api.github.com/repos/objectstack-ai/objectstack/deployments","created_at":"2026-01-18T06:47:54Z","updated_at":"2026-10-22T09:57:09Z","pushed_at":"2026-10-22T09:57:07Z","git_url":"git://github.com/objectstack-ai/objectstack.git","ssh_url":"git@github.com:objectstack-ai/objectstack.git","clone_url":"https://github.com/objectstack-ai/objectstack.git","svn_url":"https://github.com/objectstack-ai/objectstack","homepage":"https://objectstack.ai","size":754868,"stargazers_count":76,"watchers_count":76,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":false,"has_wiki":true,"has_pages":false,"has_discussions":true,"forks_count":18,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":120,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"has_pull_requests":true,"pull_request_creation_policy":"all","topics":["business-ontology","fde","fde-enablement","metadata-driven","ontology","ontology-driven-development","ontology-engineering","ontology-native","palantir","palantir-alternative","palantir-fde","palantir-foundry","palantir-ontology","salesforce-alternative"],"visibility":"public","forks":18,"open_issues":120,"watchers":76,"default_branch":"main"}},"base":{"label":"objectstack-ai:main","ref":"main","sha":"2069b81c266836fd6d7b52fc5e6679c734bdcd3c","user":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":1136691870,"node_id":"R_kgDOQ8CKng","name":"objectstack","full_name":"objectstack-ai/objectstack","private":false,"owner":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/objectstack-ai/objectstack","description":"The ontology is the software. One executable business ontology: AI writes it, the runtime runs it, agents operate it, you own it. Open protocol & runtime, Apache-2.0.","fork":false,"url":"https://api.github.com/repos/objectstack-ai/objectstack","forks_url":"https://api.github.com/repos/objectstack-ai/objectstack/forks","keys_url":"https://api.github.com/repos/objectstack-ai/objectstack/keys{/key_id}","collaborators_url":"https://api.github.com/repos/objectstack-ai/objectstack/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/objectstack-ai/objectstack/teams","hooks_url":"https://api.github.com/repos/objectstack-ai/objectstack/hooks","issue_events_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/events{/number}","events_url":"https://api.github.com/repos/objectstack-ai/objectstack/events","assignees_url":"https://api.github.com/repos/objectstack-ai/objectstack/assignees{/user}","branches_url":"https://api.github.com/repos/objectstack-ai/objectstack/branches{/branch}","tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/tags","blobs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/refs{/sha}","trees_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/trees{/sha}","statuses_url":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/{sha}","languages_url":"https://api.github.com/repos/objectstack-ai/objectstack/languages","stargazers_url":"https://api.github.com/repos/objectstack-ai/objectstack/stargazers","contributors_url":"https://api.github.com/repos/objectstack-ai/objectstack/contributors","subscribers_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscribers","subscription_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscription","commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/commits{/sha}","git_commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/commits{/sha}","comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/comments{/number}","issue_comment_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/comments{/number}","contents_url":"https://api.github.com/repos/objectstack-ai/objectstack/contents/{+path}","compare_url":"https://api.github.com/repos/objectstack-ai/objectstack/compare/{base}...{head}","merges_url":"https://api.github.com/repos/objectstack-ai/objectstack/merges","archive_url":"https://api.github.com/repos/objectstack-ai/objectstack/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/objectstack-ai/objectstack/downloads","issues_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues{/number}","pulls_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls{/number}","milestones_url":"https://api.github.com/repos/objectstack-ai/objectstack/milestones{/number}","notifications_url":"https://api.github.com/repos/objectstack-ai/objectstack/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/objectstack-ai/objectstack/labels{/name}","releases_url":"https://api.github.com/repos/objectstack-ai/objectstack/releases{/id}","deployments_url":"https://api.github.com/repos/objectstack-ai/objectstack/deployments","created_at":"2026-01-18T06:47:54Z","updated_at":"2026-10-22T09:57:09Z","pushed_at":"2026-10-22T09:57:07Z","git_url":"git://github.com/objectstack-ai/objectstack.git","ssh_url":"git@github.com:objectstack-ai/objectstack.git","clone_url":"https://github.com/objectstack-ai/objectstack.git","svn_url":"https://github.com/objectstack-ai/objectstack","homepage":"https://objectstack.ai","size":754868,"stargazers_count":76,"watchers_count":76,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":false,"has_wiki":true,"has_pages":false,"has_discussions":true,"forks_count":18,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":120,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"has_pull_requests":true,"pull_request_creation_policy":"all","topics":["business-ontology","fde","fde-enablement","metadata-driven","ontology","ontology-driven-development","ontology-engineering","ontology-native","palantir","palantir-alternative","palantir-fde","palantir-foundry","palantir-ontology","salesforce-alternative"],"visibility":"public","forks":18,"open_issues":120,"watchers":76,"default_branch":"main"}},"_links":{"self":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25192"},"html":{"href":"https://github.com/objectstack-ai/objectstack/pull/25192"},"issue":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/issues/25192"},"comments":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/issues/25192/comments"},"review_comments":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25192/comments"},"review_comment":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25192/commits"},"statuses":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/488c2fe49d4fbb2786a141e2628bc6e99ffbf402"}},"author_association":"CONTRIBUTOR","auto_merge":null,"assignee":{"login":"os-bill","id":324100929,"node_id":"U_kgDOE1FjQQ","avatar_url":"https://avatars.githubusercontent.com/u/324100929?v=4","gravatar_id":"","url":"https://api.github.com/users/os-bill","html_url":"https://github.com/os-bill","followers_url":"https://api.github.com/users/os-bill/followers","following_url":"https://api.github.com/users/os-bill/following{/other_user}","gists_url":"https://api.github.com/users/os-bill/gists{/gist_id}","starred_url":"https://api.github.com/users/os-bill/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/os-bill/subscriptions","organizations_url":"https://api.github.com/users/os-bill/orgs","repos_url":"https://api.github.com/users/os-bill/repos","events_url":"https://api.github.com/users/os-bill/events{/privacy}","received_events_url":"https://api.github.com/users/os-bill/received_events","type":"User","user_view_type":"public","site_admin":false},"active_lock_reason":null},{"url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25184","id":4963503280,"node_id":"PR_kwDOQ8CKns8AAAABJ9kMsA","html_url":"https://github.com/objectstack-ai/objectstack/pull/25184","diff_url":"https://github.com/objectstack-ai/objectstack/pull/25184.diff","patch_url":"https://github.com/objectstack-ai/objectstack/pull/25184.patch","issue_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/25184","number":25184,"state":"open","locked":false,"title":"fix(plugin-auth): an organization-delete read that fails refuses 503 before better-auth's first write","user":{"login":"objectstack-fleet[bot]","id":332303061,"node_id":"BOT_kgDOE86K1Q","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D","html_url":"https://github.com/apps/objectstack-fleet","followers_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/followers","following_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/repos","events_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"body":"Fixes #25059\n\nClause-②: no\nMetadata-protocol: none\n\nWhy `Clause-②: no`: the refusal replaces an outcome only a failed store read produces, and the typed 503 replaces a bare 500 fault; no request a caller can make is answered differently.\n\n## What changed\n\n`AuthManager.assertOrganizationDeletable`, the `POST /organization/delete` admission in better-auth's global `hooks.before`:\n\n- **A failed session read refuses as well.** `resolveActor` answered a failed session read with `null`, the value \"no session\" gives, so the admission fell through. It takes an opt-in `failedReadThrows` option now. With it, when no actor was resolved and the explicit token read itself threw, that throw propagates, and the admission answers it with the same typed `503`. No credential, a credential the store does not hold, an expired session, a credential that does not parse, and one carrying a control character all still answer `null`, so they reach better-auth's `401`. Only the admission passes the option. The other nine `this.resolveActor(ctx)` call sites are byte-identical in the diff.\n- **A read it decides on that fails now refuses.** A failed read of the caller's `sys_member` row or of the `sys_organization` row used to land in `catch { return; }` and hand the request to better-auth, which re-reads, then clears the session's active organization, then deletes the members and invitations, and only then meets the engine's refusal at the organization row. It now answers `503` with the standard ADR-0112 code `SERVICE_UNAVAILABLE`, before better-auth's first write.\n- **A failed Default Organization decision answers the same typed `503`.** It already refused before any write, but with a bare `Error`, which better-auth serves as an untyped 500.\n- **The vendor-decided cases still fall through, unchanged:** no actor, no member row, not permitted, no organization row.\n- The wire pieces sit beside the 409's in `organization-delete.ts`: `ORGANIZATION_DELETE_READ_FAULT_CODE` and `organizationDeleteReadFaultBody(object)`. The body names the table it could not read. The driver's own error rides `cause` and is not relayed. Two names were added to the existing `organization-delete.js` import list in `auth-manager.ts`; nothing else outside the method moved.\n\n## The four mechanism assumptions, re-measured on this branch\n\n1. **The lookup block.** Measured: it holds four lookups, but `resolveActor` cannot throw. Both of its paths catch, and it answers `null`, the same value as \"no session\". So of the four, three can throw into the catch: the `sys_member` read, `hasPermission` and the `sys_organization` read.\n2. **The Default Organization decision answers 500.** Measured by ablation A2 below: with this change reverted to main's bare propagation, the pin reads `expected 500 to be 503`.\n3. **Which status and code.** `503 SERVICE_UNAVAILABLE`: the vocabulary this file already uses for a read fault (the organization slug guard, the invitation role cap and the invitation placement check), a `StandardErrorCode`, so the error-code ledger needs no row. `check:dispatcher-error-vocabulary` ran green (Verification below).\n4. **Can `hasPermission` throw for a decidable vendor answer?** Yes, and only for that. better-auth 1.7.12 `plugins/organization/has-permission.mjs` reaches the adapter only behind `options.dynamicAccessControl?.enabled`, and the admission hands it the roles map alone, so the call reads nothing. It throws only on the member row itself: a role that is not a string (`role.split`), or a role name that resolves to an inherited object member (`authorize` is not a function). better-auth's `deleteOrganization` calls the identical predicate (the same roles object: `organizationOptions.roles` is the `customOrgRoles` the admission holds as `orgRolesMap`) on the same row, before `setActiveOrganization`. So that throw keeps falling through, and a pin holds that nothing is attempted when it does.\n\n## The session read\n\nThe card names `resolveActor` among the lookups that throw. Measured: it never threw. Both of its paths catch and answer `null`, so a failed session read read as \"no actor\" and fell through. An uncommitted scratch test failed only the admission's own session reads while better-auth's stayed real; it got `200`, and better-auth's session update and member and organization deletes ran with nothing counted.\n\n`resolveActor(ctx, { failedReadThrows: true })` now tells the two apart. It is used by the admission alone, and the default reading is unchanged for the other nine callers.\n\nOnly the explicit token read counts as a failed read. Two things are deliberately not counted:\n- the first path's throw, when the second path finds no token;\n- a failure reading a token that carries a control character. PostgreSQL refuses U+0000 in a text parameter, and a crafted cookie can carry `%00`. Counting it would turn that request's `401` into a `503`.\n\n## Pins\n\n`packages/plugins/plugin-auth/src/organization-delete-read-fault.test.ts`. Real `ObjectQL` over `@objectstack/driver-sql` and better-sqlite3, the manifest's objects, a real `AuthManager` with the organization plugin (the `session-read-failure-answer.test.ts` harness).\n\n- **One case per read that can fail:** the caller's session read (both of `resolveActor`'s paths fail inside the admission's call, fired 2), the caller's `sys_member` read, the `sys_organization` read, and the Default Organization decision's count. The admission's own read fails once, scoped to the admission's frame, so better-auth's reads of the same table stay real. Each case asserts `503`, `SERVICE_UNAVAILABLE` and the table named. It also asserts that no write was attempted: the session update and the member, invitation and organization deletes are recorded by engine hooks when attempted, not when committed. Then a CONTROL: with the read back, the same delete answers `200` and the organization is gone.\n- **What still falls through:** a request with no session gets better-auth's `401`, with nothing attempted. A credential carrying a control character gets the same `401`, with nothing attempted, even while the admission's read of it fails.\n- **The `hasPermission` fall-through:** a stored member row whose role is null reaches better-auth, which refuses before its first write. Nothing is attempted, and the answer is not the admission's `503`.\n\n### Ablations\n\nA1 to A3 ran at `947ab6c25` (before the merge of `main`); A4 and A5 at `5884148db`, the final head (baseline there `Tests 7 passed (7)`). The test imports `./auth-manager.js` relatively, so the subject resolves to `src/` and no build sits between a mutation and its run. Each mutation was applied with `scripts/ablation-replace.mjs` (the anchor hit once, landed on disk, blob changed), and then restored.\n\n| | mutation | result |\n|---|---|---|\n| baseline | none | `Tests 4 passed (4)` |\n| A1 | the read helper swallows the fault (main's fall-through put back) | the three read pins red, each `expected 200 to be 503`: the request reached better-auth and deleted the organization |\n| A2 | the Default Organization decision propagates bare (main's R3) | its pin red, `expected 500 to be 503`; the other three green |\n| A3 | a `hasPermission` throw refuses `503` instead of falling through | the fall-through pin red, `expected '{\"code\":\"SERVICE_UNAVAILABLE\",…' not to contain 'SERVICE_UNAVAILABLE'` |\n| A4 | `resolveActor` swallows the failed session read again | the session-read pin red, `expected 200 to be 503`: the request reached better-auth and deleted the organization |\n| A5 | the control-character guard removed | the control-character pin red, `expected 503 to be 401` |\n\nRestore after each mutation: blob `f3015ed6f7b0` == HEAD, `git diff HEAD` empty, zero markers on disk, `git status --porcelain` empty.\n\n## Verification\n\n- At the final head `5884148db`, under the lock: `pnpm --filter @objectstack/plugin-auth build` exit 0; `pnpm --filter @objectstack/plugin-auth exec vitest run` gave `Test Files 185 passed (185)`, `Tests 3485 passed | 10 skipped (3495)`; `pnpm --filter @objectstack/plugin-auth typecheck` exit 0 (`check:test-typecheck: OK`, no debt row added); `pnpm check:type-check-debt` exit 0 (`re-measure: OK — 1 ledger entr(ies) re-measured in 190.9s, 26 raw tsc error(s) total, none above its recorded number`). The lock printed `VERDICT command-exit 0`.\n- Gate union at `5884148db`: the 70 commands derived by `node scripts/pm/dispatch-gates.mjs --commands` (the same 70 at `947ab6c25`, `46c61dade` and `5884148db`), plus `check-changeset-fixed` and `check:authz-resolver`, whose rosters sit in a directory this diff touches. Every exit code was captured before any pipe, and all are 0. `--ran`: `70 derived · 70 run · 0 NOT-MEASURED · 0 UNRUN`.\n- The other nine callers: in the diff, the one changed `resolveActor(` line is the admission's; `git grep` counts nine `this.resolveActor(ctx)` call sites, and `failedReadThrows: true` occurs once (`auth-manager.ts:8378`, inside `assertOrganizationDeletable`).\n- Not run locally: the full-farm `check:*` sweep, `pnpm lint`, the dogfood battery (the title carries no `!` and there is no `(narrowing)` arm), and the `packages/qa` dogfood pins. CI runs those; every check-run on `5884148db` succeeded or was skipped.\n\n## Acceptance notes\n\n- The #24948 dogfood pin for a failed Default Organization lookup (`packages/qa/dogfood/test/organization-delete-federated-fixture.dogfood.test.ts:282`) asserts a status of 400 or above. It stays green with `503`. It could be tightened to `503` plus `SERVICE_UNAVAILABLE`. That file is in the `domain:cli` lane and was not edited here.\n- The record count (`organizationDeleteRefusal` / `defaultOrganizationDeleteRefusal`) still propagates a failure bare, as an untyped 500. That is the same family as the Default Organization decision. It is not changed here because what reaches it is not only a store fault: an engine refusal carrying its own code lands there too, so a blanket `503` would mislabel it.\n- A client sees `503 SERVICE_UNAVAILABLE` from an organization delete only when a store read failed. Nothing was deleted then, and a retry is the remedy.\n\n---\n_Generated by [Claude Code](https://claude.ai/code/session_01UnHcTADjeg3VwxF21QHj7W)_\n","created_at":"2026-10-22T07:07:34Z","updated_at":"2026-10-22T09:25:33Z","closed_at":null,"merged_at":null,"merge_commit_sha":"1e11b53d4d792d0fca357b1539037de60f5b9f6e","assignees":[{"login":"os-bill","id":324100929,"node_id":"U_kgDOE1FjQQ","avatar_url":"https://avatars.githubusercontent.com/u/324100929?v=4","gravatar_id":"","url":"https://api.github.com/users/os-bill","html_url":"https://github.com/os-bill","followers_url":"https://api.github.com/users/os-bill/followers","following_url":"https://api.github.com/users/os-bill/following{/other_user}","gists_url":"https://api.github.com/users/os-bill/gists{/gist_id}","starred_url":"https://api.github.com/users/os-bill/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/os-bill/subscriptions","organizations_url":"https://api.github.com/users/os-bill/orgs","repos_url":"https://api.github.com/users/os-bill/repos","events_url":"https://api.github.com/users/os-bill/events{/privacy}","received_events_url":"https://api.github.com/users/os-bill/received_events","type":"User","user_view_type":"public","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":10014765799,"node_id":"LA_kwDOQ8CKns8AAAACVO0y5w","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/documentation","name":"documentation","color":"0075ca","default":true,"description":"Improvements or additions to documentation","archived_at":null,"archived_by":null},{"id":10026046066,"node_id":"LA_kwDOQ8CKns8AAAACVZlScg","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/size/m","name":"size/m","color":"ededed","default":false,"description":null,"archived_at":null,"archived_by":null},{"id":10026189828,"node_id":"LA_kwDOQ8CKns8AAAACVZuEBA","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/tests","name":"tests","color":"ededed","default":false,"description":null,"archived_at":null,"archived_by":null},{"id":10037531260,"node_id":"LA_kwDOQ8CKns8AAAACVkiSfA","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/tooling","name":"tooling","color":"ededed","default":false,"description":null,"archived_at":null,"archived_by":null}],"milestone":null,"draft":true,"commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25184/commits","review_comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25184/comments","review_comment_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/comments{/number}","comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/25184/comments","statuses_url":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/5884148db582551b305da826933d2e2ed099da27","head":{"label":"objectstack-ai:claude/issue-25059-org-delete-lookup-refuses","ref":"claude/issue-25059-org-delete-lookup-refuses","sha":"5884148db582551b305da826933d2e2ed099da27","user":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":1136691870,"node_id":"R_kgDOQ8CKng","name":"objectstack","full_name":"objectstack-ai/objectstack","private":false,"owner":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/objectstack-ai/objectstack","description":"The ontology is the software. One executable business ontology: AI writes it, the runtime runs it, agents operate it, you own it. Open protocol & runtime, Apache-2.0.","fork":false,"url":"https://api.github.com/repos/objectstack-ai/objectstack","forks_url":"https://api.github.com/repos/objectstack-ai/objectstack/forks","keys_url":"https://api.github.com/repos/objectstack-ai/objectstack/keys{/key_id}","collaborators_url":"https://api.github.com/repos/objectstack-ai/objectstack/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/objectstack-ai/objectstack/teams","hooks_url":"https://api.github.com/repos/objectstack-ai/objectstack/hooks","issue_events_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/events{/number}","events_url":"https://api.github.com/repos/objectstack-ai/objectstack/events","assignees_url":"https://api.github.com/repos/objectstack-ai/objectstack/assignees{/user}","branches_url":"https://api.github.com/repos/objectstack-ai/objectstack/branches{/branch}","tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/tags","blobs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/refs{/sha}","trees_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/trees{/sha}","statuses_url":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/{sha}","languages_url":"https://api.github.com/repos/objectstack-ai/objectstack/languages","stargazers_url":"https://api.github.com/repos/objectstack-ai/objectstack/stargazers","contributors_url":"https://api.github.com/repos/objectstack-ai/objectstack/contributors","subscribers_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscribers","subscription_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscription","commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/commits{/sha}","git_commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/commits{/sha}","comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/comments{/number}","issue_comment_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/comments{/number}","contents_url":"https://api.github.com/repos/objectstack-ai/objectstack/contents/{+path}","compare_url":"https://api.github.com/repos/objectstack-ai/objectstack/compare/{base}...{head}","merges_url":"https://api.github.com/repos/objectstack-ai/objectstack/merges","archive_url":"https://api.github.com/repos/objectstack-ai/objectstack/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/objectstack-ai/objectstack/downloads","issues_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues{/number}","pulls_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls{/number}","milestones_url":"https://api.github.com/repos/objectstack-ai/objectstack/milestones{/number}","notifications_url":"https://api.github.com/repos/objectstack-ai/objectstack/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/objectstack-ai/objectstack/labels{/name}","releases_url":"https://api.github.com/repos/objectstack-ai/objectstack/releases{/id}","deployments_url":"https://api.github.com/repos/objectstack-ai/objectstack/deployments","created_at":"2026-01-18T06:47:54Z","updated_at":"2026-10-22T09:57:09Z","pushed_at":"2026-10-22T09:57:07Z","git_url":"git://github.com/objectstack-ai/objectstack.git","ssh_url":"git@github.com:objectstack-ai/objectstack.git","clone_url":"https://github.com/objectstack-ai/objectstack.git","svn_url":"https://github.com/objectstack-ai/objectstack","homepage":"https://objectstack.ai","size":754868,"stargazers_count":76,"watchers_count":76,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":false,"has_wiki":true,"has_pages":false,"has_discussions":true,"forks_count":18,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":120,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"has_pull_requests":true,"pull_request_creation_policy":"all","topics":["business-ontology","fde","fde-enablement","metadata-driven","ontology","ontology-driven-development","ontology-engineering","ontology-native","palantir","palantir-alternative","palantir-fde","palantir-foundry","palantir-ontology","salesforce-alternative"],"visibility":"public","forks":18,"open_issues":120,"watchers":76,"default_branch":"main"}},"base":{"label":"objectstack-ai:main","ref":"main","sha":"b6e870707b95d7b8ee9cedd68ad358b51de0da91","user":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":1136691870,"node_id":"R_kgDOQ8CKng","name":"objectstack","full_name":"objectstack-ai/objectstack","private":false,"owner":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/objectstack-ai/objectstack","description":"The ontology is the software. One executable business ontology: AI writes it, the runtime runs it, agents operate it, you own it. Open protocol & runtime, Apache-2.0.","fork":false,"url":"https://api.github.com/repos/objectstack-ai/objectstack","forks_url":"https://api.github.com/repos/objectstack-ai/objectstack/forks","keys_url":"https://api.github.com/repos/objectstack-ai/objectstack/keys{/key_id}","collaborators_url":"https://api.github.com/repos/objectstack-ai/objectstack/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/objectstack-ai/objectstack/teams","hooks_url":"https://api.github.com/repos/objectstack-ai/objectstack/hooks","issue_events_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/events{/number}","events_url":"https://api.github.com/repos/objectstack-ai/objectstack/events","assignees_url":"https://api.github.com/repos/objectstack-ai/objectstack/assignees{/user}","branches_url":"https://api.github.com/repos/objectstack-ai/objectstack/branches{/branch}","tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/tags","blobs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/refs{/sha}","trees_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/trees{/sha}","statuses_url":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/{sha}","languages_url":"https://api.github.com/repos/objectstack-ai/objectstack/languages","stargazers_url":"https://api.github.com/repos/objectstack-ai/objectstack/stargazers","contributors_url":"https://api.github.com/repos/objectstack-ai/objectstack/contributors","subscribers_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscribers","subscription_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscription","commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/commits{/sha}","git_commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/commits{/sha}","comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/comments{/number}","issue_comment_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/comments{/number}","contents_url":"https://api.github.com/repos/objectstack-ai/objectstack/contents/{+path}","compare_url":"https://api.github.com/repos/objectstack-ai/objectstack/compare/{base}...{head}","merges_url":"https://api.github.com/repos/objectstack-ai/objectstack/merges","archive_url":"https://api.github.com/repos/objectstack-ai/objectstack/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/objectstack-ai/objectstack/downloads","issues_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues{/number}","pulls_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls{/number}","milestones_url":"https://api.github.com/repos/objectstack-ai/objectstack/milestones{/number}","notifications_url":"https://api.github.com/repos/objectstack-ai/objectstack/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/objectstack-ai/objectstack/labels{/name}","releases_url":"https://api.github.com/repos/objectstack-ai/objectstack/releases{/id}","deployments_url":"https://api.github.com/repos/objectstack-ai/objectstack/deployments","created_at":"2026-01-18T06:47:54Z","updated_at":"2026-10-22T09:57:09Z","pushed_at":"2026-10-22T09:57:07Z","git_url":"git://github.com/objectstack-ai/objectstack.git","ssh_url":"git@github.com:objectstack-ai/objectstack.git","clone_url":"https://github.com/objectstack-ai/objectstack.git","svn_url":"https://github.com/objectstack-ai/objectstack","homepage":"https://objectstack.ai","size":754868,"stargazers_count":76,"watchers_count":76,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":false,"has_wiki":true,"has_pages":false,"has_discussions":true,"forks_count":18,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":120,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"has_pull_requests":true,"pull_request_creation_policy":"all","topics":["business-ontology","fde","fde-enablement","metadata-driven","ontology","ontology-driven-development","ontology-engineering","ontology-native","palantir","palantir-alternative","palantir-fde","palantir-foundry","palantir-ontology","salesforce-alternative"],"visibility":"public","forks":18,"open_issues":120,"watchers":76,"default_branch":"main"}},"_links":{"self":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25184"},"html":{"href":"https://github.com/objectstack-ai/objectstack/pull/25184"},"issue":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/issues/25184"},"comments":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/issues/25184/comments"},"review_comments":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25184/comments"},"review_comment":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/25184/commits"},"statuses":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/5884148db582551b305da826933d2e2ed099da27"}},"author_association":"CONTRIBUTOR","auto_merge":null,"assignee":{"login":"os-bill","id":324100929,"node_id":"U_kgDOE1FjQQ","avatar_url":"https://avatars.githubusercontent.com/u/324100929?v=4","gravatar_id":"","url":"https://api.github.com/users/os-bill","html_url":"https://github.com/os-bill","followers_url":"https://api.github.com/users/os-bill/followers","following_url":"https://api.github.com/users/os-bill/following{/other_user}","gists_url":"https://api.github.com/users/os-bill/gists{/gist_id}","starred_url":"https://api.github.com/users/os-bill/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/os-bill/subscriptions","organizations_url":"https://api.github.com/users/os-bill/orgs","repos_url":"https://api.github.com/users/os-bill/repos","events_url":"https://api.github.com/users/os-bill/events{/privacy}","received_events_url":"https://api.github.com/users/os-bill/received_events","type":"User","user_view_type":"public","site_admin":false},"active_lock_reason":null},{"url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/24947","id":4939650676,"node_id":"PR_kwDOQ8CKns8AAAABJm0WdA","html_url":"https://github.com/objectstack-ai/objectstack/pull/24947","diff_url":"https://github.com/objectstack-ai/objectstack/pull/24947.diff","patch_url":"https://github.com/objectstack-ai/objectstack/pull/24947.patch","issue_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/24947","number":24947,"state":"open","locked":false,"title":"feat(spec,lint): a bulk action's confirmText is a template slot over count and its params, judged at validate, compile and the publish gate","user":{"login":"objectstack-fleet[bot]","id":332303061,"node_id":"BOT_kgDOE86K1Q","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D","html_url":"https://github.com/apps/objectstack-fleet","followers_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/followers","following_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/repos","events_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-fleet%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"body":"Fixes #24798\n\nClause-②: yes (widening)\nMetadata-protocol: added\n\nThe spec half of ruling B on the decision card, step 1: a list-view bulk action's `confirmText` becomes an ADR-0032 `template` slot over a closed scope. The scope's roots are `count` and the action's params by name. Its holes are judged at `objectstack validate`, `objectstack compile` and the publish gate by the template judge the flow text slots already use.\n\n## The ruling this executes (comment 6285948976, items 1–2, verbatim)\n\n> 1. `ui/bulk-action.zod.ts:403` `confirmText` becomes a `TemplateExpressionInputSchema` slot (ADR-0032 Decisions 2 and 3): a bare string is shorthand for `{ dialect: 'template', source }`; holes are `{{ path }}` and `{{ path | formatter }}` over the bulk-confirm scope, whose bound roots the spec declares — `count`, the affected-record count, and the action's params by name (the PR fixes the root spelling, `{{ tier }}` or `{{ params.tier }}`, consistent with the flow scope's roots); an unbound root and a single-brace token are refused by name at `objectstack validate`, `compile` and the publish gate through the one judge the flow text slots use (`automation/flow-text-slot-template.ts`); ⛔ no CEL logic inside a hole (an ADR-0032 non-goal); formatters from the existing whitelist.\n> 2. The console fills the slot through the template engine the flow notifications render with: step 1 `{{count}}` now; step 2 the param roots once the spec PR states the display-value rule (option label against stored value for picklists and lookups; number, date and currency via the whitelist). The renderer half is objectstack-ai/objectui#13183, `pm:blocked` on this card until the spec release is installable there (ruling D on #24591).\n\n## What changed\n\n- **The slot.** `bulkActionDefs[].confirmText` (`packages/spec/src/ui/bulk-action.zod.ts`) takes the input `TemplateExpressionInputSchema` takes: a bare string is shorthand for `{ dialect: 'template', source }`, and an envelope must declare `dialect: 'template'`. Like a notify node's `title` / `message`, it is built from the package-internal `templateExpressionInput` constructor, so its refusal prescribes this slot's own hole, `{{ count }}`. The shared `{{record.name}}` would name a root this slot does not bind. A stored sentence with no hole parses as before, its text unchanged.\n- **The declared roots.** `bulkConfirmTemplateRoots(def)` and `BULK_CONFIRM_COUNT_ROOT` (`@objectstack/spec/ui`) return `count`, then each param's `name` in declaration order.\n- **Root spelling: bare (`{{ tier }}`), not `{{ params.tier }}`.** The flow text slots' scope writes its roots bare: a flow variable is `{{ v }}`, a node output `{{ lookup.result }}`, and nothing is namespaced. HotCRM's 12 sentences already write `{{count}}` / `{{tier}}`, and ruling item 3 has them stand unchanged. `count` wins over a param named `count`; such a param stays reachable only through its dialog field.\n- **The display-value rule step 2 waits on**, stated in the slot's `.describe()`. A param hole renders the param's DISPLAY value:\n  - an option-bearing param renders the chosen option's `label`, with a multi-value param's labels joined by `', '`;\n  - a `lookup` or user param renders the picked record's display name;\n  - any other param renders the entered value, so number, date and currency values take a whitelisted formatter (`{{ amount | currency:EUR }}`, `{{ due | date:long }}`).\n\n  A hole holds no logic.\n- **One judge, not a fork.** `packages/spec/src/automation/flow-text-slot-template.ts` gains a closed-scope entry, `closedScopeTemplateRefusal(text, { slot, roots })`. It uses the same single-brace token reader, the same hole grammar and the same root rule as `textSlotTemplateRefusal`; the internals are factored to shared helpers (`pathRoot`, `pathHoles`, a predicate on `doubled`). The flow judge's verdicts and sentences are unchanged, with a control pin. The judge's envelope reader is exported as `templateSlotSource`, so a door reads a template slot the way the judge does.\n- **The doors.** `validateStackExpressions` (`packages/lint/src/validate-expressions.ts`) is the rule `objectstack validate`, `compile` and the publish gate all run. It gains a bulk `confirmText` pass with the same two steps as the flow text slots, in the same order:\n  1. `closedScopeTemplateRefusal` names a single-brace token (with its `{{ }}` rewrite when the root is bound) and a hole over an unbound root;\n  2. a text carrying neither is compiled with `validateExpression('template', …)`, which names logic or an unknown formatter in a hole.\n\n  A blank sentence is named too. The walk covers a view's `list` and `listViews`, a standalone view's flattened list overlay and its ViewItem record (the shapes `PUT /meta/view` stores), and an object's own `listViews`. The publish gate's expression rule now declares `view` in `runtimeTypes`. A view write runs this pass alone, by construction, and an object write also judges its own `listViews`.\n\n## The 「甲」 rule: what passes today, and why every finding is a warning\n\nMeasured on `origin/main` `b42c621c05`: `confirmText` was `z.string().optional()`. Every string passed, including an unbound `{{ x }}`, a single-brace `{x}`, a hole holding logic (`{{ count * 2 }}`) and a blank `''`. Refusing any of them would be a narrowing that no ADR-0087 conversion carries. So, in 18.x:\n\n- every door finding on a bulk `confirmText` is a **warning**, which is an advisory at the publish gate and never a refusal;\n- the parse still accepts a **blank** string, verbatim, as a second union arm (`z.string().regex(/^\\s*$/)`, a `pattern` the JSON Schema carries), while the template arm refuses blank as every template slot does;\n- the refusals wait for protocol 19. That is a follow-up for a 19.0 card: flip these warnings to errors, and drop the blank arm.\n\nThe widening is the envelope form and the declared holes: `Clause-②: yes (widening)`, `minor` for `@objectstack/spec` and `@objectstack/lint`.\n\n## Landing order: read before this leaves draft\n\n⚠️ **Retyping changes the served shape.** A parsed `confirmText` is now `{ dialect: 'template', source }`, not a string (`os compile` serializes the parsed stack, `result.data`, and objectui's own types say so of `visible`: \"the `{ dialect, source }` envelope `objectstack build` emits\"). objectui's bulk dialog renders it as a React child: `def.confirmText ?? t('grid.bulk.confirmDefault', …)` in `plugin-grid/src/components/BulkActionDialog.tsx:412`, with `BulkActionDef.confirmText?: string` hand-declared in `packages/types/src/objectql.ts:680`, objectui `origin/main` `1ca759a16`. So a console that has not learned the envelope breaks the confirm step of every bulk def that carries a `confirmText` (showcase `project.view.ts` has 6). No typecheck catches it, because objectui's member is its own `string` and not derived from the spec. This PR should therefore land only together with, or after, an objectui change that reads `string | { source }` (the shape `formatTitleTemplate` already reads for `titleFormat`) and the pin bump that brings it in. The renderer card is objectstack-ai/objectui#13183, currently `pm:blocked` on this card. It is raised as an open question in the dev report.\n\n## Why `Fixes`, not `Refs`\n\nThe ruling splits the work by repository (ruling D on #24591). This card carries the spec half, and the renderer half is its own card, objectstack-ai/objectui#13183, whose body reads `Blocked-by: objectstack-ai/objectstack#24798`. If this card stayed open until the renderer landed, the renderer card would wait on a card that waits on it. So merging the spec half closes this card. The sibling sweep, #24814, is not addressed here; it stays open and follows serially. The landing-order hazard above is a sequencing condition on merging this PR, not a reason to keep the card open.\n\n## Contract review\n\nThis is a published `@objectstack/spec` schema, so it needs contract review at `CONTRACT_REVIEW_TIER`. The diff touches no governed surface (`.claude/**`, `docs/adr/**`, `AGENTS.md`, `skills/**` and `.github/workflows/**` are all untouched), so it is neither Tier S nor Tier H. It is under 800 changed lines, under the 3000-line human-merge threshold.\n\n## Tests (final head `9fb508c8a0`; spec and lint unchanged since `2a0f011c77`, where their suites ran)\n\n- `pnpm --filter @objectstack/spec test` → `Test Files 704 passed (704)`, `Tests 21379 passed | 1 todo`.\n- `pnpm --filter @objectstack/lint test` → `Test Files 152 passed (152)`, `Tests 7009 passed`.\n- `pnpm --filter @objectstack/dogfood exec vitest run test/expression-conformance.test.ts` → 8 passed. The new slot is discovered and classified (`template-bulk-confirm-text`, `experimental` / `unevaluated`: nothing in this checkout fills the holes yet).\n- `pnpm --filter @objectstack/cli exec vitest run --project unit` on the seven i18n suites that read `confirmText` (`i18n-bulk-action-coverage`, `i18n-coverage`, `i18n-extract`, `i18n-walk-output-parity`, `i18n-declared-surface-gate`, `i18n-duplicate-demand`, `i18n-extract-action-description`) → 100 passed. `pnpm --filter @objectstack/cli typecheck` → OK. The cli `integration` layer is declared to CI.\n- **Ablation** of the extractor fix (`node scripts/ablation-replace.mjs` on `packages/cli/src/utils/i18n-extract.ts`, `templateSlotSource(def.confirmText)` → `def.confirmText`): the blob went `4c0e88d86ced` → `dc3e90d6ba5f`, and the new envelope pin went red (`Tests 1 failed | 17 passed`). The restore leg brought the blob back to HEAD and `git diff HEAD` was empty.\n- `pnpm --filter @objectstack/spec --filter @objectstack/lint typecheck` → both `Done`.\n- `pnpm --filter @objectstack/spec check:generated` → stale `api-surface/`, `export-origins/` and the reference docs, regenerated with `--fix` (exactly the five new exports and the `confirmText` rows).\n- The derived gate battery (`node scripts/pm/dispatch-gates.mjs --commands`, 115 families at `9fb508c8a0`), reconciled with `--ran`: 114 run at exit 0, and 1 NOT MEASURED: `check:dual-build-cjs-loads` exited 3 (prerequisite not met: it loads the BUILT entry of every package, about 90), which is declared to CI. `check:i18n`, `check:i18n-coverage`, `check:i18n-walk-parity` and `check:skill-examples` went green after building the closures they name, and `check:type-check-debt` went green on a run without a timeout wrapper.\n- eslint, narrowed and proven:\n  - population: `eslint.config.mjs` `files: ['**/*.{ts,…}']` minus `NEVER_LINTED`, with `--print-config` confirming each touched file is linted;\n  - `npx eslint --no-inline-config --format json` over the 15 touched TS files → 15 files, 0 errors, 0 warnings;\n  - invariance: the config enables no type-aware linting (no `parserOptions.project`, per its own comment at `eslint.config.mjs:325`), so this diff cannot move a verdict on an untouched file.\n- **Ablation** of the publish-gate widening, done after committing (`node scripts/ablation-replace.mjs` on `packages/lint/src/authoring-rules.ts`, removing `'view'` from `runtimeTypes`): the anchor went 1 → 0 and the blob `37ae7e87aacf` → `82d615ca2df0`. All 3 gate positives in `validate-expressions.bulk-confirm-text.test.ts` went red (`Tests 3 failed | 11 passed`), and the 3 controls stayed green. The restore leg brought the blob back to HEAD and `git diff HEAD` was empty. No `dist` was involved, since lint's own tests read `src`.\n\n## Acceptance notes\n\n- **`os i18n extract` and an envelope-form `confirmText`** (the seat extended the claim to `packages/cli/src/utils/i18n-extract.ts`). `pushBulkActionDefs` now reads the slot through `templateSlotSource(def.confirmText)`, so a `confirmText` written as `{ dialect: 'template', source }` is seeded (`sourceValue` / `inline`) exactly as the bare string. Before this, `authoredEvidence` read a string or an inline locale map only, and the envelope was recorded like an absent key. The new pin is in `packages/cli/test/i18n-bulk-action-coverage.test.ts`.\n- **Translation bundles.** A translated bulk `confirmText` in a bundle (`objects.OBJ._views.VIEW.bulkActions.DEF.confirmText`) is still a plain string, and nothing here judges its holes. Ruling item 1 binds the def's slot, and the bundle side is the sibling sweep's question.\n- **A param named `count`** is shadowed by the count root (documented in the slot and in `bulkConfirmTemplateRoots`). No such param exists in the repository corpus.\n- **Corpus measured** at `b42c621c05`: 6 bulk defs carry a `confirmText` (examples/app-showcase `project.view.ts`), none with a brace, so 0 findings at every door. HotCRM's 12 sentences (`{{count}}`, `{{tier}}`) are pinned clean in both spec and lint tests, the zh-CN form included.\n\nFiles outside the claim's listed paths, each forced by the slot change and named here:\n\n- `packages/spec/src/shared/typed-expression-input.ts`: one docblock line naming the constructor's new caller;\n- `packages/spec/src/ui/component-props-unknown-members.pin.test.ts`: the envelope's `ast` ledgered under `EXPRESSION_AST`, beside `bulkActionDefs[].visible.ast`;\n- `packages/spec/src/ui/action-confirm-params-guard.test.ts`: the parsed value is now the envelope;\n- `packages/qa/dogfood/test/expression-conformance.ledger.ts`: the slot's conformance row;\n- `packages/lint/src/{authoring-rule-wiring,runtime-gate,runtime-gate.page-visibility-predicate-writes,validate-expressions}.test.ts`: the `view` rule lists, and the receiver table of the declared-keys meta-test;\n- `packages/cli/src/utils/i18n-extract.ts` and `packages/cli/test/i18n-bulk-action-coverage.test.ts`: the envelope-form seed and its pin (claim extended by the seat); `.changeset/24798-bulk-confirm-template-slot.md` now also bumps `@objectstack/cli`.\n\n---\n_Generated by [Claude Code](https://claude.ai/code/session_01D6F9axfoPzR7t8G1J7Ytzz)_\n\n","created_at":"2026-10-20T17:22:52Z","updated_at":"2026-10-22T09:05:15Z","closed_at":null,"merged_at":null,"merge_commit_sha":"bf6cb8a972d7ec87f90be6931caa39f9109f0b97","assignees":[{"login":"baozhoutao","id":6194462,"node_id":"MDQ6VXNlcjYxOTQ0NjI=","avatar_url":"https://avatars.githubusercontent.com/u/6194462?v=4","gravatar_id":"","url":"https://api.github.com/users/baozhoutao","html_url":"https://github.com/baozhoutao","followers_url":"https://api.github.com/users/baozhoutao/followers","following_url":"https://api.github.com/users/baozhoutao/following{/other_user}","gists_url":"https://api.github.com/users/baozhoutao/gists{/gist_id}","starred_url":"https://api.github.com/users/baozhoutao/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/baozhoutao/subscriptions","organizations_url":"https://api.github.com/users/baozhoutao/orgs","repos_url":"https://api.github.com/users/baozhoutao/repos","events_url":"https://api.github.com/users/baozhoutao/events{/privacy}","received_events_url":"https://api.github.com/users/baozhoutao/received_events","type":"User","user_view_type":"public","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":10014765799,"node_id":"LA_kwDOQ8CKns8AAAACVO0y5w","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/documentation","name":"documentation","color":"0075ca","default":true,"description":"Improvements or additions to documentation","archived_at":null,"archived_by":null},{"id":10021979845,"node_id":"LA_kwDOQ8CKns8AAAACVVtGxQ","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/size/l","name":"size/l","color":"ededed","default":false,"description":null,"archived_at":null,"archived_by":null},{"id":10026189828,"node_id":"LA_kwDOQ8CKns8AAAACVZuEBA","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/tests","name":"tests","color":"ededed","default":false,"description":null,"archived_at":null,"archived_by":null},{"id":10037531260,"node_id":"LA_kwDOQ8CKns8AAAACVkiSfA","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/tooling","name":"tooling","color":"ededed","default":false,"description":null,"archived_at":null,"archived_by":null},{"id":11885537581,"node_id":"LA_kwDOQ8CKns8AAAACxG7pLQ","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/protocol:ui","name":"protocol:ui","color":"ededed","default":false,"description":null,"archived_at":null,"archived_by":null}],"milestone":null,"draft":true,"commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/24947/commits","review_comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/24947/comments","review_comment_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/comments{/number}","comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/24947/comments","statuses_url":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/84b1e35c8e7fc0fa73aa00c829b757a39485b7ff","head":{"label":"objectstack-ai:claude/issue-24798-bulk-confirm-template-slot","ref":"claude/issue-24798-bulk-confirm-template-slot","sha":"84b1e35c8e7fc0fa73aa00c829b757a39485b7ff","user":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":1136691870,"node_id":"R_kgDOQ8CKng","name":"objectstack","full_name":"objectstack-ai/objectstack","private":false,"owner":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/objectstack-ai/objectstack","description":"The ontology is the software. One executable business ontology: AI writes it, the runtime runs it, agents operate it, you own it. Open protocol & runtime, Apache-2.0.","fork":false,"url":"https://api.github.com/repos/objectstack-ai/objectstack","forks_url":"https://api.github.com/repos/objectstack-ai/objectstack/forks","keys_url":"https://api.github.com/repos/objectstack-ai/objectstack/keys{/key_id}","collaborators_url":"https://api.github.com/repos/objectstack-ai/objectstack/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/objectstack-ai/objectstack/teams","hooks_url":"https://api.github.com/repos/objectstack-ai/objectstack/hooks","issue_events_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/events{/number}","events_url":"https://api.github.com/repos/objectstack-ai/objectstack/events","assignees_url":"https://api.github.com/repos/objectstack-ai/objectstack/assignees{/user}","branches_url":"https://api.github.com/repos/objectstack-ai/objectstack/branches{/branch}","tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/tags","blobs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/refs{/sha}","trees_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/trees{/sha}","statuses_url":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/{sha}","languages_url":"https://api.github.com/repos/objectstack-ai/objectstack/languages","stargazers_url":"https://api.github.com/repos/objectstack-ai/objectstack/stargazers","contributors_url":"https://api.github.com/repos/objectstack-ai/objectstack/contributors","subscribers_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscribers","subscription_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscription","commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/commits{/sha}","git_commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/commits{/sha}","comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/comments{/number}","issue_comment_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/comments{/number}","contents_url":"https://api.github.com/repos/objectstack-ai/objectstack/contents/{+path}","compare_url":"https://api.github.com/repos/objectstack-ai/objectstack/compare/{base}...{head}","merges_url":"https://api.github.com/repos/objectstack-ai/objectstack/merges","archive_url":"https://api.github.com/repos/objectstack-ai/objectstack/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/objectstack-ai/objectstack/downloads","issues_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues{/number}","pulls_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls{/number}","milestones_url":"https://api.github.com/repos/objectstack-ai/objectstack/milestones{/number}","notifications_url":"https://api.github.com/repos/objectstack-ai/objectstack/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/objectstack-ai/objectstack/labels{/name}","releases_url":"https://api.github.com/repos/objectstack-ai/objectstack/releases{/id}","deployments_url":"https://api.github.com/repos/objectstack-ai/objectstack/deployments","created_at":"2026-01-18T06:47:54Z","updated_at":"2026-10-22T09:57:09Z","pushed_at":"2026-10-22T09:57:07Z","git_url":"git://github.com/objectstack-ai/objectstack.git","ssh_url":"git@github.com:objectstack-ai/objectstack.git","clone_url":"https://github.com/objectstack-ai/objectstack.git","svn_url":"https://github.com/objectstack-ai/objectstack","homepage":"https://objectstack.ai","size":754868,"stargazers_count":76,"watchers_count":76,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":false,"has_wiki":true,"has_pages":false,"has_discussions":true,"forks_count":18,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":120,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"has_pull_requests":true,"pull_request_creation_policy":"all","topics":["business-ontology","fde","fde-enablement","metadata-driven","ontology","ontology-driven-development","ontology-engineering","ontology-native","palantir","palantir-alternative","palantir-fde","palantir-foundry","palantir-ontology","salesforce-alternative"],"visibility":"public","forks":18,"open_issues":120,"watchers":76,"default_branch":"main"}},"base":{"label":"objectstack-ai:main","ref":"main","sha":"2069b81c266836fd6d7b52fc5e6679c734bdcd3c","user":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":1136691870,"node_id":"R_kgDOQ8CKng","name":"objectstack","full_name":"objectstack-ai/objectstack","private":false,"owner":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/objectstack-ai/objectstack","description":"The ontology is the software. One executable business ontology: AI writes it, the runtime runs it, agents operate it, you own it. Open protocol & runtime, Apache-2.0.","fork":false,"url":"https://api.github.com/repos/objectstack-ai/objectstack","forks_url":"https://api.github.com/repos/objectstack-ai/objectstack/forks","keys_url":"https://api.github.com/repos/objectstack-ai/objectstack/keys{/key_id}","collaborators_url":"https://api.github.com/repos/objectstack-ai/objectstack/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/objectstack-ai/objectstack/teams","hooks_url":"https://api.github.com/repos/objectstack-ai/objectstack/hooks","issue_events_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/events{/number}","events_url":"https://api.github.com/repos/objectstack-ai/objectstack/events","assignees_url":"https://api.github.com/repos/objectstack-ai/objectstack/assignees{/user}","branches_url":"https://api.github.com/repos/objectstack-ai/objectstack/branches{/branch}","tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/tags","blobs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/refs{/sha}","trees_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/trees{/sha}","statuses_url":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/{sha}","languages_url":"https://api.github.com/repos/objectstack-ai/objectstack/languages","stargazers_url":"https://api.github.com/repos/objectstack-ai/objectstack/stargazers","contributors_url":"https://api.github.com/repos/objectstack-ai/objectstack/contributors","subscribers_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscribers","subscription_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscription","commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/commits{/sha}","git_commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/commits{/sha}","comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/comments{/number}","issue_comment_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/comments{/number}","contents_url":"https://api.github.com/repos/objectstack-ai/objectstack/contents/{+path}","compare_url":"https://api.github.com/repos/objectstack-ai/objectstack/compare/{base}...{head}","merges_url":"https://api.github.com/repos/objectstack-ai/objectstack/merges","archive_url":"https://api.github.com/repos/objectstack-ai/objectstack/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/objectstack-ai/objectstack/downloads","issues_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues{/number}","pulls_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls{/number}","milestones_url":"https://api.github.com/repos/objectstack-ai/objectstack/milestones{/number}","notifications_url":"https://api.github.com/repos/objectstack-ai/objectstack/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/objectstack-ai/objectstack/labels{/name}","releases_url":"https://api.github.com/repos/objectstack-ai/objectstack/releases{/id}","deployments_url":"https://api.github.com/repos/objectstack-ai/objectstack/deployments","created_at":"2026-01-18T06:47:54Z","updated_at":"2026-10-22T09:57:09Z","pushed_at":"2026-10-22T09:57:07Z","git_url":"git://github.com/objectstack-ai/objectstack.git","ssh_url":"git@github.com:objectstack-ai/objectstack.git","clone_url":"https://github.com/objectstack-ai/objectstack.git","svn_url":"https://github.com/objectstack-ai/objectstack","homepage":"https://objectstack.ai","size":754868,"stargazers_count":76,"watchers_count":76,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":false,"has_wiki":true,"has_pages":false,"has_discussions":true,"forks_count":18,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":120,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"has_pull_requests":true,"pull_request_creation_policy":"all","topics":["business-ontology","fde","fde-enablement","metadata-driven","ontology","ontology-driven-development","ontology-engineering","ontology-native","palantir","palantir-alternative","palantir-fde","palantir-foundry","palantir-ontology","salesforce-alternative"],"visibility":"public","forks":18,"open_issues":120,"watchers":76,"default_branch":"main"}},"_links":{"self":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/24947"},"html":{"href":"https://github.com/objectstack-ai/objectstack/pull/24947"},"issue":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/issues/24947"},"comments":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/issues/24947/comments"},"review_comments":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/24947/comments"},"review_comment":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/24947/commits"},"statuses":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/84b1e35c8e7fc0fa73aa00c829b757a39485b7ff"}},"author_association":"CONTRIBUTOR","auto_merge":null,"assignee":{"login":"baozhoutao","id":6194462,"node_id":"MDQ6VXNlcjYxOTQ0NjI=","avatar_url":"https://avatars.githubusercontent.com/u/6194462?v=4","gravatar_id":"","url":"https://api.github.com/users/baozhoutao","html_url":"https://github.com/baozhoutao","followers_url":"https://api.github.com/users/baozhoutao/followers","following_url":"https://api.github.com/users/baozhoutao/following{/other_user}","gists_url":"https://api.github.com/users/baozhoutao/gists{/gist_id}","starred_url":"https://api.github.com/users/baozhoutao/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/baozhoutao/subscriptions","organizations_url":"https://api.github.com/users/baozhoutao/orgs","repos_url":"https://api.github.com/users/baozhoutao/repos","events_url":"https://api.github.com/users/baozhoutao/events{/privacy}","received_events_url":"https://api.github.com/users/baozhoutao/received_events","type":"User","user_view_type":"public","site_admin":false},"active_lock_reason":null},{"url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/24876","id":4935707051,"node_id":"PR_kwDOQ8CKns8AAAABJjDpqw","html_url":"https://github.com/objectstack-ai/objectstack/pull/24876","diff_url":"https://github.com/objectstack-ai/objectstack/pull/24876.diff","patch_url":"https://github.com/objectstack-ai/objectstack/pull/24876.patch","issue_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/24876","number":24876,"state":"open","locked":false,"title":"chore: version packages","user":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"body":"This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and publish to npm yourself or [setup this action to publish automatically](https://github.com/changesets/action#with-publishing). If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.\n\n\n# Releases\n\n> The changelog information of each package has been omitted from this message, as the content exceeds the size limit.\n\n## @objectstack/hono@18.1.0\n\n\n## @objectstack/cli@18.1.0\n\n\n## @objectstack/cloud-connection@18.1.0\n\n\n## @objectstack/console@18.1.0\n\n\n## @objectstack/core@18.1.0\n\n\n## @objectstack/driver-memory@18.1.0\n\n\n## @objectstack/driver-sql@18.1.0\n\n\n## @objectstack/driver-turso@18.1.0\n\n\n## @objectstack/lint@18.1.0\n\n\n## @objectstack/metadata-core@18.1.0\n\n\n## @objectstack/metadata-protocol@18.1.0\n\n\n## @objectstack/objectql@18.1.0\n\n\n## @objectstack/platform-objects@18.1.0\n\n\n## @objectstack/plugin-approvals@18.1.0\n\n\n## @objectstack/plugin-audit@18.1.0\n\n\n## @objectstack/plugin-auth@18.1.0\n\n\n## @objectstack/plugin-hono-server@18.1.0\n\n\n## @objectstack/plugin-security@18.1.0\n\n\n## @objectstack/plugin-sharing@18.1.0\n\n\n## @objectstack/rest@18.1.0\n\n\n## @objectstack/runtime@18.1.0\n\n\n## @objectstack/service-datasource@18.1.0\n\n\n## @objectstack/service-messaging@18.1.0\n\n\n## @objectstack/service-settings@18.1.0\n\n\n## @objectstack/spec@18.1.0\n\n\n## @objectstack/account@18.1.0\n\n\n## @objectstack/setup@18.1.0\n\n\n## @objectstack/studio@18.1.0\n\n\n## @objectstack/client@18.1.0\n\n\n## @objectstack/client-react@18.1.0\n\n\n## @objectstack/connector-mcp@18.1.0\n\n\n## @objectstack/connector-openapi@18.1.0\n\n\n## @objectstack/connector-rest@18.1.0\n\n\n## @objectstack/connector-slack@18.1.0\n\n\n## @objectstack/driver-mongodb@18.1.0\n\n\n## @objectstack/driver-sqlite-wasm@18.1.0\n\n\n## @objectstack/formula@18.1.0\n\n\n## @objectstack/mcp@18.1.0\n\n\n## @objectstack/metadata@18.1.0\n\n\n## @objectstack/metadata-fs@18.1.0\n\n\n## @objectstack/observability@18.1.0\n\n\n## @objectstack/embedder-openai@18.1.0\n\n\n## @objectstack/knowledge-memory@18.1.0\n\n\n## @objectstack/knowledge-ragflow@18.1.0\n\n\n## @objectstack/organizations@18.1.0\n\n\n## @objectstack/plugin-dev@18.1.0\n\n\n## @objectstack/plugin-email@18.1.0\n\n\n## @objectstack/plugin-pinyin-search@18.1.0\n\n\n## @objectstack/plugin-webhooks@18.1.0\n\n\n## @objectstack/service-analytics@18.1.0\n\n\n## @objectstack/service-automation@18.1.0\n\n\n## @objectstack/service-cache@18.1.0\n\n\n## @objectstack/service-cluster@18.1.0\n\n\n## @objectstack/service-cluster-redis@18.1.0\n\n\n## @objectstack/service-i18n@18.1.0\n\n\n## @objectstack/service-job@18.1.0\n\n\n## @objectstack/service-knowledge@18.1.0\n\n\n## @objectstack/service-mailbox@18.1.0\n\n\n## @objectstack/service-package@18.1.0\n\n\n## @objectstack/service-print@18.1.0\n\n\n## @objectstack/service-queue@18.1.0\n\n\n## @objectstack/service-realtime@18.1.0\n\n\n## @objectstack/service-sms@18.1.0\n\n\n## @objectstack/service-storage@18.1.0\n\n\n## @objectstack/skills@18.1.0\n\n\n## @objectstack/trigger-api@18.1.0\n\n\n## @objectstack/trigger-record-change@18.1.0\n\n\n## @objectstack/trigger-schedule@18.1.0\n\n\n## @objectstack/types@18.1.0\n\n\n## @objectstack/verify@18.1.0\n\n\n## @objectstack/connector-imap@18.1.0\n\n\n## create-objectstack@18.1.0\n\n\n## @objectstack/sdui-parser@18.1.0\n\n\n## @objectstack/example-crm@4.0.101\n\n\n## @objectstack/example-multi-package@0.0.8\n\n\n## @objectstack/example-showcase@0.3.23\n\n\n## @objectstack/example-todo@4.0.101\n\n\n## @objectstack/example-embed-objectql@0.0.41\n\n\n## @objectstack/dogfood@0.0.49\n\n\n## @objectstack/downstream-contract@0.0.47\n\n\n## @objectstack/http-conformance@0.1.9\n\n","created_at":"2026-10-20T12:27:42Z","updated_at":"2026-10-22T06:16:29Z","closed_at":null,"merged_at":null,"merge_commit_sha":"42ba30c5fcf4f813bc26c143b8b31d6e12751bdc","assignees":[],"requested_reviewers":[{"login":"hotlong","id":50353452,"node_id":"MDQ6VXNlcjUwMzUzNDUy","avatar_url":"https://avatars.githubusercontent.com/u/50353452?v=4","gravatar_id":"","url":"https://api.github.com/users/hotlong","html_url":"https://github.com/hotlong","followers_url":"https://api.github.com/users/hotlong/followers","following_url":"https://api.github.com/users/hotlong/following{/other_user}","gists_url":"https://api.github.com/users/hotlong/gists{/gist_id}","starred_url":"https://api.github.com/users/hotlong/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hotlong/subscriptions","organizations_url":"https://api.github.com/users/hotlong/orgs","repos_url":"https://api.github.com/users/hotlong/repos","events_url":"https://api.github.com/users/hotlong/events{/privacy}","received_events_url":"https://api.github.com/users/hotlong/received_events","type":"User","user_view_type":"public","site_admin":false},{"login":"os-zhuang","id":277994282,"node_id":"U_kgDOEJHbKg","avatar_url":"https://avatars.githubusercontent.com/u/277994282?v=4","gravatar_id":"","url":"https://api.github.com/users/os-zhuang","html_url":"https://github.com/os-zhuang","followers_url":"https://api.github.com/users/os-zhuang/followers","following_url":"https://api.github.com/users/os-zhuang/following{/other_user}","gists_url":"https://api.github.com/users/os-zhuang/gists{/gist_id}","starred_url":"https://api.github.com/users/os-zhuang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/os-zhuang/subscriptions","organizations_url":"https://api.github.com/users/os-zhuang/orgs","repos_url":"https://api.github.com/users/os-zhuang/repos","events_url":"https://api.github.com/users/os-zhuang/events{/privacy}","received_events_url":"https://api.github.com/users/os-zhuang/received_events","type":"User","user_view_type":"public","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"draft":false,"commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/24876/commits","review_comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/24876/comments","review_comment_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/comments{/number}","comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/24876/comments","statuses_url":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/c48ccc2e37ffae36ea3626ecaa8db5181a4cf7aa","head":{"label":"objectstack-ai:changeset-release/main","ref":"changeset-release/main","sha":"c48ccc2e37ffae36ea3626ecaa8db5181a4cf7aa","user":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":1136691870,"node_id":"R_kgDOQ8CKng","name":"objectstack","full_name":"objectstack-ai/objectstack","private":false,"owner":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/objectstack-ai/objectstack","description":"The ontology is the software. One executable business ontology: AI writes it, the runtime runs it, agents operate it, you own it. Open protocol & runtime, Apache-2.0.","fork":false,"url":"https://api.github.com/repos/objectstack-ai/objectstack","forks_url":"https://api.github.com/repos/objectstack-ai/objectstack/forks","keys_url":"https://api.github.com/repos/objectstack-ai/objectstack/keys{/key_id}","collaborators_url":"https://api.github.com/repos/objectstack-ai/objectstack/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/objectstack-ai/objectstack/teams","hooks_url":"https://api.github.com/repos/objectstack-ai/objectstack/hooks","issue_events_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/events{/number}","events_url":"https://api.github.com/repos/objectstack-ai/objectstack/events","assignees_url":"https://api.github.com/repos/objectstack-ai/objectstack/assignees{/user}","branches_url":"https://api.github.com/repos/objectstack-ai/objectstack/branches{/branch}","tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/tags","blobs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/refs{/sha}","trees_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/trees{/sha}","statuses_url":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/{sha}","languages_url":"https://api.github.com/repos/objectstack-ai/objectstack/languages","stargazers_url":"https://api.github.com/repos/objectstack-ai/objectstack/stargazers","contributors_url":"https://api.github.com/repos/objectstack-ai/objectstack/contributors","subscribers_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscribers","subscription_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscription","commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/commits{/sha}","git_commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/commits{/sha}","comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/comments{/number}","issue_comment_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/comments{/number}","contents_url":"https://api.github.com/repos/objectstack-ai/objectstack/contents/{+path}","compare_url":"https://api.github.com/repos/objectstack-ai/objectstack/compare/{base}...{head}","merges_url":"https://api.github.com/repos/objectstack-ai/objectstack/merges","archive_url":"https://api.github.com/repos/objectstack-ai/objectstack/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/objectstack-ai/objectstack/downloads","issues_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues{/number}","pulls_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls{/number}","milestones_url":"https://api.github.com/repos/objectstack-ai/objectstack/milestones{/number}","notifications_url":"https://api.github.com/repos/objectstack-ai/objectstack/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/objectstack-ai/objectstack/labels{/name}","releases_url":"https://api.github.com/repos/objectstack-ai/objectstack/releases{/id}","deployments_url":"https://api.github.com/repos/objectstack-ai/objectstack/deployments","created_at":"2026-01-18T06:47:54Z","updated_at":"2026-10-22T09:57:09Z","pushed_at":"2026-10-22T09:57:07Z","git_url":"git://github.com/objectstack-ai/objectstack.git","ssh_url":"git@github.com:objectstack-ai/objectstack.git","clone_url":"https://github.com/objectstack-ai/objectstack.git","svn_url":"https://github.com/objectstack-ai/objectstack","homepage":"https://objectstack.ai","size":754868,"stargazers_count":76,"watchers_count":76,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":false,"has_wiki":true,"has_pages":false,"has_discussions":true,"forks_count":18,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":120,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"has_pull_requests":true,"pull_request_creation_policy":"all","topics":["business-ontology","fde","fde-enablement","metadata-driven","ontology","ontology-driven-development","ontology-engineering","ontology-native","palantir","palantir-alternative","palantir-fde","palantir-foundry","palantir-ontology","salesforce-alternative"],"visibility":"public","forks":18,"open_issues":120,"watchers":76,"default_branch":"main"}},"base":{"label":"objectstack-ai:main","ref":"main","sha":"c5915b2bbd933acf5ebc7ff53426113c9b49d40c","user":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":1136691870,"node_id":"R_kgDOQ8CKng","name":"objectstack","full_name":"objectstack-ai/objectstack","private":false,"owner":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/objectstack-ai/objectstack","description":"The ontology is the software. One executable business ontology: AI writes it, the runtime runs it, agents operate it, you own it. Open protocol & runtime, Apache-2.0.","fork":false,"url":"https://api.github.com/repos/objectstack-ai/objectstack","forks_url":"https://api.github.com/repos/objectstack-ai/objectstack/forks","keys_url":"https://api.github.com/repos/objectstack-ai/objectstack/keys{/key_id}","collaborators_url":"https://api.github.com/repos/objectstack-ai/objectstack/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/objectstack-ai/objectstack/teams","hooks_url":"https://api.github.com/repos/objectstack-ai/objectstack/hooks","issue_events_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/events{/number}","events_url":"https://api.github.com/repos/objectstack-ai/objectstack/events","assignees_url":"https://api.github.com/repos/objectstack-ai/objectstack/assignees{/user}","branches_url":"https://api.github.com/repos/objectstack-ai/objectstack/branches{/branch}","tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/tags","blobs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/refs{/sha}","trees_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/trees{/sha}","statuses_url":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/{sha}","languages_url":"https://api.github.com/repos/objectstack-ai/objectstack/languages","stargazers_url":"https://api.github.com/repos/objectstack-ai/objectstack/stargazers","contributors_url":"https://api.github.com/repos/objectstack-ai/objectstack/contributors","subscribers_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscribers","subscription_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscription","commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/commits{/sha}","git_commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/commits{/sha}","comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/comments{/number}","issue_comment_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/comments{/number}","contents_url":"https://api.github.com/repos/objectstack-ai/objectstack/contents/{+path}","compare_url":"https://api.github.com/repos/objectstack-ai/objectstack/compare/{base}...{head}","merges_url":"https://api.github.com/repos/objectstack-ai/objectstack/merges","archive_url":"https://api.github.com/repos/objectstack-ai/objectstack/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/objectstack-ai/objectstack/downloads","issues_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues{/number}","pulls_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls{/number}","milestones_url":"https://api.github.com/repos/objectstack-ai/objectstack/milestones{/number}","notifications_url":"https://api.github.com/repos/objectstack-ai/objectstack/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/objectstack-ai/objectstack/labels{/name}","releases_url":"https://api.github.com/repos/objectstack-ai/objectstack/releases{/id}","deployments_url":"https://api.github.com/repos/objectstack-ai/objectstack/deployments","created_at":"2026-01-18T06:47:54Z","updated_at":"2026-10-22T09:57:09Z","pushed_at":"2026-10-22T09:57:07Z","git_url":"git://github.com/objectstack-ai/objectstack.git","ssh_url":"git@github.com:objectstack-ai/objectstack.git","clone_url":"https://github.com/objectstack-ai/objectstack.git","svn_url":"https://github.com/objectstack-ai/objectstack","homepage":"https://objectstack.ai","size":754868,"stargazers_count":76,"watchers_count":76,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":false,"has_wiki":true,"has_pages":false,"has_discussions":true,"forks_count":18,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":120,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"has_pull_requests":true,"pull_request_creation_policy":"all","topics":["business-ontology","fde","fde-enablement","metadata-driven","ontology","ontology-driven-development","ontology-engineering","ontology-native","palantir","palantir-alternative","palantir-fde","palantir-foundry","palantir-ontology","salesforce-alternative"],"visibility":"public","forks":18,"open_issues":120,"watchers":76,"default_branch":"main"}},"_links":{"self":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/24876"},"html":{"href":"https://github.com/objectstack-ai/objectstack/pull/24876"},"issue":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/issues/24876"},"comments":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/issues/24876/comments"},"review_comments":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/24876/comments"},"review_comment":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/24876/commits"},"statuses":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/c48ccc2e37ffae36ea3626ecaa8db5181a4cf7aa"}},"author_association":"CONTRIBUTOR","auto_merge":null,"assignee":null,"active_lock_reason":null},{"url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/24467","id":4916445718,"node_id":"PR_kwDOQ8CKns8AAAABJQsCFg","html_url":"https://github.com/objectstack-ai/objectstack/pull/24467","diff_url":"https://github.com/objectstack-ai/objectstack/pull/24467.diff","patch_url":"https://github.com/objectstack-ai/objectstack/pull/24467.patch","issue_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/24467","number":24467,"state":"open","locked":false,"title":"chore(ci): refresh the Test Core shard-timings dataset","user":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"body":"Refreshes `scripts/test-shard-timings.json`, the balancing input for the Test Core\nshard split. Opened automatically by `.github/workflows/shard-timings-refresh.yml`.\nEvery byte came out of `scripts/measure-test-shard-timings.mjs`; nothing here was\nhand-edited, and no bound, timeout or matrix entry was touched.\n\n## Regression readings: NOT MEASURED -- the diff refused (exit 1)\n\n```\nfile:///home/runner/work/objectstack/objectstack/scripts/measure-test-shard-timings.mjs:1271\n    throw new Error(\n          ^\n\nError: packages/cli/test/serve-mcp-stdio-early-initialize.integration.test.ts:2: the budget 15 s is not on the 10 s grid. A test file's budget is ONE header line, `// test-budget: SECONDS — CLASS: REASON` (ruling records 6181973363 and 6212133431): SECONDS is the measured CI reading x 1.25 rounded up to the next 10 s, above the 10 s line; CLASS is one of \"spawns the real producer once per single-cause fixture\", \"whole-package import\", \"compiles the package type graph once\"; REASON is not empty. Refusing to guess which budget the file is held to.\n    at refuse (file:///home/runner/work/objectstack/objectstack/scripts/measure-test-shard-timings.mjs:1271:11)\n    at readTestBudget (file:///home/runner/work/objectstack/objectstack/scripts/measure-test-shard-timings.mjs:1298:29)\n    at declaredBudgetInTree (file:///home/runner/work/objectstack/objectstack/scripts/measure-test-shard-timings.mjs:1323:10)\n    at declaredBudget (file:///home/runner/work/objectstack/objectstack/scripts/measure-test-shard-timings.mjs:3404:40)\n    at windowFiles (file:///home/runner/work/objectstack/objectstack/scripts/measure-test-shard-timings.mjs:1386:17)\n    at diffMain (file:///home/runner/work/objectstack/objectstack/scripts/measure-test-shard-timings.mjs:3400:21)\n    at main (file:///home/runner/work/objectstack/objectstack/scripts/measure-test-shard-timings.mjs:3460:24)\n    at file:///home/runner/work/objectstack/objectstack/scripts/measure-test-shard-timings.mjs:3644:3\n    at ModuleJob.run (node:internal/modules/esm/module_job:343:25)\n    at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:681:26)\n\nNode.js v22.23.3\n```\n\n## What the seat landing this PR does\n\nFile nothing from this refresh's readings: no rise and no file was judged. The refusal above\nis a defect in this lane, and that is the one card to file.\n\n## Source\n\nMeasured across 7 accumulated run(s) of the HOURLY `schedule` run of CI on\n`main` — the full-battery run (#16467). A `push` run on `main` is affected-only and\nis not a measurement of the workspace, so no push run feeds this file.\n\nNo single green run measures the whole workspace either — turbo's cache is namespaced\nper shard and only main pushes write it, so a\npackage whose inputs have not changed is a HIT and the generator refuses hits rather\nthan recording a replay as a duration. Runs are therefore accumulated, each fenced by\nits own `--run` group, until every package has been EXECUTED by at least the\ngenerator's minimum number of them, and each weight is the median of those executions.\n\n- https://github.com/objectstack-ai/objectstack/actions/runs/39202368342\n- https://github.com/objectstack-ai/objectstack/actions/runs/39197429467\n- https://github.com/objectstack-ai/objectstack/actions/runs/39192681060\n- https://github.com/objectstack-ai/objectstack/actions/runs/39188268133\n- https://github.com/objectstack-ai/objectstack/actions/runs/39184708096\n- https://github.com/objectstack-ai/objectstack/actions/runs/39178996284\n- https://github.com/objectstack-ai/objectstack/actions/runs/39174682274\n\n- Newest run in the set: `39202368342`, commit `725a5b1311ecc051edafcd8122ad47dfe1ccfbf8` — the date this refresh carries.\n- Every run above had all six `Test Core (N/6)` jobs conclude `success` with its six\n  run-summary artifacts still retained; runs that were cancelled, failed or had lost\n  their artifacts were rejected by name in the log before any of these were used.\n\nAll 75 package weights were measured in these runs; nothing was carried.\n\n⚠️ This PR references #16173 and #16222 but does NOT carry a closing keyword for them,\nbecause a weekly lane cannot know which cards a given run ought to retire. If this is\nthe first refresh to land, retire those two by hand as part of merging it.\n\n## Sample depth, run-to-run spread and suite-duration ceilings\n\nEvery one of the 75 weights rests on at least 3 executed runs; none is provisional.\n\nSuite-duration ceilings: 72 held unchanged (a refresh never moves one; a raise is a ruling), 3 new (@objectstack/connector-imap, @objectstack/service-mailbox, @objectstack/service-print), each new one its slowest executed run in this window x 1.25.\n\nEvery package carries a ceiling.\n\n⚠️ 17 package(s) ran OVER their held ceiling in this window (marked in the table): a reading, not a red -- under #22949 ruling E the ceiling reports on every event, and a regression is judged by the diff at the top of this body. This refresh does not raise them; that takes a ruling.\n\nEach package's executed runs in this refresh (minimum 3), the spread of its readings in seconds, and the suite-duration ceiling `Test Core` grades it against: its slowest executed run x 1.25 when first set, then held by every refresh -- a ceiling is raised only by a ruling.\n\n| package | runs | min s | median s | max s | max/min | ceiling s | |\n|---|--:|--:|--:|--:|--:|--:|---|\n| `@objectstack/service-package` | 7 | 11.80 | 56.10 | 77.53 | 6.57× | 32.90 | held; this window: 96.92; ⚠ a window run is OVER its held ceiling |\n| `@objectstack/example-embed-objectql` | 5 | 15.95 | 36.60 | 41.75 | 2.62× | 51.51 | held; this window: 52.19 |\n| `@objectstack/service-automation` | 7 | 257.94 | 421.20 | 648.55 | 2.51× | 557.10 | held; this window: 810.69; ⚠ a window run is OVER its held ceiling |\n| `@objectstack/knowledge-memory` | 7 | 2.43 | 4.94 | 5.79 | 2.38× | 6.39 | held; this window: 7.25 |\n| `@objectstack/plugin-email` | 7 | 50.81 | 89.58 | 113.67 | 2.24× | 119.94 | held; this window: 142.09 |\n| `@objectstack/connector-slack` | 7 | 19.54 | 34.08 | 41.49 | 2.12× | 55.45 | held; this window: 51.86 |\n| `@objectstack/embedder-openai` | 7 | 3.98 | 6.53 | 8.29 | 2.08× | 9.10 | held; this window: 10.37 |\n| `@objectstack/downstream-contract` | 7 | 9.73 | 15.04 | 19.92 | 2.05× | 22.71 | held; this window: 24.91 |\n| `@objectstack/rest` | 6 | 399.75 | 589.43 | 810.02 | 2.03× | 878.41 | held; this window: 1012.53 |\n| `@objectstack/example-showcase` | 7 | 70.14 | 134.65 | 141.40 | 2.02× | 192.05 | held; this window: 176.75 |\n| `@objectstack/observability` | 7 | 1.92 | 3.28 | 3.81 | 1.98× | 4.24 | held; this window: 4.77 |\n| `@objectstack/knowledge-ragflow` | 7 | 2.26 | 3.53 | 4.43 | 1.96× | 3.40 | held; this window: 5.55; ⚠ a window run is OVER its held ceiling |\n| `@objectstack/service-knowledge` | 4 | 25.18 | 38.19 | 48.56 | 1.93× | 48.58 | held; this window: 60.71 |\n| `@objectstack/plugin-webhooks` | 5 | 51.92 | 89.12 | 99.81 | 1.92× | 108.05 | held; this window: 124.76 |\n| `@objectstack/driver-mongodb` | 5 | 62.94 | 116.48 | 119.88 | 1.90× | 158.96 | held; this window: 149.85 |\n| `@objectstack/plugin-auth` | 7 | 210.17 | 364.34 | 399.32 | 1.90× | 600.45 | held; this window: 499.15 |\n| `@objectstack/sdui-parser` | 6 | 2.94 | 3.89 | 5.58 | 1.90× | 5.18 | held; this window: 6.98; ⚠ a window run is OVER its held ceiling |\n| `@objectstack/service-i18n` | 5 | 12.61 | 22.28 | 23.87 | 1.89× | 49.45 | held; this window: 29.84 |\n| `@objectstack/service-storage` | 6 | 116.35 | 170.85 | 219.42 | 1.89× | 208.28 | held; this window: 274.28; ⚠ a window run is OVER its held ceiling |\n| `@objectstack/http-conformance` | 7 | 92.08 | 132.73 | 170.40 | 1.85× | 149.61 | held; this window: 213.00; ⚠ a window run is OVER its held ceiling |\n| `@objectstack/runtime` | 6 | 580.75 | 785.07 | 1072.49 | 1.85× | 913.09 | held; this window: 1340.61; ⚠ a window run is OVER its held ceiling |\n| `@objectstack/service-datasource` | 5 | 59.95 | 103.29 | 109.88 | 1.83× | 128.93 | held; this window: 137.36 |\n| `@objectstack/connector-openapi` | 7 | 26.23 | 37.61 | 47.69 | 1.82× | 61.57 | held; this window: 59.62 |\n| `@objectstack/plugin-pinyin-search` | 6 | 23.89 | 40.04 | 43.33 | 1.81× | 62.37 | held; this window: 54.17 |\n| `@objectstack/example-todo` | 7 | 41.20 | 61.04 | 74.71 | 1.81× | 88.84 | held; this window: 93.39 |\n| `@objectstack/example-crm` | 7 | 33.07 | 47.57 | 59.80 | 1.81× | 68.83 | held; this window: 74.76 |\n| `@objectstack/plugin-approvals` | 6 | 181.11 | 236.69 | 325.18 | 1.80× | 290.60 | held; this window: 406.48; ⚠ a window run is OVER its held ceiling |\n| `@objectstack/service-sms` | 7 | 22.54 | 26.53 | 40.35 | 1.79× | 47.04 | held; this window: 50.44 |\n| `@objectstack/service-realtime` | 6 | 8.12 | 12.93 | 14.54 | 1.79× | 27.68 | held; this window: 18.18 |\n| `@objectstack/metadata-fs` | 3 | 31.41 | 42.15 | 56.16 | 1.79× | 61.33 | held; this window: 70.20 |\n| `@objectstack/client` | 7 | 92.73 | 138.48 | 165.14 | 1.78× | 179.74 | held; this window: 206.43 |\n| `@objectstack/driver-sqlite-wasm` | 5 | 66.03 | 77.97 | 115.36 | 1.75× | 123.14 | held; this window: 144.20 |\n| `@objectstack/cloud-connection` | 6 | 164.09 | 215.78 | 283.85 | 1.73× | 163.89 | held; this window: 354.82; ⚠ a window run is OVER its held ceiling |\n| `@objectstack/plugin-security` | 7 | 223.50 | 285.53 | 385.68 | 1.73× | 474.43 | held; this window: 482.10 |\n| `@objectstack/service-cluster-redis` | 6 | 17.09 | 27.45 | 29.46 | 1.72× | 28.00 | held; this window: 36.83; ⚠ a window run is OVER its held ceiling |\n| `@objectstack/lint` | 6 | 105.36 | 169.58 | 181.20 | 1.72× | 332.18 | held; this window: 226.50 |\n| `@objectstack/metadata-protocol` | 5 | 455.64 | 598.00 | 783.05 | 1.72× | 769.71 | held; this window: 978.82; ⚠ a window run is OVER its held ceiling |\n| `@objectstack/driver-memory` | 5 | 90.11 | 150.01 | 154.64 | 1.72× | 171.63 | held; this window: 193.31 |\n| `@objectstack/plugin-sharing` | 6 | 111.06 | 180.01 | 186.86 | 1.68× | 235.53 | held; this window: 233.58 |\n| `@objectstack/service-cache` | 5 | 1.36 | 1.82 | 2.29 | 1.68× | 3.69 | held; this window: 2.87 |\n| `@objectstack/formula` | 3 | 30.95 | 41.17 | 51.37 | 1.66× | 56.95 | held; this window: 64.22 |\n| `@objectstack/service-analytics` | 5 | 234.97 | 310.41 | 388.40 | 1.65× | 440.54 | held; this window: 485.50 |\n| `@objectstack/service-print` | 7 | 27.87 | 30.02 | 45.86 | 1.65× | 57.33 |  |\n| `@objectstack/service-settings` | 7 | 87.11 | 129.49 | 142.52 | 1.64× | 157.56 | held; this window: 178.15 |\n| `@objectstack/platform-objects` | 5 | 65.74 | 86.24 | 107.51 | 1.64× | 135.03 | held; this window: 134.39 |\n| `@objectstack/verify` | 6 | 124.29 | 159.02 | 203.04 | 1.63× | 418.97 | held; this window: 253.80 |\n| `@objectstack/driver-sql` | 5 | 243.39 | 377.63 | 396.21 | 1.63× | 450.76 | held; this window: 495.27 |\n| `@objectstack/plugin-audit` | 6 | 140.41 | 182.09 | 228.51 | 1.63× | 185.93 | held; this window: 285.64; ⚠ a window run is OVER its held ceiling |\n| `@objectstack/service-cluster` | 7 | 17.54 | 26.66 | 28.43 | 1.62× | 28.46 | held; this window: 35.54 |\n| `@objectstack/organizations` | 6 | 65.43 | 95.63 | 106.00 | 1.62× | 137.91 | held; this window: 132.50 |\n| `@objectstack/trigger-api` | 5 | 15.39 | 19.89 | 24.81 | 1.61× | 42.12 | held; this window: 31.01 |\n| `@objectstack/service-messaging` | 5 | 111.27 | 132.72 | 179.08 | 1.61× | 166.91 | held; this window: 223.86; ⚠ a window run is OVER its held ceiling |\n| `@objectstack/plugin-dev` | 6 | 41.54 | 60.42 | 66.03 | 1.59× | 87.97 | held; this window: 82.54 |\n| `@objectstack/spec` | 4 | 983.84 | 1336.15 | 1555.84 | 1.58× | 1903.55 | held; this window: 1944.80 |\n| `@objectstack/driver-turso` | 4 | 182.15 | 250.01 | 287.93 | 1.58× | 272.37 | held; this window: 359.92; ⚠ a window run is OVER its held ceiling |\n| `@objectstack/client-react` | 6 | 8.75 | 11.58 | 13.74 | 1.57× | 16.23 | held; this window: 17.18 |\n| `@objectstack/connector-rest` | 7 | 34.03 | 38.27 | 52.99 | 1.56× | 60.82 | held; this window: 66.24 |\n| `@objectstack/types` | 3 | 20.25 | 29.96 | 31.30 | 1.55× | 32.05 | held; this window: 39.13 |\n| `@objectstack/hono` | 6 | 32.96 | 39.53 | 50.64 | 1.54× | 45.99 | held; this window: 63.30; ⚠ a window run is OVER its held ceiling |\n| `@objectstack/vitest-filter-preflight` | 6 | 19.07 | 28.65 | 29.24 | 1.53× | 28.93 | held; this window: 36.55; ⚠ a window run is OVER its held ceiling |\n| `@objectstack/connector-mcp` | 6 | 34.11 | 43.53 | 51.37 | 1.51× | 54.85 | held; this window: 64.22 |\n| `@objectstack/trigger-schedule` | 7 | 42.90 | 49.48 | 64.45 | 1.50× | 72.40 | held; this window: 80.57 |\n| `@objectstack/service-mailbox` | 6 | 50.28 | 60.57 | 74.96 | 1.49× | 93.70 |  |\n| `@objectstack/metadata` | 4 | 122.14 | 159.82 | 181.98 | 1.49× | 194.04 | held; this window: 227.48 |\n| `@objectstack/service-queue` | 6 | 35.61 | 46.52 | 52.66 | 1.48× | 83.25 | held; this window: 65.82 |\n| `@objectstack/metadata-core` | 5 | 21.52 | 29.80 | 31.34 | 1.46× | 38.66 | held; this window: 39.18 |\n| `@objectstack/core` | 5 | 102.91 | 141.12 | 146.81 | 1.43× | 151.42 | held; this window: 183.51 |\n| `@objectstack/service-job` | 5 | 26.01 | 34.91 | 36.94 | 1.42× | 45.32 | held; this window: 46.18 |\n| `create-objectstack` | 4 | 17.95 | 22.31 | 25.39 | 1.41× | 38.40 | held; this window: 31.74 |\n| `@objectstack/plugin-hono-server` | 5 | 58.60 | 74.61 | 82.11 | 1.40× | 78.61 | held; this window: 102.64; ⚠ a window run is OVER its held ceiling |\n| `@objectstack/mcp` | 5 | 77.94 | 103.71 | 106.52 | 1.37× | 108.17 | held; this window: 133.15 |\n| `@objectstack/connector-imap` | 6 | 2.88 | 3.65 | 3.83 | 1.33× | 4.79 |  |\n| `@objectstack/objectql` | 3 | 683.19 | 892.57 | 896.33 | 1.31× | 952.27 | held; this window: 1120.41 |\n| `@objectstack/trigger-record-change` | 5 | 68.10 | 77.91 | 85.49 | 1.26× | 109.12 | held; this window: 106.86 |\n| `@objectstack/cli` | 7 | 2440.94 | 2519.78 | 2628.50 | 1.08× | 2868.12 | held; this window: 3285.63 |\n\n## Measured per-shard suite time on the newest run in the set\n\n```\n1: 1010s  |  2: 1320s  |  3: 1159s  |  4: 1464s  |  5: 5s  |  6: 668s\n```\n\n## Predicted bins, before and after\n\n```\nBEFORE  partition-test-shards: self-test OK (73 measured packages -> 75 shard items, 6 shards, max/mean 1.00x <= 1.3x, floor 1331s, bins 1937.14/1938.17/1937.85/1935.62/1934.09/1935.99s within the 2205.79s density cap, file-level slices: @objectstack/cli x3)\nAFTER   partition-test-shards: self-test OK (75 measured packages -> 77 shard items, 6 shards, max/mean 1.00x <= 1.3x, floor 1336s, bins 2201.57/2202.88/2200.73/2203.97/2204.58/2202.50s within the 2519.78s density cap, file-level slices: @objectstack/cli x3)\n```\n\n## No checks will start on this PR by themselves\n\nIt was opened with the Actions `GITHUB_TOKEN`, and GitHub's recursion guard means a\nPR opened that way triggers no workflow runs. Push any commit to the branch, or close\nand reopen the PR, to start CI.\n\nRefs #16464, #16173, #16222.\n","created_at":"2026-10-19T05:43:32Z","updated_at":"2026-10-19T05:43:34Z","closed_at":null,"merged_at":null,"merge_commit_sha":"7046e43671794a0112204e6d8231aa767a16a38d","assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":11267836878,"node_id":"LA_kwDOQ8CKns8AAAACn52Lzg","url":"https://api.github.com/repos/objectstack-ai/objectstack/labels/skip-changeset","name":"skip-changeset","color":"ededed","default":false,"description":"PR has no user-facing published change; bypasses the changeset gate","archived_at":null,"archived_by":null}],"milestone":null,"draft":false,"commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/24467/commits","review_comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/24467/comments","review_comment_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/comments{/number}","comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/24467/comments","statuses_url":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/1f11e11f011e8f37f348e6c98dbe5af1ea8fe69c","head":{"label":"objectstack-ai:claude/shard-timings-refresh-39202368342","ref":"claude/shard-timings-refresh-39202368342","sha":"1f11e11f011e8f37f348e6c98dbe5af1ea8fe69c","user":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":1136691870,"node_id":"R_kgDOQ8CKng","name":"objectstack","full_name":"objectstack-ai/objectstack","private":false,"owner":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/objectstack-ai/objectstack","description":"The ontology is the software. One executable business ontology: AI writes it, the runtime runs it, agents operate it, you own it. Open protocol & runtime, Apache-2.0.","fork":false,"url":"https://api.github.com/repos/objectstack-ai/objectstack","forks_url":"https://api.github.com/repos/objectstack-ai/objectstack/forks","keys_url":"https://api.github.com/repos/objectstack-ai/objectstack/keys{/key_id}","collaborators_url":"https://api.github.com/repos/objectstack-ai/objectstack/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/objectstack-ai/objectstack/teams","hooks_url":"https://api.github.com/repos/objectstack-ai/objectstack/hooks","issue_events_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/events{/number}","events_url":"https://api.github.com/repos/objectstack-ai/objectstack/events","assignees_url":"https://api.github.com/repos/objectstack-ai/objectstack/assignees{/user}","branches_url":"https://api.github.com/repos/objectstack-ai/objectstack/branches{/branch}","tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/tags","blobs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/refs{/sha}","trees_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/trees{/sha}","statuses_url":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/{sha}","languages_url":"https://api.github.com/repos/objectstack-ai/objectstack/languages","stargazers_url":"https://api.github.com/repos/objectstack-ai/objectstack/stargazers","contributors_url":"https://api.github.com/repos/objectstack-ai/objectstack/contributors","subscribers_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscribers","subscription_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscription","commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/commits{/sha}","git_commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/commits{/sha}","comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/comments{/number}","issue_comment_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/comments{/number}","contents_url":"https://api.github.com/repos/objectstack-ai/objectstack/contents/{+path}","compare_url":"https://api.github.com/repos/objectstack-ai/objectstack/compare/{base}...{head}","merges_url":"https://api.github.com/repos/objectstack-ai/objectstack/merges","archive_url":"https://api.github.com/repos/objectstack-ai/objectstack/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/objectstack-ai/objectstack/downloads","issues_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues{/number}","pulls_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls{/number}","milestones_url":"https://api.github.com/repos/objectstack-ai/objectstack/milestones{/number}","notifications_url":"https://api.github.com/repos/objectstack-ai/objectstack/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/objectstack-ai/objectstack/labels{/name}","releases_url":"https://api.github.com/repos/objectstack-ai/objectstack/releases{/id}","deployments_url":"https://api.github.com/repos/objectstack-ai/objectstack/deployments","created_at":"2026-01-18T06:47:54Z","updated_at":"2026-10-22T09:57:09Z","pushed_at":"2026-10-22T09:57:07Z","git_url":"git://github.com/objectstack-ai/objectstack.git","ssh_url":"git@github.com:objectstack-ai/objectstack.git","clone_url":"https://github.com/objectstack-ai/objectstack.git","svn_url":"https://github.com/objectstack-ai/objectstack","homepage":"https://objectstack.ai","size":754868,"stargazers_count":76,"watchers_count":76,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":false,"has_wiki":true,"has_pages":false,"has_discussions":true,"forks_count":18,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":120,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"has_pull_requests":true,"pull_request_creation_policy":"all","topics":["business-ontology","fde","fde-enablement","metadata-driven","ontology","ontology-driven-development","ontology-engineering","ontology-native","palantir","palantir-alternative","palantir-fde","palantir-foundry","palantir-ontology","salesforce-alternative"],"visibility":"public","forks":18,"open_issues":120,"watchers":76,"default_branch":"main"}},"base":{"label":"objectstack-ai:main","ref":"main","sha":"ec951e29e451863295afdd74e1a49e05b2ff281a","user":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":1136691870,"node_id":"R_kgDOQ8CKng","name":"objectstack","full_name":"objectstack-ai/objectstack","private":false,"owner":{"login":"objectstack-ai","id":254823548,"node_id":"O_kgDODzBMfA","avatar_url":"https://avatars.githubusercontent.com/u/254823548?v=4","gravatar_id":"","url":"https://api.github.com/users/objectstack-ai","html_url":"https://github.com/objectstack-ai","followers_url":"https://api.github.com/users/objectstack-ai/followers","following_url":"https://api.github.com/users/objectstack-ai/following{/other_user}","gists_url":"https://api.github.com/users/objectstack-ai/gists{/gist_id}","starred_url":"https://api.github.com/users/objectstack-ai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/objectstack-ai/subscriptions","organizations_url":"https://api.github.com/users/objectstack-ai/orgs","repos_url":"https://api.github.com/users/objectstack-ai/repos","events_url":"https://api.github.com/users/objectstack-ai/events{/privacy}","received_events_url":"https://api.github.com/users/objectstack-ai/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/objectstack-ai/objectstack","description":"The ontology is the software. One executable business ontology: AI writes it, the runtime runs it, agents operate it, you own it. Open protocol & runtime, Apache-2.0.","fork":false,"url":"https://api.github.com/repos/objectstack-ai/objectstack","forks_url":"https://api.github.com/repos/objectstack-ai/objectstack/forks","keys_url":"https://api.github.com/repos/objectstack-ai/objectstack/keys{/key_id}","collaborators_url":"https://api.github.com/repos/objectstack-ai/objectstack/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/objectstack-ai/objectstack/teams","hooks_url":"https://api.github.com/repos/objectstack-ai/objectstack/hooks","issue_events_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/events{/number}","events_url":"https://api.github.com/repos/objectstack-ai/objectstack/events","assignees_url":"https://api.github.com/repos/objectstack-ai/objectstack/assignees{/user}","branches_url":"https://api.github.com/repos/objectstack-ai/objectstack/branches{/branch}","tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/tags","blobs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/refs{/sha}","trees_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/trees{/sha}","statuses_url":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/{sha}","languages_url":"https://api.github.com/repos/objectstack-ai/objectstack/languages","stargazers_url":"https://api.github.com/repos/objectstack-ai/objectstack/stargazers","contributors_url":"https://api.github.com/repos/objectstack-ai/objectstack/contributors","subscribers_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscribers","subscription_url":"https://api.github.com/repos/objectstack-ai/objectstack/subscription","commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/commits{/sha}","git_commits_url":"https://api.github.com/repos/objectstack-ai/objectstack/git/commits{/sha}","comments_url":"https://api.github.com/repos/objectstack-ai/objectstack/comments{/number}","issue_comment_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues/comments{/number}","contents_url":"https://api.github.com/repos/objectstack-ai/objectstack/contents/{+path}","compare_url":"https://api.github.com/repos/objectstack-ai/objectstack/compare/{base}...{head}","merges_url":"https://api.github.com/repos/objectstack-ai/objectstack/merges","archive_url":"https://api.github.com/repos/objectstack-ai/objectstack/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/objectstack-ai/objectstack/downloads","issues_url":"https://api.github.com/repos/objectstack-ai/objectstack/issues{/number}","pulls_url":"https://api.github.com/repos/objectstack-ai/objectstack/pulls{/number}","milestones_url":"https://api.github.com/repos/objectstack-ai/objectstack/milestones{/number}","notifications_url":"https://api.github.com/repos/objectstack-ai/objectstack/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/objectstack-ai/objectstack/labels{/name}","releases_url":"https://api.github.com/repos/objectstack-ai/objectstack/releases{/id}","deployments_url":"https://api.github.com/repos/objectstack-ai/objectstack/deployments","created_at":"2026-01-18T06:47:54Z","updated_at":"2026-10-22T09:57:09Z","pushed_at":"2026-10-22T09:57:07Z","git_url":"git://github.com/objectstack-ai/objectstack.git","ssh_url":"git@github.com:objectstack-ai/objectstack.git","clone_url":"https://github.com/objectstack-ai/objectstack.git","svn_url":"https://github.com/objectstack-ai/objectstack","homepage":"https://objectstack.ai","size":754868,"stargazers_count":76,"watchers_count":76,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":false,"has_wiki":true,"has_pages":false,"has_discussions":true,"forks_count":18,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":120,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"has_pull_requests":true,"pull_request_creation_policy":"all","topics":["business-ontology","fde","fde-enablement","metadata-driven","ontology","ontology-driven-development","ontology-engineering","ontology-native","palantir","palantir-alternative","palantir-fde","palantir-foundry","palantir-ontology","salesforce-alternative"],"visibility":"public","forks":18,"open_issues":120,"watchers":76,"default_branch":"main"}},"_links":{"self":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/24467"},"html":{"href":"https://github.com/objectstack-ai/objectstack/pull/24467"},"issue":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/issues/24467"},"comments":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/issues/24467/comments"},"review_comments":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/24467/comments"},"review_comment":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/pulls/24467/commits"},"statuses":{"href":"https://api.github.com/repos/objectstack-ai/objectstack/statuses/1f11e11f011e8f37f348e6c98dbe5af1ea8fe69c"}},"author_association":"CONTRIBUTOR","auto_merge":null,"assignee":null,"active_lock_reason":null}]