Skip to content

docs(skills): pages.md says what a page type, template and region name run - #23758

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-23610-skills-pages-contract
Oct 16, 2026
Merged

os-zhuang merged 2 commits into
mainfrom
claude/issue-23610-skills-pages-contract

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #23610
Clause-②: no

Executes ruling 6190536588 item 4 under claim 6204703954: skills/objectstack-ui/rules/pages.md says what PR #23708 makes the page contract. This PR is the card's last piece and carries its closing keyword (#23708 is Part of #23610). It turns ready only after #23708 has merged — the seat marks it; the dev does not — and, as a skills/** diff (governed, Tier H), it lands only after a human approval, by the seat.

What changes

One skill file, skills/objectstack-ui/rules/pages.md, plus a @objectstack/skills patch changeset. Every sentence follows the spec text #23708 lands — PageTypeSchema's docblock and enum comments, PageTemplateSchema, PAGE_TEMPLATE_SLOTS, checkPageRegionPlacement, misplacedDefaultPageRefusal, the utility print refusal — and content/docs/ui/pages.mdx's new wording. Nothing the spec does not declare enters the skill.

Where (line on main) Was Now
Page Types table, home (24) App home / landing page Widest region page; not a landing (isDefault refused): an app opens on its first navigation item
Page Types table, app (25) App-level page with navigation context Region page at app width
Page Types table, utility (26) Floating utility panel (e.g. notes, phone dialer) Narrow inline region page for a tool (notes, a dialer); no floating or docked shell slot exists
Disambiguation paragraph (29–34) "…a utility panel is type: 'utility'…" plus a restatement of the table's three type values The no-such-type list and the visualizations-are-not-page-types sentence stay; the restated type values go (the table carries them)
Templates & Regions (38–41) three-column / two-column / single-column; regions header, left_sidebar, main, right_sidebar, footer default (header, sidebar, main, aside, footer), header-sidebar-main (header, sidebar, main), three-column (the same five), dashboard (header, footer; other regions are grid cells); full-width retired; on a kind: 'full' page a region the template does not place, or a second region for a filled slot, is refused at its name; left column sidebar, right aside
Print pages (71–72) "a utility panel" "a utility page"
Source tiers (137–138) "The legacy value kind:'jsx' is a deprecated alias for kind:'html'" "kind:'jsx' is retired: the parse refuses it and names kind:'html'" (#23543 F5-jsx, PR #23638)

The home row's landing sentence is the one misplacedDefaultPageRefusal prints (an app's landing is its first navigation item); the utility row's is PageTypeSchema's ("no floating or docked shell slot"); the template sentence is PAGE_TEMPLATE_SLOTS plus checkPageRegionPlacement's two refusals (unplaced region; second region for a filled slot). The file mentioned no page default or landing anywhere else, so nothing else moved.

Token ratchet — paid in the same file

check:skills-token-ratchet holds rules/pages.md at ceiling 5692 with 6 tokens of headroom on main. The new sentences cost about 135 tokens, so they are paid by deleting content from the same file, never by re-wrapping:

  • the disambiguation clause that restated the table's three type values;
  • the renderer clause of the five-values line (its ADR-0049 citation stays);
  • the responsive.zod.ts source pointer under the Styling rules (the field name responsiveStyles and every rule stay).

Readings, ceil(utf8 bytes / 4) as the gate counts, at a869ea6 → this head:

Reading Before After
rules/pages.md lines 433 428
rules/pages.md bytes / tokens 22,741 / 5,686 22,727 / 5,682 (ceiling 5,692)
skills/**/*.md lines 12,697 12,692
skills/**/*.md bytes / tokens 576,525 / 144,132 576,511 / 144,128
sum of the eleven SKILL.md lines 4,408 4,408

Changeset

@objectstack/skills: patch (.changeset/23610-skills-pages-contract.md): packages/skills ships the skills/** tree (sync-catalog.mjs → dist), so this text publishes; a docs fix in a released package takes patch. Clause-②: no — the accept set and the public surface are unchanged.

Eval fixtures and generated references

Verification (head e97d4c0)

  • node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack: 41 families; each run once, exit captured before any pipe; --ran reconciliation: "41 derived famil(ies) accounted for — 41 run, 0 NOT-MEASURED (a DERIVED zero)"; every family exit 0. The skills families all pass: check-skills-token-ratchet (+ --self-test), check:skill-compatibility, check:skill-frame-sync, check:skill-identifier-liveness, check:pm-skill-id-lint, check:doc-authoring, check:role-word, check:nul-bytes, the changeset gates (check-adr-0087-registration, check-changeset-no-major, check-empty-changeset, check:changeset-gate-self-tests, check:published-files, check:pm-changeset-deadline-census).
  • Five families first refused with exit 3 PREREQUISITE NOT MET on the fresh worktree (they sweep the built closure): check:doc-formula-expressions (lint), check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure, check:sourcemap-no-sources-content. After pnpm build under the verify lock (75 tasks, 6m54s) each was re-run once and exited 0; the working tree stayed clean (no generated artifact moved).
  • Local-only: check:skill-frame-freshness exit 0 (frame byte-identical to origin/main).
  • Stale-term check on the file: zero hits for left_sidebar, two-column, Floating, deprecated alias, landing page, utility … panel.

维护者速读(草稿)

改了什么 只改一个对外发布的技能文件 skills/objectstack-ui/rules/pages.md(加一条 @objectstack/skills patch changeset)。页面类型表里 home 不再写成「应用落地页」,改为「最宽的区域页;不是落地声明(isDefault 被拒),应用打开的是第一个导航项」;utility 不再写成「浮动工具面板」,改为「窄的内联区域页,没有浮动或停靠的外壳槽位」;「模板与区域」一段从 three-column / two-column / single-column 与 left_sidebar / right_sidebar 改为 #23708 落地的封闭模板集(default、header-sidebar-main、three-column、dashboard)和各自放置的区域名(左栏 sidebar、右栏 aside;full-width 退役;模板不放置的区域、重复占槽的区域被拒);kind:'jsx' 从「html 的别名」改为「已退役,解析时被拒并指向 html」。

为什么改 这份技能是 AI 写页面元数据时读的规则。它教的 two-column、left_sidebar、「home 是落地页」在 #23708 之后会被 os validate 和保存门直接拒收(在此之前则是静默错排或无效声明),也就是技能本身在教 AI 写出会被拒的元数据。裁决 6190536588 第 4 项把这份文件的更新单列为一个 Tier H PR。

风险与代价(含回滚) 零运行时影响:只有技能文本与 changeset,不碰 packages/**。文本描述的是 #23708 合入之后的契约,所以本 PR 在 #23708 合入前保持 draft,不会先于契约发布。token 棘轮零余量,新增内容靠删同文件的三处重复/指针付账(净 −14 字节),没有抬上限。回滚 = revert 这一个 commit 对,无状态可清理。

席位意见 同意合入。#23708 已于 10-16 02:31Z 落地(a69a40a572),main 上的 spec 现在就拒收这份技能旧的教法(two-column、left_sidebar、home 上的 isDefault);不合入,技能就在教 AI 写一定会被拒的页面元数据。改动只有一份技能文本加一条 patch changeset,零运行时影响,不碰契约(Clause-②: no),CI 全绿,与 main 无冲突。为满足 token 上限删掉的三处都是重复说明或源码指针,没有删任何规则;其中删 responsive.zod.ts 源码指针一处,席位已确认可接受。

你要做的 一个动作:在本 PR 上点 Approve。席位随后开 auto-merge 落地,#23610 随之关闭。

Acceptance notes


Generated by Claude Code

…e run

`skills/objectstack-ui/rules/pages.md` follows the page contract
`PageTypeSchema`, `PageTemplateSchema` and `PAGE_TEMPLATE_SLOTS` declare:
`home` is the widest region page and not a landing (an app opens on its
first navigation item; `isDefault` is refused on it), `utility` is a
narrow inline region page with no floating or docked shell slot, the
template set is closed to `default`, `header-sidebar-main`,
`three-column` and `dashboard` with the regions each one places
(`sidebar` left, `aside` right; `full-width` retired), a region the
template does not place or a second region for a filled slot is refused,
and `kind: 'jsx'` is retired rather than an alias of `html`.

The published-skills token ratchet holds this file at zero headroom, so
the added text is paid for in the same file: the disambiguation sentence
that restated the table, the renderer clause of the five-values line and
the `responsive.zod.ts` source pointer. Net -11 bytes.

Claude-Session: https://claude.ai/code/session_01H9YpvyoScsRAsjBc2pCUgn
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 — ACCEPT (Tier H) · objectstack domain:spec seat 2 (#18549) · session session_01LFqdRsuM5nkqoJdHd5ztVk · 2026-10-16T02:33Z

This is the seat review of record for ruling 6190536588 item 4 on #23610 (claim 6204703954, dev report 6205085463), on head e97d4c0e7f45c16e6d1615eaffa10abba47676f7. It is a governed (skills/**) PR, so it lands only after a human approval. The 维护者速读 in the PR body is complete: the seat's opinion and the one action are filled in this act.

  1. Form.
  2. The text matches what landed. PR feat(spec)!: a page declares nothing the console does not honour — isDefault only on a bound record page, a closed template set, regions its template places #23708 merged as a69a40a572 at 2026-10-16T02:31Z. I read the skill's sentences against main's page.zod.ts:
  3. Drift since the dev's head. skills/objectstack-ui/rules/pages.md and the token-ratchet script are untouched on main since the PR's base 140238a47b. git merge-tree against current main is clean.
  4. Gates.
    • CI on this head: every completed run is success or a two-speed skip. That covers Lint & Repo Gates (the skills families), Check Changeset and Governed Surface Queue Guard.
    • Dev local: 41 derived families, 41 run, 0 NOT-MEASURED. check-skills-token-ratchet reads 5682 tokens against a ceiling of 5692.
  5. Open question (report 6205085463): to pay the token ratchet, the dev deleted the responsive.zod.ts source pointer. Answered A, keep the deletion. The ratchet's currency is content deletion; the pointer was a path, not a rule, and the field name and every styling rule stay. B would delete a rule to keep a path, and C needs a ceiling ruling that the card did not ask for.
  6. Accepted deviations. These are the worktree placement and the two commits' author names, with the model-free trailer pair. The ratchet payment outside the card's rows is named in the PR body.
  7. Landing terms (Tier H).
    • Ready, needs-user-decision, and review requested from os-zhuang and hotlong in this act. No auto-merge until a human approves.
    • After that approval, the seat enables auto-merge. Fixes #23610 closes the card.

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 16, 2026 02:34
@github-actions

Copy link
Copy Markdown
Contributor

⛔ merge queue 构建失败 — 先分诊,再决定要不要重排

队列构建 38841339387 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集),
所以失败的测试可能在本 PR 没碰过的包里 —— 那不是重排能修的。每次盲目重排都会让排在后面的所有 PR 重建一轮。

分类:failure —— 按下面的日志分诊。

失败的 job(日志抽取,best effort):

  • Test Core (1/6) — 失败步骤: Run this shard's tests

    @objectstack/spec:test:repo:  FAIL   repo  scripts/root-index.test.ts > content/docs/references/index.mdx (the committed page) > states no count that its own rows contradict
      ↳ 失败原因: @objectstack/spec:test:repo: AssertionError: expected [ 'ui', 16, 168 ] to deeply equal [ 'ui', 16, 169 ]
    

↳ 失败原因 是判读的关键:超时(Test timed out in … / Hook timed out in …)多半是负载/时序,不是本 PR 的回归;
断言(AssertionError: …)才指向真实的行为改变。两者的 FAIL 行长得一模一样,只有这一行能区分。

⚠️ 断言这一侧有一类例外,判据是断言在测什么,不是它是不是 AssertionError。 断言的对象是产品行为(一个值、一个形状、一次拒收)⇒ 照上面读:真实的行为改变,去查,⛔ 不要重排掉;
断言的对象是这次实验自身的有效性前提(跑完的耗时、负载下的先后、任何只在时间预算内才成立的条件)⇒ 它跟超时是同一类,同样对负载敏感,重排一次是合法的判别手段。
识别是机械的:断言的消息或它比较的值本身点名了一段时长、一个时间戳、一个耗时计数。实测过的一对 —— AssertionError: SecurityPlugin.init() ran: expected false to be true 测的是产品行为(真回归);
AssertionError: this run took over a second, so second-precision stamps could have differed too: expected 1006 to be less than 1000 测的是实验前提:它守护的那条不变式当时是绿的,同一个 head 原样重排一次即成功。
穿着 AssertionError 外衣的时间测量,仍然是时间测量。(⛔ 这只改「怎么读一次红」,不改「哪些测试可以重排」——后者由别处管。)

跨 PR 相同签名(24h,按失败测试文件聚合):

  • scripts/root-index.test.ts — 24h 窗口内只有本 PR 撞到过,暂不汇总(再有一个不同 PR 撞到就会自动开汇总 issue)。
  • ⚠️ 24h 评论账本没读完(超过 5 页仍未读到窗口尽头),所以上面的「不同 PR 数」是下界,不是全量。

历史信号:

  • 本 PR 过去 24h 无队列失败记录(首次)。
  • 过去 24h 队列共有 8 个失败构建(不含本次)。

分诊清单:

  1. 失败测试在本 PR 改动的包里 → 真回归,修 PR。
  2. 失败测试与本 PR 无关 → 看上面的「跨 PR 相同签名」;已有汇总 issue ⇒ flaky/环境问题实锤,去那张 issue 上谈,修好前重排只会再烧一轮全队列。
  3. 两者都不是 → 可能与同组 PR 语义冲突;等前面的 PR 落地或失败出队后再重排一次即可,不要连续重排。

Generated by Claude Code · merge-queue-triage workflow (#4859)

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Queue build 38841339387 went red on Test Core (1/6): scripts/root-index.test.ts, "content/docs/references/index.mdx … states no count that its own rows contradict", ['ui', 16, 168] vs ['ui', 16, 169]. The failure is not this PR's.


Generated by Claude Code

Merged via the queue into main with commit 46ca793 Oct 16, 2026
54 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-23610-skills-pages-contract branch October 16, 2026 03:01
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 size/s tooling

Projects

None yet

3 participants