Skip to content

docs(spec,skills): object-metric polarity reads the aggregate before invert; pages.md points at compareTo - #28348

Merged
os-zhuang merged 2 commits into
mainfrom
claude/project-thread-yqsh0p
Oct 31, 2026
Merged

os-zhuang merged 2 commits into
mainfrom
claude/project-thread-yqsh0p

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Tesla · project thread

Fixes #27375
Refs #27347

Clause-②: no
Metadata-protocol: none
Skills-docs: updated here

维护者速读

  • 改了什么:object-metric 的 polarity 说明补一句——徽标箭头和 polarity 都读 invert 之前的聚合值,所以 polarity 按原始值声明(错误率显示成可用率时写 lower);objectstack-ui 技能的 rules/pages.md 在 object-metric 那一行加上指向 dashboards.md 的 compareTo / polarity 小节的链接。
  • 为什么改:开了 invert 的指标卡上有两个数(原始值和 1 - 值),原文没说箭头读哪个,作者可能把好坏方向写反;从 pages.md 搭内联 KPI 的作者原先找不到 polarity 这个键。
  • 风险与回滚:纯文字改动,schema、可接受值、默认值和渲染行为都不变;pages.md 的新增由同文件删掉三处重复表述抵付,token 数不变,天花板不动。回滚即 revert 本 PR。
  • 先看:packages/spec/src/ui/component.zod.ts 的 polarity describe、skills/objectstack-ui/rules/pages.md 第 56 行与三处删减。
  • 两分钟验证:node scripts/check-skills-token-ratchet.mjs,预期全绿,pages.md 为 5689 / 5692。
  • 需要你做的:本 PR 触及 skills/**(Tier H),需要 os-zhuang 或 hotlong 的 APPROVED 评审,之后由席位落地。

What changes

S1: the polarity prose says which number it reads (packages/spec/src/ui/component.zod.ts). ObjectMetricWidget computes the derived trend from the raw fetchedValue / previousValue, while the number it shows is 1 - value under invert: true (read at 501c864d: ui/packages/plugin-dashboard/src/ObjectMetricWidget.tsx, the invert branch near L590 and derivedTrend near L684). The polarity describe now ends with one sentence: the badge and polarity read the aggregate before invert, so polarity is declared against the raw value, and an error rate shown as uptime is lower. The TSDoc above it says the same in one sentence. content/docs/references/ui/component.mdx is regenerated (check:generated named only check:docs). The SDUI manifest does not carry this describe (0 hits for the old text in sdui.manifest.json), so it is not regenerated.

S2: rules/pages.md points at the polarity rule. The object-metric row of the component catalogue now reads Single KPI widget (count/sum/avg); trend colour = polarity, see compareTo, with the link going to dashboards.md#period-over-period--compareto (the anchor the file's own table of contents uses). The pointer is paid for by deleting three restatements in the same file:

  • (the CSS is scoped to it) after "needs a stable id": the paragraph above already says the renderer compiles each node to id-scoped CSS.
  • the // responsive via the model comment in the styling example: the rule "Responsive lives in the breakpoint maps" above it says this.
  • (it is real JS, not constrained JSX) after "os build does NOT lint react source": the tier table at the top of the section says this.

Standing ruling (2026-10-27, tap A, verbatim and untranslated): 「A:先削重复,余额按实测提高」; recognised path per ruling record 6513306068. The cuts cover the whole pointer, so there is no remainder and the pages.md row in scripts/check-skills-token-ratchet.mjs is not touched.

Skill bundle readings (skills/** touched)

before (501c864d) after
skills/objectstack-ui/rules/pages.md 428 lines · 22756 bytes · 5689 tokens 428 lines · 22753 bytes · 5689 tokens (ceiling 5692)
all SKILL.md in skills/ 4607 lines 4607 lines
skills/objectstack-ui/**/*.md (evals excluded) 2055 lines 2055 lines

Changeset: .changeset/27375-object-metric-polarity-before-invert.md, @objectstack/spec patch and @objectstack/skills patch, with both declaration lines. The spec patch is measured, not assumed: after pnpm --filter @objectstack/spec build, the new describe text is in packages/spec/dist/chunk-*.{js,mjs} and json-schema/ui/ObjectMetricProps.json, and both dist and json-schema are in the package's files[].

Tests

No behaviour changes, so there is no new test and no ablation. The derived-gate set ran locally on the head named under Verification; see that section.

Acceptance notes

  • Out of scope by the dispatch ruling, and not measured here: whether the arrow should follow the displayed number when invert and compareTo are both set. Nothing in this PR changes it.

Verification

Head ebeb7783, merge base 501c864d. Derived with node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (4 paths, 30 changed lines), each line run with stdin from /dev/null and its exit code written to disk before any pipe.

  • pnpm --filter @objectstack/spec build: VERDICT command-exit 0. check:generated named only check:docs stale (13 of 14 up to date); check:generated --fix rewrote content/docs/references/ui/component.mdx and nothing else.
  • Reconciliation, dispatch-gates.mjs --repo objectstack-ai/objectstack --ran: "104 derived, 103 run, 1 NOT-MEASURED, 0 UNRUN".
  • Seven gates first refused on unbuilt prerequisites (exit 3). After deepening the clone and building the @objectstack/lint, @objectstack/client-react and @objectstack/objectql closures, six of them re-ran green.
  • NOT MEASURED: pnpm check:dual-build-cjs-loads, reason: it loads the built CJS entry of every package and 34 had no dist/; a full workspace build was not run for a prose-only diff. CI's Lint & Repo Gates runs it.
Derived gates, with exit codes
node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0
node scripts/check-adr-0087-registration.mjs --self-test :: exit 0
node scripts/check-adr-links.mjs :: exit 0
node scripts/check-adr-links.mjs --self-test :: exit 0
node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0
node scripts/check-closing-keyword-parity.mjs :: exit 0
node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0
node scripts/check-comment-mask-adoption.mjs :: exit 0
node scripts/check-comment-mask-adoption.mjs --self-test :: exit 0
node scripts/check-comment-mask-corpus.mjs :: exit 0
node scripts/check-dev-prereqs.mjs --self-test :: exit 0
node scripts/check-doc-route-spelling.mjs --advisory :: exit 0
node scripts/check-doc-route-spelling.mjs --self-test :: exit 0
node scripts/check-docs-section-name.mjs :: exit 0
node scripts/check-docs-section-name.mjs --self-test :: exit 0
node scripts/check-dts-emitted.mjs --self-test :: exit 0
node scripts/check-empty-changeset.mjs --base origin/main :: exit 0
node scripts/check-empty-changeset.mjs --self-test :: exit 0
node scripts/check-issue-citations.mjs :: exit 0
node scripts/check-plugin-teardown-shape.mjs :: exit 0
node scripts/check-section-landing-index.mjs :: exit 0
node scripts/check-section-landing-index.mjs --self-test :: exit 0
node scripts/check-skills-token-ratchet.mjs :: exit 0
node scripts/check-skills-token-ratchet.mjs --self-test :: exit 0
node scripts/ci/assert-turbo-remote-cache.mjs --self-test :: exit 0
node scripts/ci/plan-test-core-shards.mjs --self-test :: exit 0
node scripts/ci/prune-turbo-cache.mjs --self-test :: exit 0
node scripts/docs-audit/check-affected-docs.mjs :: exit 0
node scripts/docs-audit/check-drift-comment.mjs :: exit 0
node scripts/pm/release-rehearsal-clone.mjs --self-test :: exit 0
node scripts/release-pending-publish.mjs --self-test :: exit 0
pnpm --filter @objectstack/spec run check:api-surface :: exit 0
pnpm --filter @objectstack/spec run check:authorable-surface :: exit 0
pnpm --filter @objectstack/spec run check:browser-reachable-entries :: exit 0
pnpm --filter @objectstack/spec run check:docs :: exit 0
pnpm --filter @objectstack/spec run check:dual-source-exports :: exit 0
pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0
pnpm --filter @objectstack/spec run check:empty-state :: exit 0
pnpm --filter @objectstack/spec run check:entry-nameability :: exit 0
pnpm --filter @objectstack/spec run check:export-origins :: exit 0
pnpm --filter @objectstack/spec run check:exported-any :: exit 0
pnpm --filter @objectstack/spec run check:generated :: exit 0
pnpm --filter @objectstack/spec run check:liveness :: exit 0
pnpm --filter @objectstack/spec run check:llms-txt :: exit 0
pnpm --filter @objectstack/spec run check:skill-refs :: exit 0
pnpm --filter @objectstack/spec run check:strictness-ledger :: exit 0
pnpm --filter @objectstack/spec run check:variant-docs :: exit 0
pnpm --filter @objectstack/spec run check:yaml-examples :: exit 0
pnpm check:agent-test-spelling :: exit 0
pnpm check:changeset-gate-self-tests :: exit 0
pnpm check:ci-filter-parity :: exit 0
pnpm check:closed-ceremony-text :: exit 0
pnpm check:corpus-claim-drift :: exit 0
pnpm check:cross-package-test-inputs :: exit 0
pnpm check:dispatcher-error-vocabulary :: exit 0
pnpm check:doc-anchors :: exit 0
pnpm check:doc-authoring :: exit 0
pnpm check:doc-frontmatter :: exit 0
pnpm check:docs-audit-scope :: exit 0
pnpm check:docs-redirects :: exit 0
pnpm check:docs-single-h1 :: exit 0
pnpm check:docs-spec-enumerations :: exit 0
pnpm check:driver-memory-census :: exit 0
pnpm check:dts-closure :: exit 0
pnpm check:gitlink-declared :: exit 0
pnpm check:issue-citations :: exit 0
pnpm check:keyed-text-bounds :: exit 0
pnpm check:logger-receiver-detach :: exit 0
pnpm check:merge-driver :: exit 0
pnpm check:nul-bytes :: exit 0
pnpm check:org-identifier :: exit 0
pnpm check:page-declaration-shape :: exit 0
pnpm check:platform-object-tenancy-census :: exit 0
pnpm check:pm-changeset-deadline-census :: exit 0
pnpm check:pm-governed-merges :: exit 0
pnpm check:pm-prior-rulings :: exit 0
pnpm check:pm-skill-id-lint :: exit 0
pnpm check:published-files :: exit 0
pnpm check:published-readme-links :: exit 0
pnpm check:react-page-adapter-contract :: exit 0
pnpm check:refd-timer-probe :: exit 0
pnpm check:registry-log-declared :: exit 0
pnpm check:rest-log-spy-declared :: exit 0
pnpm check:role-word :: exit 0
pnpm check:skill-compatibility :: exit 0
pnpm check:skill-frame-sync :: exit 0
pnpm check:skill-identifier-liveness :: exit 0
pnpm check:slot-lookup :: exit 0
pnpm check:sourcemap-no-sources-content :: exit 0
pnpm check:spec-docblock-symbol-anchors :: exit 0
pnpm check:spec-parsed-alias :: exit 0
pnpm check:system-context-census :: exit 0
pnpm check:test-source-alias :: exit 0
pnpm check:tier-file-adoption :: exit 0
pnpm check:undeclared-dep-imports :: exit 0
pnpm check:vendor-version-stamps :: exit 0
pnpm check:watch-hint-literal :: exit 0
node scripts/check-plugin-teardown-shape.mjs --self-test :: exit 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0
pnpm --filter @objectstack/lint run check:doc-security-posture :: exit 0
pnpm --filter @objectstack/spec run check:skill-examples :: exit 0
pnpm check:docs-transcript-drift :: exit 0
pnpm check:dual-build-cjs-loads :: exit 3
pnpm check:lean-entry-closure :: exit 0

Generated by Claude Code

…invert; pages.md points at compareTo

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L9qibyvwrLkwf1kTpdV1Qc
…metric polarity prose

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L9qibyvwrLkwf1kTpdV1Qc
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation protocol:ui tooling labels Oct 31, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

1 anchor(s) derived from 1 changed package(s); no hand-written page names any of them, so this run has nothing to list — not a clean bill of health. This check sees only pages that NAME a derived anchor: one that documents this change in prose, or enumerates it in an authoring dialect, names none and stays invisible to it on every run.

What this run could not see
  • the SDK route bridge reached 59 of 211 client-bound route-ledger rows — the other 152 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 152: 0 are remediable by widening that discovery convention (an in-repo file declares the path; the convention did not scan it); 55 are structural — on a ledger where NOT ONE row is declared in-repo, so no discovery change reaches them at any price; 97 are undecided (no in-repo declaration, on a ledger that has other in-repo registrars — absence and an unreadable spelling are not distinguishable here). The rows themselves: node scripts/docs-audit/affected-docs.mjs --bridge-coverage
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 168 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 3fd803379817e495cd0011627c8b4a347f9dcc6a → packageMentionDocs.

Which tree this was computed on

This run read content/docs from 4ebf7adadaf7c70641cfceb67ac03c136c61baf9 — the merge of head ebeb778357c244efe0aa3e7d540cfc767875df3b into base 3fd803379817e495cd0011627c8b4a347f9dcc6a, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 4ebf7adadaf7c70641cfceb67ac03c136c61baf9 && git checkout 4ebf7adadaf7c70641cfceb67ac03c136c61baf9
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 3fd803379817e495cd0011627c8b4a347f9dcc6a ebeb778357c244efe0aa3e7d540cfc767875df3b && git checkout -B drift-repro 3fd803379817e495cd0011627c8b4a347f9dcc6a && git merge --no-ff ebeb778357c244efe0aa3e7d540cfc767875df3b

node scripts/docs-audit/affected-docs.mjs --json 3fd803379817e495cd0011627c8b4a347f9dcc6a

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:spec#1 · os-tesla · session_01L9qibw58ehQ2gRHP2h2Puz

Contract-review-claim: session_01L9qibw58ehQ2gRHP2h2Puz · head ebeb778357c244efe0aa3e7d540cfc767875df3b · 2026-10-31T05:56Z

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:spec#1 · os-tesla · session_01L9qibw58ehQ2gRHP2h2Puz

Contract review

Served-tier: TIER_DEFAULT
Head-sha: ebeb778357c244efe0aa3e7d540cfc767875df3b
Local-runs: none

Inputs: card #27375 (body: S1 and S2 from record 6487637026 on #27361; the retriage request 6538256731, triage's answer 6538712945 relabelling the card domain:spec with S2 riding the same PR as a one-PR exception, the seat's claim 6539482364, the dev report 6539789099), PR #28348 (body, the docs-drift comment, the file list of 4 files, the diff of 30 lines against main, the two commits from the merge-base 501c864), the 55 check-runs on this head (read 2026-10-31T06:30Z: all 55 runs completed, none failed, none cancelled, none in progress; success: Build & E2E UI, Build Core, Build Docs, Build UI Deps, Check Changeset, Check Documentation Links, Dogfood Regression Gate, Flag docs affected by code changes, Governed Surface Queue Guard, Lint & Repo Gates, Lint · CI, release & engine gates, Lint · ESLint, Lint · PM dispatch-gates, Lint · docs & code guards, Lint · repo & tooling gates, Lint · scoped · query-options erasure, Lint · scoped · slot lookup & corpus, Lint · scoped · tooling self-tests, Live E2E UI, PR-body guards (claim · duplicate · Part-of · single-writer path), Plan Test Core shards, Spec property liveness, Test Core, Test Core (all 8), Test UI, Type Check UI, Type Check · consumer gates, Type Check · debt ledger, Type Check · source gates, Type Check · workspace, TypeScript Type Check, filter; skipped: 18.x upgrade harness (opt-in), Auto Label, Check PR Size, Dogfood Regression Gate (matrix shard/3), Dogfood Verify CLI, Lint UI, Packed-tarball smoke (opt-in), Schedule gate · skip when a green push run covers the commit, Temporal Conformance (live PG + MySQL), Test UI (matrix shard/16), UI Published Artifacts), and the tree on main for ObjectMetricWidget.tsx (the invert branch at :589 to :590 rewrites displayValue alone, magnitude-gated to 0..1; derivedTrend at :684 to :688 is computed from fetchedValue and previousValue, which invert never touches), pages.md at this head (the three cut sentences and the paragraphs that already carry them) and dashboards.md (the heading "Period-over-period — compareTo" at :227). The head is mergeable and clean against today's main (merge-tree clean); none of the files main moved since the merge-base is in this diff.

① Derived judgments

  • S1: the sentence is true of the renderer - right. The widget shows 1 - value under invert but derives the trend from the raw aggregate and its previous-period value, so the arrow and the polarity colour both follow the raw number. The example is right as well: an error rate shown as uptime rises when things get worse, so its good direction is lower. The TSDoc and the describe say the same thing in one sentence each; the describe is the one that ships (component.mdx regenerated by check:docs, the json-schema built from it is not git-tracked and needs no regeneration here).
  • S2: the pointer and its payment - right. The object-metric catalogue row now names polarity and links the compareTo section of dashboards.md, where the tile's polarity bullet lives. The three deletions each remove a sentence the same file still states: "id-scoped CSS at render time" (:238) carries "the CSS is scoped to it"; "Responsive lives in the breakpoint maps" (:251) carries the "responsive via the model" comment; the tier table's react row ("real React", JS runs) beside the html row ("constrained JSX, parsed, never executed") carries "it is real JS, not constrained JSX". Token count 5689 before and after against the 5692 ceiling in check-skills-token-ratchet.mjs, which is not edited; the ratchet gate runs in Lint & Repo Gates. Warren's ruling A (cut duplicates first, raise only by the remainder) is followed with no remainder.
  • Accept-set: nothing an author writes moves - right. The describe text changes, the enum, default and renderer do not. Clause-②: no and Metadata-protocol: none are right.
  • Check-runs as gate verdicts - read as above; every run on this head completed and none is red, cancelled or in progress at the read.

② Semver level

  • @objectstack/spec patch, @objectstack/skills patch - accepted. The spec entry is the lane's precedent for a describe-only change whose text ships in the built package (measured by the dev in dist and json-schema, both in files[]); the skills entry covers the shipped rule file.

③ Boundary flags

  • Tier H by skills/** - the seat posts its ACCEPT and requests os-zhuang / hotlong; a human approval lands it. This record is the review that ACCEPT names.
  • Serial overlap with fix(plugin-calendar): a calendar opens on the date its calendar.initialDate declares #28334 on content/docs/references/ui/component.mdx - both PRs regenerate that page (different rows). Whichever lands second merges main and re-runs check:generated; no hand-written hunk is shared, so no delta review is owed for that alone.
  • The link anchor is hand-computed and no gate holds it - dashboards.md#period-over-period--compareto is the slug GitHub derives from the heading at :227 (em dash and backticks dropped, the two spaces becoming two hyphens), and it is the first cross-file link in the objectstack-ui rules. Correct today; if the heading is ever reworded the link goes stale silently. Not owed here.
  • Out of scope, as the card ruled - whether the arrow should follow the displayed number when invert and compareTo are both set stays unmeasured; the describe now states the current behaviour, which is what an author needs to declare polarity correctly.
  • No name approval owed - no new key.

Verdict reasoning. One true sentence about the renderer, placed where the key is declared and in the page generated from it; one pointer in the skill paid for by three exact duplicates in the same file with the token ceiling untouched; patch entries for both shipped surfaces; the head is clean against main and every check is green or skipped.

Implemented-by: claude/project-thread-yqsh0p
Reviewed-by: session_01L9qibw58ehQ2gRHP2h2Puz

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:spec#1 · os-tesla · session_01L9qibwb6hBqszPTYJobitm

维护者速读

  • 改了什么: object-metric 的 polarity 说明补了一句:徽标箭头和 polarity 都读 invert 之前的原始聚合值,所以 polarity 要按原始值来声明(比如错误率显示成可用率时写 lower)。另外,objectstack-ui 技能 rules/pages.md 里 object-metric 那一行加了一个指向 dashboards.md 中 compareTo 小节的链接。
  • 为什么改: object-metric polarity: say the badge reads the value before invert, and point pages.md's object-metric row at the polarity rule #27375。开了 invert 的指标卡会显示两个数,原文没说箭头读的是哪个,作者容易把好坏方向写反。
  • 风险与回滚: 只改文字,schema、可接受值、默认值和渲染都不变。pages.md 新增的那行,由同一文件删掉的三处重复说法抵付,token 数仍是 5689(上限 5692,上限不动)。回滚即 revert。
  • 先看: skills/objectstack-ui/rules/pages.md 改动的 4 行,以及 packages/spec/src/ui/component.zod.ts 里 polarity 的 describe。
  • 两分钟验证: 运行 node scripts/check-skills-token-ratchet.mjs,pages.md 应为 5689 / 5692。
  • 需要你做的: 本 PR 触及 skills/**,属于 Tier H,需要 os-zhuang 或 hotlong 给一个 APPROVED 评审,之后由席位落地。契约复审已 PASS(6540109832)。
  • 席位意见: ACCEPT,批准后即可落地。

席位核对 · ACCEPT · domain:spec seat 1 (#6017) · 2026-10-31T14:40Z

Head ebeb778357c244efe0aa3e7d540cfc767875df3b, merge base 501c864d. Card #27375, claim 6539482364, os-dev-report 6539789099. The maintainer's ruling, verbatim: 「按 pm-dispatch 审过的pr你可以自主落地」. Tier H still needs a human APPROVED review.

  • Shape: a draft to main opened by the relay. It carries Fixes #27375, Refs #27347, Clause-②: no, Metadata-protocol: none and Skills-docs: updated here. The changeset bumps @objectstack/spec and @objectstack/skills at patch, which ruling A requires when the metadata protocol is none.
  • Contract review: record 6540109832 on this head, PASS, with no blocking finding and no should-fix. Its boundary notes, the hand-computed anchor and the shared component.mdx regen with fix(plugin-calendar): a calendar opens on the date its calendar.initialDate declares #28334, need no action here.
  • Gates: every check-run on this head is success or skipped. mergeable_state is clean.
  • Governed: check-governed-merges --pr 28348 reports Tier H through skills/** ×1 (skills/objectstack-ui/rules/pages.md), +23/−7.
  • Landing: pr_ready in this act, which requests the GOVERNED_APPROVERS reviewers. The seat arms automerge_enable after an APPROVED review on this head. If the head moves first, a fresh contract record is owed.

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 31, 2026 14:41
@os-zhuang
os-zhuang added this pull request to the merge queue Oct 31, 2026
Merged via the queue into main with commit 4fa4f2c Oct 31, 2026
59 checks passed
@os-zhuang
os-zhuang deleted the claude/project-thread-yqsh0p branch October 31, 2026 15:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation protocol:ui size/s tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

object-metric polarity: say the badge reads the value before invert, and point pages.md's object-metric row at the polarity rule

2 participants