Skip to content

chore(deps): bump lucide-react from 1.29.0 to 1.31.0 - #4959

Merged
github-actions[bot] merged 1 commit into
mainfrom
dependabot/npm_and_yarn/lucide-react-1.31.0
Aug 17, 2026
Merged

github-actions[bot] merged 1 commit into
mainfrom
dependabot/npm_and_yarn/lucide-react-1.31.0

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Aug 17, 2026 •

Copy link
Copy Markdown
Contributor

Bumps lucide-react from 1.29.0 to 1.31.0.

Release notes

Sourced from lucide-react's releases.

Version 1.31.0

What's Changed

New Contributors

Full Changelog: lucide-icons/lucide@1.30.0...1.31.0

Version 1.30.0

What's Changed

New Contributors

Full Changelog: lucide-icons/lucide@1.29.0...1.30.0

Commits

@dependabot dependabot Bot added automated Opened or maintained by automation (Dependabot, release bot) dependencies labels Aug 17, 2026
Bumps [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) from 1.29.0 to 1.31.0.
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/1.31.0/packages/lucide-react)

---
updated-dependencies:
- dependency-name: lucide-react
  dependency-version: 1.31.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Merged via the queue into main with commit c1454a2 Aug 17, 2026
18 of 20 checks passed
@dependabot
dependabot Bot deleted the dependabot/npm_and_yarn/lucide-react-1.31.0 branch August 17, 2026 08:13
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 24.7 KB 350 KB
Entry file index-bAGAmeZU.js —
Status PASS —

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 9.56KB 3.59KB
app-shell (runtime-config.js) 7.42KB 2.32KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 8.92KB 3.41KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 25.13KB 5.40KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.13KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.64KB 2.21KB
auth (SocialSignInButtons.js) 9.60KB 3.89KB
auth (UserMenu.js) 3.40KB 1.22KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.79KB
auth (createAuthenticatedFetch.js) 6.34KB 2.43KB
auth (index.js) 2.71KB 1.22KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.02KB 0.88KB
auth (useIsWorkspaceAdmin.js) 1.61KB 0.85KB
collaboration (CommentThread.js) 26.07KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.65KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 498.79KB 111.24KB
core (index.js) 4.06KB 1.61KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 157.40KB 43.42KB
fields (index.js) 233.27KB 58.22KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.28KB 1.75KB
i18n (index.js) 3.35KB 1.38KB
i18n (pickLocalized.js) 3.69KB 1.73KB
i18n (provider.js) 23.12KB 7.62KB
i18n (useDisplayLocale.js) 2.84KB 1.45KB
i18n (useObjectLabel.js) 27.59KB 6.63KB
i18n (useSafeTranslation.js) 7.77KB 3.13KB
layout (index.js) 39.16KB 10.97KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.74KB
mobile (index.js) 1.50KB 0.62KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.71KB 0.42KB
mobile (useResponsiveConfig.js) 1.36KB 0.63KB
mobile (useSpecGesture.js) 4.32KB 1.64KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 9.35KB 3.31KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 4.42KB 1.42KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.91KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.52KB
permissions (usePermissions.js) 1.81KB 0.83KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 46.62KB 12.83KB
plugin-charts (index.js) 64.75KB 18.37KB
plugin-chatbot (index.js) 181.21KB 43.14KB
plugin-dashboard (index.js) 127.85KB 32.73KB
plugin-designer (index.js) 212.39KB 42.83KB
plugin-detail (index.js) 239.90KB 60.01KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 120.42KB 29.03KB
plugin-gantt (index.js) 164.10KB 39.87KB
plugin-grid (index.js) 197.58KB 53.00KB
plugin-kanban (index.js) 52.72KB 14.54KB
plugin-list (index.js) 111.23KB 26.97KB
plugin-map (index.js) 17.91KB 5.72KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 41.97KB 11.33KB
plugin-timeline (index.js) 26.68KB 7.66KB
plugin-tree (index.js) 8.50KB 2.88KB
plugin-view (index.js) 83.81KB 20.49KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.44KB 0.22KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 27.53KB 9.41KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.28KB 0.68KB
react (schema-input.js) 1.45KB 0.83KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 4.09KB 1.74KB
sdui-parser (index.js) 4.55KB 2.07KB
sdui-parser (parse.js) 10.76KB 3.17KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 4.69KB 1.48KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 0.99KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 0.20KB 0.18KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 0.20KB 0.18KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.87KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-retry.js) 4.32KB 2.02KB
types (index.js) 3.05KB 1.52KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 2.59KB 1.31KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (spec-report.js) 5.05KB 1.93KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 0.20KB 0.18KB
types (ui-action.js) 3.40KB 1.71KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

yinlianghui pushed a commit that referenced this pull request Aug 17, 2026
自审补一处:`GATE_TIMEOUT_SECONDS` 走 `Number()`,拼错(如 `40 minutes`)得到
`NaN`,而 `elapsedMs >= NaN` 恒假 —— deadline 事实上被关掉,门会一直轮询到
runner 按 `timeout-minutes: 50` 杀掉 job。方向仍是 fail-closed(不合并),但白烧
50 分钟 runner,且报成「超时」而不是它真正的身份「配置写错」。改为 `readDuration()`
校验:非有限值或非正数立即抛出。

顺带:`main()` 补显式 JSDoc 参数类型 —— 在 `strict` 下,JS 解构参数中没有默认值的
绑定会从推断签名里消失,于是注入用的 `api` 在调用点变成类型错误(`tsconfig.scripts.json`
会编译这些 pin 测试)。

`#4959` 快照那条断言把「合并瞬间仍在飞行」的数量钉成精确 9 条(8 条必需 +
optional 的 Bundle Analysis),fixture 改动无法悄悄削弱这个案例。

Co-authored-by: Claude <noreply@anthropic.com>
akarma-synetal pushed a commit to akarma-synetal/objectui that referenced this pull request Aug 23, 2026
…bjectstack-ai#4987)

* ci(dependabot): 合并前显式等待完整检查集,停用无条件 auto-merge (objectstack-ai#4973)

`dependabot-auto-merge.yml` 对每个 patch/minor bump 无条件执行
`gh pr merge --auto --squash`。`--auto` 在「GitHub 认为可合」的那一刻落地,也就是
**分支保护必需集**被满足的那一刻 —— 而它与「本仓实际跑的检查」是两个不同的集合。
2026-08-17 这个差值把一个红的提交送上了 `main`:objectstack-ai#4959 在 08:13:36Z 合入,此时它
19 条 check 里有 9 条仍在飞行,shard 3/4 与 shard 1/4 分别在 5m25s、8m20s 后报
`failure`。4 分片 test 矩阵按设计就是全仓最慢的 job(它存在的理由正是压掉约 9 分钟
墙钟),所以它是 `--auto` 系统性跑过去的那一条;`main` 变红阻断了所有并行 agent,
直到 objectstack-ai#4968 修回,七天内第二次(objectstack-ai#4098)。这条通道与被 bump 的包无关:任何落在慢
job 上的红都能骑它进来,即 objectstack-ai#3523 / objectstack-ai#3243 的同一形状。

现在等待是显式的,并且由本 workflow 自己承担:`scripts/dependabot-merge-gate.mjs`
对该 PR 的 head SHA 轮询 Checks API 给出裁决,approve 与 enqueue 两个副作用都挂在
`gate == 'green'` 之后,合并再用 `--match-head-commit` 钉到被裁决的那个 SHA。必需
上下文缺失、到点仍未决、或结论非 `success`,都不算绿:不合并、job 变红、并在 PR 上
留下说明是谁拒绝的评论。semver 策略(patch/minor 自动、major 仅评论)未改;合并动作
仍是 `--auto`,因为强制合并队列会用 405 拒绝直接合并。

`scripts/__tests__/dependabot-merge-gate.test.ts` 回放 objectstack-ai#4959 实测的 check-run 时间线,
把反事实钉成断言:08:13:36Z 判 `pending`(不合并)、shard 3/4 一报到即判 `red`;并断言
三个声明桶恰好划分 `pull_request` 类 workflow 实际产出的 check 名集合 —— 改名或新增
job 会让测试红,而不是悄悄从等待集里掉出去。

未处理(属仓库设置面,仓内既读不到也改不了):分支保护 / 合并队列必需集本身。它可证
不含 4 个 shard —— 合并发生时四片全部 `in_progress`。

Co-authored-by: Claude <noreply@anthropic.com>

* ci(dependabot): 门的配置错误改为立刻抛出,而不是把 deadline 关掉 (objectstack-ai#4973)

自审补一处:`GATE_TIMEOUT_SECONDS` 走 `Number()`,拼错(如 `40 minutes`)得到
`NaN`,而 `elapsedMs >= NaN` 恒假 —— deadline 事实上被关掉,门会一直轮询到
runner 按 `timeout-minutes: 50` 杀掉 job。方向仍是 fail-closed(不合并),但白烧
50 分钟 runner,且报成「超时」而不是它真正的身份「配置写错」。改为 `readDuration()`
校验:非有限值或非正数立即抛出。

顺带:`main()` 补显式 JSDoc 参数类型 —— 在 `strict` 下,JS 解构参数中没有默认值的
绑定会从推断签名里消失,于是注入用的 `api` 在调用点变成类型错误(`tsconfig.scripts.json`
会编译这些 pin 测试)。

`objectstack-ai#4959` 快照那条断言把「合并瞬间仍在飞行」的数量钉成精确 9 条(8 条必需 +
optional 的 Bundle Analysis),fixture 改动无法悄悄削弱这个案例。

Co-authored-by: Claude <noreply@anthropic.com>

* ci(dependabot): 写明门的边界是 check run 而非 commit status (objectstack-ai#4973)

本 PR 自己的 CI 上发现:本仓 SHA 上还挂着一条**第三方 commit status**(`Vercel`,
PR 上多为 success / "Canceled by Ignored Build Step")。门读的是 check run,不读
commit status —— 也就是说一条红的 Vercel status 不会拦住 dependabot 合并。

这是**声明边界**,不是漏洞,也不是回归(被替换掉的无条件 `--auto` 什么都不等)。
故意留在门外:要求一个第三方预览部署,等于让一次与本仓无关的服务故障阻断所有依赖
升级,这笔取舍该由维护者决定而非热修顺手做。写进文件头,并加一条断言钉住这段说明,
免得下一个读者只能从「调用了哪个 endpoint」去反推覆盖范围。

Co-authored-by: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
akarma-synetal pushed a commit to akarma-synetal/objectui that referenced this pull request Sep 28, 2026
… -> 8, dist pins get their own job (objectstack-ai#9584)

Fixes objectstack-ai#9499

Scope is the director-seat ruling (comment `5682566291`, batch objectstack-ai#135 item
1, letter **C**), not the card body, which predates it. All three
changes land in one PR.

## What changed

| | |
|---|---|
| `test-aggregate` (`name: Test`) | New. `needs: [test,
test-dist-pins]`, `if: always() && github.event_name != 'push'`. The
single required test context. |
| `test` | Matrix 4 → 8, `pnpm test --shard=N/8`. `timeout-minutes: 20`
**unchanged**; no test skipped, disabled or quarantined; the relevance
gate **not** widened. |
| `test-dist-pins` (`name: Test (dist pins)`) | New. The shard-1-only
`Run built-artifact pins (dist project)` step, lifted out of the matrix,
carrying the `test` job's relevance gate **verbatim**. |

## ⭐ The acceptance: a shard forced to `skipped` turns the aggregator
red — measured, not argued

`needs.test.result` alone is a phantom gate, and the measurement says so
in two ways. Both readings are from a real Actions run on branch
`claude/issue-9499-proto` (workflow `PROTO 9499`), which stands in for
the shard matrix with trivial jobs so the mechanism is the only thing
under test.

Run
[`35045618251`](https://github.com/objectstack-ai/objectui/actions/runs/35045618251),
attempt 1. Read back with `GET /actions/runs/{id}/attempts/1/jobs` and
`GET /check-runs/{id}/annotations` — raw job logs are served from a blob
host this agent's egress is denied, so the proto emits its readings as
annotations, which the REST API does serve.

| job | conclusion |
|---|---|
| `Test (shard 1/4)`, `(2/4)`, `(4/4)` | `success` |
| `Test (shard 3/4)` — **forced to skip** with `if: false` | `skipped` |
| `PROTO allskip (…)` — a 2-leg matrix whose whole job carries `if:
false` | `skipped` |
| ⛔ `PROTO naive aggregator` — `needs: [test, test-shard-3]`, **no**
`always()` | **`skipped`** |
| ⭐ `Test` — the real `scripts/check-test-shard-results.mjs` |
**`failure`** |

**The gate's own annotation on that failure**, verbatim:

> `Test` :: 1 test shard(s) did not report success: Test (shard 3/4)
(skipped). ⛔ 'skipped' is not a pass here -- that is the whole reason
this gate reads each shard instead of the matrix rollup (objectui#9499).
> :: Process completed with exit code 3.

**The rollup, on the same run**, verbatim:

> `ROLLUP` :: needs.test.result=success (3-leg matrix, every leg
success) | needs.test-shard-3.result=skipped (one job, if: false) |
needs.allskip.result=skipped (2-leg matrix, whole job if: false)
> `ROLLUP SEEN BY THE GATE` :: needs.test.result=success

⇒ two distinct phantom shapes, both measured on the same run:

1. **`needs.test.result` reads `success`** on a run where a job named
`Test (shard 3/4)` was `skipped`. An aggregator that trusted the shard
matrix's rollup would have been green there. The gate that reads each
shard's own conclusion is red.
2. ⭐ **A `needs:`-without-`always()` aggregator is itself `skipped`** —
and a skipped *required* context counts as **success** in branch
protection, so that aggregator does not merely mis-report, it vanishes.
`test-aggregate` carries `if: always()` for exactly this.

⚠️ One shape could **not** be produced and is reported as such rather
than asserted: GitHub does not expose the `matrix` context to a
job-level `if:`, so a single leg cannot be skipped while its siblings
succeed. The forced-skipped shard above is therefore its own job under
the shard's name — which is what the gate looks at anyway, since it
reads job names and conclusions, not matrix membership. The reachable
shapes are the three the gate covers: the whole matrix skipped, a leg
missing from the matrix, and a leg failed/cancelled/timed-out.

## How the gate works

`scripts/check-test-shard-results.mjs` reads **this run's own job list**
from `GET /actions/runs/{id}/attempts/{n}/jobs` (`actions: read`,
nothing written) and asserts each shard **by name and by its own
conclusion**. `skipped` is not a pass. It fails closed — an unreadable
answer is exit 2 and a red context — and it refuses any verdict over a
job list that does not contain its own job, because that endpoint
answers `200` with an empty list for a run id that does not exist, which
would otherwise make "no shards found" and "every shard was removed" the
same reading.

The dist-pin job is asserted straight from
`needs.test-dist-pins.result`: a non-matrix job's result is its own
conclusion and `skipped` is visible in it, so no API read says anything
more.

The shard **count** is the one thing the script does not derive.
`scripts/__tests__/check-test-shard-results.test.ts` pins the `--shards`
argument written in `ci.yml` against `ci.yml`'s own `shard: [...]`
matrix, and pins the shard-name spelling against the workflow through
the same parser `dependabot-merge-gate.test.ts` uses. Drift is red,
locally and loudly — which is the difference from the
repository-settings surface the count used to be welded to.

## Why the ruleset rename was the blocker

Naming the legs made the shard count a member of GitHub ruleset
`11776024`: 4 → 8 renames four live required contexts at once, and
between the rename and the settings edit every pull request blocks
forever on a check that can no longer report while every queue build
burns the ruleset's 60-minute status-check timeout. ⛔ **This PR is not
mergeable on its own** — the ruling sequences three steps around it
(remove the four `Test (shard n/4)` contexts, merge, add `Test`), and
that sequencing is the lane seat's and the maintainer's, not this PR's.

Two consequences recorded rather than left to be discovered:

- `WATCHED_CONTEXTS` in `scripts/check-required-check-set.mjs` now names
the set the ruling installs. Between this merge and the third step the
live answer is the old one, so the patrol reports **`drifted` — exit 0,
printed in the run summary, never red**. That is objectui#9422's
two-tier split doing exactly what it was built for. A new test pins that
reading against the committed 2026-09-14 live fixture, naming both
halves (`Test` missing, the four shard names unexpected).
- `REQUIRED_CONTEXTS` names `Test` instead of the four shards; the eight
shards and `Test (dist pins)` move to `NOT_A_GATE` with the reason. They
are blocking legs — the difference is that one context reports their
verdict.

## The objectstack-ai#4959 counterfactual, re-read

`dependabot-merge-gate.test.ts` carries a frozen verbatim record of the
2026-08-17 incident. It is not edited. What changed is what today's
required set makes of it: the four shard names moved from `pending` to
one `missing` name, and the case now asserts that too, so the drop from
nine pending contexts to five cannot stand for a weakened case.

⚠️ That file used to end a case with *"a gate that waited for `Test` as
one name, or for whichever shard reported first, would have merged this
pull request"*. That warning is about a single check **produced by** a
shard, which reports while its siblings still run. `test-aggregate` has
a `needs:` edge to every leg, so it cannot report before the last of
them, and it is red unless each leg's own conclusion is `success`. The
replacement case states that difference as behaviour, with a control in
the same command: the same snapshot with the same two failed shards is
green when the aggregator says `success`, so the red is the aggregator
speaking and not a residual shard name.

## Local verification

Every exit code below was redirected to a file and captured before any
pipe. Worktree `objectui-issue-9499`, tree clean, at `d3e01fe48`.

| command | exit |
|---|---|
| `pnpm exec vitest run --project unit scripts/__tests__` | **0** — 165
files passed, 2 skipped; 4798 tests passed, 2 skipped |
| `pnpm type-check:scripts` | 0 |
| `pnpm check:control-bytes` | 0 — 7740 tracked text files scanned |
| `pnpm check:required-check-set` | 0 |
| `pnpm check:merge-queue-head` | 0 |
| `pnpm check:entry-guard` | 0 |
| `pnpm check:test-path-roots` | 0 |
| `pnpm check:action-ref-convention` | 0 |
| `pnpm check:shell-escape-residue` | 0 |
| `pnpm check:pre-install-import-graph` | 0 |
| `pnpm lint:coverage` | 0 |
| `pnpm docs:check-links` | 0 |
| `pnpm check:doc-fences` · `check:doc-types` · `check:doc-example-ids`
· `check:spec-symbols` · `check:new-line-citations` | 0 |
| `pnpm check:governed-queue-guard` | 0 |
| `node scripts/check-changeset-presence.mjs` | 0 |
| `pnpm check:doc-snippets` | **2 — NOT MEASURED** |

**`check:doc-snippets` is exit 2, which its own output calls
`PRECONDITION NOT MET (exit 2) — The snippet program was NOT run`,
explicitly "not a verdict about any document".** It needs a 34-package
build first. Recorded as not measured rather than as a pass or a
failure. The bound on what that leaves open: this change adds **zero**
code fences to the page (`git diff -- content/docs | grep -c '^+.*```'`
→ `0`), and `check:doc-fences` is green over it.

**changeset — the gate's own verdict line, quoted:**

> `✅ No source or published contract of a released package changed in
this range, so no changeset is owed.`
> `Compared the working tree with f7fcc2c (merge-base with
origin/main): 16 file(s) changed, 0 of them published source of a
package the release covers, 0 of them a manifest whose published
contract moved, 0 under a package changesets ignores, 0 changeset(s)
added.`

⛔ No `skip-changeset` label is applied and no empty-frontmatter
changeset is written: `grep -rn skip-changeset .github/ scripts/`
outside `__tests__` returns zero and `ci-cd-pipeline-doc.test.ts` pins
that label as a phantom.

**lint, narrowed and declared.** `eslint --no-inline-config` over the
**11** changed JS/TS files (count read from `--format json`): exit 0, 0
errors, 0 warnings. Population: the repo-wide `pnpm lint` scan is CI's
and is not run here. Invariance: this repo's flat config sets no
`parserOptions.project` / `projectService`, so no rule in it is
type-aware and nothing in this diff can move the verdict on a file the
diff does not touch.

⛔ No build, no `dom` project and no package test run: this diff touches
`.github/workflows/**`, `scripts/**` and `content/docs/**` only, and
`scripts/` is not a workspace package, so the affected-package closure
is empty. Every test that reads any file in this diff lives under
`scripts/__tests__`, and all 167 of those files ran.

## Acceptance notes

- **Zone 2 assumption 1 — the coverage lane is NOT coupled.**
`test-coverage` declares its own `shard: [1, 2, 3, 4]`, its own
`--shard=N/4` and its own `blob-N-4.json` file names; nothing is shared
with the `test` matrix. The `ci.yml:741` sentence *"sharded the same 4
ways"* was a description, not a coupling, and it is now reworded to say
so. **No coverage-lane change is required by this card**, which is the
reading objectui#9271 needs.
- **Zone 2 assumption 2 — half falsified.** `check:merge-queue-head`
pins no check name at all. `check:required-check-set` pins only `Type
Check`; the shard names are in the *watched* tier, whose absence is
reported and never red — but a separate assertion (*"every pinned and
watched name is declared blocking in `REQUIRED_CONTEXTS`"*) does couple
them, so the update was in scope after all, for a different reason than
the one assumed.
- **Zone 2 assumption 4 — falsified.**
`content/docs/guide/ci-cd-pipeline.md` is forced, and not by the
add-a-workflow rule: `ci-cd-pipeline-doc.test.ts` pins the job table
against `ci.yml`'s `jobs:` keys **in both directions**, pins each row's
*Appears as* against the job's `name:`, and pins each row's *What it
runs* against the job's first-party commands. Two new jobs means two new
rows or a red test.
- **A matrix leg cannot be skipped while its siblings succeed.** GitHub
does not expose the `matrix` context to a job-level `if:`, so the
literal "mixed rollup" shape cannot be produced from a matrix. The
reachable forms are: the whole matrix skipped, a leg removed from the
matrix, and a leg failing or cancelled. The gate covers all three, and
the proto run demonstrates the first and third.
- noted, not filed: the page's Core CI section stated *"Every job runs
in parallel — there are no `needs:` edges between them"*, which
`coverage-report` (`needs: test-coverage`, objectui#5403) had already
falsified. Corrected here because this PR adds the second such edge and
the sentence sits in the paragraph the new rows belong to. Successor:
whoever next edits that section — this PR is that editor.
- noted, not filed: three workflow comments (`changeset-release.yml`,
`check-links.yml`, `labeler.yml`) enumerate the required set as it
stood, each under an explicit `Re-measured … at 2026-09-06T17:20Z`
dateline. A dated fact cannot drift, so they are left alone. The
present-tense claims about the same set — `lint.yml`'s step comment,
three `scripts/__tests__` headers and two paragraphs of the page — are
corrected here, because this change is what made them false. Successor:
none needed.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_015h79niBMyoB1xcaQje3uiz

---
_Generated by [Claude
Code](https://claude.ai/code/session_015h79niBMyoB1xcaQje3uiz)_

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Steve Jobs <steve@objectstack.ai>
Co-authored-by: os-zhuang <jack@objectstack.ai>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants