Skip to content

docs(skills): teach the report-index navigation item beside the named report - #27903

Merged
os-zhuang merged 2 commits into
mainfrom
claude/project-thread-8oolw6
Oct 30, 2026
Merged

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

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Elon · project thread

domain:skills#2 · os-elon-musk · session_016WV4cyZb8pD9989yV2qXKE

Fixes #27609

What changes

  • skills/objectstack-ui/SKILL.md (navigation item table): the report row marks reportName? optional and says that without it the entry is the app's report index.
  • skills/objectstack-ui/rules/navigation.md: the compiled App.create example gains { id: 'nav_reports', type: 'report', label: 'Reports', icon: 'library' } beside the named report, with a comment that the console adds no index entry itself. Paid for by shortening the filters-slice comment above it, which restated the Run Modes table and decision rule further down the same file.
  • skills/objectui/guides/app-composition.md (added to the file surface by the seat's claim amendment): the route table gains {type:'report'} → /reports. Paid for by dropping the Contract Reminders' parenthetical list of target keys, which restated the table's first column.
  • skills/objectstack-ui/evals/views-apps-actions-pages.json: case 10 asks for an app's Reports entry and expects { type: 'report' } with no reportName.
  • scripts/check-skills-token-ratchet.mjs: one row raised (the eval file), under the standing ruling quoted verbatim in the row comment.
  • Changeset: @objectstack/skills patch.

Why

PR #27566 (bf658d1b8) made ReportNavItemSchema.reportName optional (packages/spec/src/ui/app.zod.ts:687): absent, the entry opens the app's report index (resolveHref → ${basePath}/reports, ui/packages/layout/src/NavigationRenderer.tsx:1013), and the console stopped injecting an "All reports" row, so an app shows the index only where its navigation declares it. The published skills still taught only the named form, so an agent following them shipped an app with no report index entry. No other skill page claims an injected "All reports" row (grep of skills/** for "All reports" / "report index": none before this PR).

Verification

Token measurements (node scripts/check-skills-token-ratchet.mjs, ceil(bytes/4)):

File Before After Ceiling
skills/objectstack-ui/SKILL.md 3840 3848 3851 (unchanged)
skills/objectstack-ui/rules/navigation.md 2271 2273 2273 (unchanged)
skills/objectui/guides/app-composition.md 1078 1078 1079 (unchanged)
skills/objectstack-ui/evals/views-apps-actions-pages.json 2009 2108 2009 → 2108

The eval row moves under the maintainer ruling of 2026-10-27, verbatim: 「A:先削重复,余额按实测提高」. The file's cases share no sentence, so there was no duplicate to cut first; the ceiling is pinned at the measurement (8432 bytes).

Gates: node scripts/pm/dispatch-gates.mjs --ran on 8af37ee5: 65 derived families accounted for, 61 run and green, 4 NOT MEASURED (exit 3, prerequisite: whole-tree dist/): check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure, check:sourcemap-no-sources-content. check:skill-examples (274 prose examples type-check, the edited os:check block included) and check:doc-formula-expressions were green after building their prerequisites. pnpm --dir ui exec vitest run scripts/ was red once on the first run (spec-symbol-ledger-plugin-detail-7265.test.ts), green alone on both this head and main, and green on a full rerun (169 files, 4902 tests). eslint on the edited script: clean.

Clause-②: no
Metadata-protocol: none

Human Minimum

  • 1. Schemas start as Zod; packages/spec holds no runtime logic. (No spec change.)
  • 2. Every name I added uses the casing for its kind.
  • 3. No formatter ran; eslint on the edited script passes (full pnpm lint left to CI).
  • 4. One issue, one branch off an up-to-date main, one pull request.
  • 5. A change that publishes carries a changeset, and both declaration lines are filled in here and in the changeset.
  • 6. packages/spec not touched.
  • 7. No hand edits to content/docs/references/, packages/*/CHANGELOG.md or content/docs/releases/.
  • 8. Title, body and comments are in English.
  • The Before Submitting list in CONTRIBUTING.md is done.

维护者速读

  • 改了什么:技能教会报表导航项的「索引」写法:{ type: 'report' } 不写 reportName 就打开该应用的报表索引(/reports)。
  • 为什么:feat(spec): a report nav item without reportName opens the app's report index; the console stops injecting All reports #27566 之后控制台不再自动注入「All reports」行,应用只在导航声明处才有报表索引入口;技能只教具名报表,AI 照着写会漏掉索引入口。
  • 改动面:objectstack-ui 的导航表一行与导航示例一项,objectui 路由表一行,新增 eval 第 10 例;无 schema、键或行为变更。
  • token:三个文档文件都在原上限内(删去同文件重复句付账);eval 文件上限 2009→2108,依据 2026-10-27 裁决「A:先削重复,余额按实测提高」。
  • 验证:65 族 gates 中 61 族绿,4 族因整树未构建为 NOT MEASURED;skill-examples 274 例类型检查通过。
  • 落地:欠 CONTRACT_REVIEW_TIER 契约复审,落地为 Tier H(待受管批准人批准)。

🤖 Generated with Claude Code

https://claude.ai/code/session_016WV4cyZb8pD9989yV2qXKE

… report

A `type: 'report'` item with no `reportName` opens the app's report index
(`/reports`), and the console no longer adds an index entry itself (PR #27566),
so an app has one only where its navigation declares it. The objectstack-ui
navigation table and example, the objectui app-composition route table, and a
new objectstack-ui eval case now teach that form.

Fixes #27609

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016WV4cyZb8pD9989yV2qXKE
@github-actions github-actions Bot added documentation Improvements or additions to documentation tooling labels Oct 30, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS

Contract-review-claim: session_016WV4d1QkPVVzNz3FJqb2iS · head 8af37ee · 2026-10-30T03:11Z

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 8af37ee5bcc544739d6c64666561d6e34fd1d438
Local-runs: none
Scope: skills/objectstack-ui/SKILL.md, skills/objectstack-ui/evals/views-apps-actions-pages.json, skills/objectstack-ui/rules/navigation.md, skills/objectui/guides/app-composition.md + scripts/check-skills-token-ratchet.mjs (the gate the ratchet rows enforce, read as one change), packages/spec/src/ui/app.zod.ts, packages/spec/src/ui/app.test.ts, ui/packages/layout/src/NavigationRenderer.tsx, ui/packages/app-shell/src/layout/UnifiedSidebar.tsx, ui/packages/app-shell/src/layout/tests/UnifiedSidebar.reportIndexEntry-27525.test.tsx, .changeset/27609-skills-report-index-nav.md

Read: the PR body, the six-file diff (origin/main...8af37ee5, 35+/8-), card #27609 with triage 6500503311 and claim 6513377101, PR #27566 (bf658d1b8) in full, the dev report at /mnt/project-files/skills-lane-seat2/report-27609.json, and the head's check-runs. Nothing built or run; token readings are wc -c by hand under the script's own stated convention.

① Derived judgments

Each claim the PR teaches, against the code #27566 shipped on main:

  1. reportName optional — TRUE. packages/spec/src/ui/app.zod.ts:687-693: reportName: z.string().optional().describe('Target report name. Omit it and the entry opens the app's report index (the reports the app ships that the member may open) instead of one report.'). The variant TSDoc (:670-682) states the two targets and that the console draws an index entry only where navigation declares one. Pinned by app.test.ts ("accepts a report item without reportName as the app report index entry": parses on the variant, through the union, inside AppSchema, and holds no reportName after parse).
  2. No reportName routes to APP/reports — TRUE. ui/packages/layout/src/NavigationRenderer.tsx:1010-1013 resolveHref case 'report': item.reportName ? BASE/report/NAME : BASE/reports. The active-row election reads the same answer (sidebar test (c)).
  3. The injected "All reports" row is gone — TRUE. UnifiedSidebar.tsx deletes the {!isStudioApp && (...)} block that drew Link to=BASE/reports with data-testid="sidebar-report-index", and the replacing comment says the sidebar injects no index row of its own. UnifiedSidebar.reportIndexEntry-27525.test.tsx (a): no "All reports" link, no /apps/crm/reports href, no sidebar-report-index when navigation declares none.
  4. SKILL.md row reportName?, "A report; no reportName = the app's report index" — accurate; the ? notation matches the viewName? / recordId? convention already in the table.
  5. navigation.md example { id: 'nav_reports', type: 'report', label: 'Reports', icon: 'library' } with the comment "the console adds none itself" — accurate. A labelled entry shows its label (test (b) second case: label: 'Reports' renders a link named "Reports" to /apps/crm/reports, and no "All reports" link). library is a real lucide icon (lucide-react@1.43.0, the version ui/packages/layout pins, ships icons/library.mjs), resolved by resolveIcon in NavigationRenderer.tsx:1701. The os:check block type-checks against the spec as it is on main (the input union carries z.input of ReportNavItemSchema, whose reportName is optional); the dev reports check:skill-examples green at 274 examples, not re-run here.
  6. app-composition.md route row {type:'report'} → /reports, "none unless navigation declares it" — accurate (item 2 and 3). The renderer note is renderer-side, which is what the guide says it owns.
  7. Skills sweep on the head (git grep over skills/**, all packages, evals included, for "All reports", "report index", "injected", "reportName", 'report'): no page claims an injected row; the only reportName mentions are the three edited files; no other skill teaches a report nav item. Nothing feat(spec): a report nav item without reportName opens the app's report index; the console stops injecting All reports #27566 made false was missed. packages/skills is a wipe-and-copy of skills/** into dist/ at build, so the published catalog carries the edit with no second copy to update.
  8. Changeset @objectstack/skills patch (packages/skills/package.json names that package), Clause-②: no, Metadata-protocol: none, Before/Now state the same facts as the diff and name eval case 10. Consistent with the PR body.
  9. The SKILL.md hunk is one line (:171); :109-121 (skills: objectstack-ui and objectstack-data still teach a primary related list's "own tab" and an unbounded relatedLists refusal after the spec describes moved (#27352) #27354's section) is untouched.

Ratchet, re-measured by hand under the script's convention (ceil(utf8 bytes / 4); a stamped SKILL.md first subtracts its 20-byte version: "18.2.0" line):

File main head ceiling on head
skills/objectstack-ui/SKILL.md 15378 b − 20 → 3840 15412 b − 20 → 3848 3851, unchanged
skills/objectstack-ui/rules/navigation.md 9081 b → 2271 9092 b → 2273 2273, unchanged
skills/objectui/guides/app-composition.md 4311 b → 1078 4312 b → 1078 1079, unchanged
skills/objectstack-ui/evals/views-apps-actions-pages.json 8034 b → 2009 8432 b → 2108 2009 → 2108

Every reading matches the PR body and the dev report. The raised row's comment pins the measured bytes (== ceil(8432 / 4)) and quotes the ruling as the neighbouring rows do, verbatim: 「A:先削重复,余额按实测提高」 (2026-10-27, tap A). The file's cases share no sentence, so "no duplicate to cut" holds.

The cuts lost no fact. navigation.md: the old filters comment's four facts (bare data surface at /:objectName/data, objectui ADR-0055, removable URL chips, anchored to the URL not a saved view, do not author a view for it) all stand in the Run Modes table and decision rule the new comment points at (:59-76). app-composition.md: the dropped parenthetical (objectName, pageName, dashboardName, reportName, url, componentRef) is the route table's first column, row for row.

Eval case 10. The prompt ("Give the crm app a Reports entry listing every report it ships") is a fair ask for the index form and matches the navigation.md example; must_contain: ["type: 'report'"] is right. But must_not_contain: ["reportName"] does NOT reward the right answer: the skill teaches the form as "no reportName = the app's report index" (SKILL.md :171, navigation.md :37), so an agent that follows the skill and says why it omits the key spells reportName and fails, while an answer that omits it silently passes. The case's own expected_output spells the forbidden string ("with no reportName"), the self-disagreement this file was reworded to remove in #26790 (cases 5 and 8) and that #26814 and #27455 fixed in the formula and platform evals. The file's precedent for an absent-key assertion is the integrations-declared row (clientSecret → clientSecret:, "so a correct answer naming the absent field still passes"). Must-fix 1.

② Semver level

@objectstack/skills patch; Clause-②: no, Metadata-protocol: none on the PR body and the changeset. Prose in the published catalog only; no schema, key or behaviour moves. The level and the declarations agree.

③ Boundary flags

  • File surface widened to skills/objectui/guides/app-composition.md: recorded in the claim (6513377101) as an amendment, and the file carried the same defect (named route only). Answered.
  • Ratchet row raised for the eval file (+99) under the standing ruling: the ruling is quoted verbatim, the value pinned at the measurement, the doc files paid inside their ceilings. Answered; note that must-fix 1 adds one byte to the eval file (8433 → 2109), so the row and its comment move with it, or a byte is cut elsewhere in the file.
  • Four gate families NOT MEASURED (check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure, check:sourcemap-no-sources-content): all need a whole-tree dist/ and none reads skills/** or the ratchet script. Accepted as reported; CI is the record.
  • pnpm --dir ui exec vitest run scripts/ red once (spec-symbol-ledger-plugin-detail-7265.test.ts), green alone on this head and on main and on the full rerun: unrelated to the diff. Accepted.
  • Dev ran at opus with the proactive low-headroom exit; this CONTRACT_REVIEW_TIER review is the compensation named in the claim.
  • PR author is objectstack-fleet[bot]; no other-author note owed.
  • CI at review time (53 check-runs on 8af37ee5): Dogfood Regression Gate, Auto Label and Live E2E UI success; Temporal Conformance, Dogfood Verify CLI, UI Published Artifacts, Dogfood Regression Gate matrix and Build Docs skipped; Test UI 1-16, Lint UI, Type Check UI, Build and E2E UI and Test Core 1-3 in progress. Not all green yet; the lane seat reads the final state before landing.

④ Design judgment

The three governed pages now teach what the spec and console on main do: reportName optional, absence = the app's report index at /reports, no injected row. Each sentence was checked against the cited code (①.1-3) and the index form is shown beside the named form in both the table and the example, as the card asks, inside each file's ceiling. app-composition.md's reminder "Emit the chosen type's target field" now has one row with no target field; the table row directly above it covers that case, so it reads correctly, noted and not a defect. The one thing that does not hold is the eval: the case built to check that an agent learned the index form fails the agent that explains it in the skill's own words (①, must-fix 1). The skill's teaching is right; its eval rewards the wrong behaviour.

Implemented-by: claude/project-thread-8oolw6
Reviewed-by: session_016WV4d1QkPVVzNz3FJqb2iS

VERDICT: FAIL

Must-fix:

  1. skills/objectstack-ui/evals/views-apps-actions-pages.json case 10: narrow must_not_contain from "reportName" to "reportName:" (the key written with a value), so an answer that names the absent key passes and one that writes it fails; the expected_output then no longer spells its own forbidden string. Re-measure the file and move the ratchet row and its == ceil(N / 4) comment to the new byte count under the same ruling (8433 bytes → 2109 if nothing else changes), or cut one byte in the file to hold 8432.

Should-fix: none.

An answer that follows the skill and says it omits `reportName` spelled the
forbidden string and failed. The case now forbids the key written with a
value, as the file's other absent-key cases do; the prompt drops one byte so
the file holds its ceiling.

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

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS

Contract-review-claim: session_016WV4d1QkPVVzNz3FJqb2iS · head 8400c22 · 2026-10-30T03:35Z

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 8400c22560ad4c11be9e5fef4689fe2694c78dc9
Local-runs: none
Scope: skills/objectstack-ui/SKILL.md, skills/objectstack-ui/evals/views-apps-actions-pages.json, skills/objectstack-ui/rules/navigation.md, skills/objectui/guides/app-composition.md + scripts/check-skills-token-ratchet.mjs (the gate the ratchet rows enforce, read as one change), packages/spec/src/ui/app.zod.ts, packages/spec/src/ui/app.test.ts, ui/packages/layout/src/NavigationRenderer.tsx, ui/packages/app-shell/src/layout/UnifiedSidebar.tsx, ui/packages/app-shell/src/layout/tests/UnifiedSidebar.reportIndexEntry-27525.test.tsx, .changeset/27609-skills-report-index-nav.md

Delta review by the same reviewer of the commit that answers must-fix 1 of the record on 8af37ee5 (comment 6514098359). Read: git diff 8af37ee5..8400c225 (one commit, 8400c2256 "fix(skills): eval case 10 refuses reportName: written, not the word"; one file, 2+/2−), the whole diff origin/main...8400c225 (still 6 files, 35+/8−, identical to the reviewed head outside the two lines below), the eval file re-measured by hand, the ratchet row on the new head, and the head's check-runs. Nothing built or run. The findings on 8af37ee5 that the delta does not touch carry forward unchanged and are restated in brief.

① Derived judgments

The delta, in full:

  1. skills/objectstack-ui/evals/views-apps-actions-pages.json case 10 must_not_contain: "reportName" → "reportName:". Closes must-fix 1: an answer that writes the key with a value (reportName: 'x') fails; an answer that names the absent key in the skill's own words ("no reportName") passes; and the case's expected_output ("{ type: 'report' } with no reportName is the app's report index …") no longer spells its own forbidden string (checked: the forbidden string does not occur in expected_output; the must_contain string type: 'report' does). This is the integrations-declared precedent (clientSecret → clientSecret:) applied as the record asked.
  2. Case 10 prompt: "listing every report it ships" → "listing all reports it ships". Same ask, same meaning: one navigation entry that opens the app's full report list, which only the index form gives; "all reports" is also the console's own name for the index page, so the wording still points at the index without naming the form or the key. Fair, and it rewards the right answer: the index form passes, a named reportName: fails, and an explanation of the omission passes.
  3. Nothing else changed between the two heads. The other five files are byte-identical to 8af37ee5; the file is valid JSON with 10 cases.

Ratchet, re-measured by hand (ceil(utf8 bytes / 4)): "every report" → "all reports" is −1 byte and the colon is +1, so the file is 8432 bytes → 2108 on the new head, as on the reviewed head. The ratchet row (:1132, 2108) and its comment (:1131, == ceil(8432 / 4)) are untouched and still true; the ruling quote is as before. The three doc files did not move (SKILL.md 3848 ≤ 3851, navigation.md 2273 == 2273, app-composition.md 1078 ≤ 1079).

Carried forward from 8af37ee5 (unchanged by the delta): every claim the three pages teach holds against the code #27566 shipped on main (reportName optional at packages/spec/src/ui/app.zod.ts:687-693; resolveHref answers BASE/reports for an absent name at NavigationRenderer.tsx:1010-1013; the injected "All reports" block is deleted from UnifiedSidebar.tsx and the sidebar test pins no row when navigation declares none, and a label: 'Reports' entry rendering as "Reports" → /apps/crm/reports; library is a lucide-react 1.43.0 icon); the skills sweep finds nothing #27566 made false; the two doc cuts lost no fact; the SKILL.md hunk is :171 only; the changeset is consistent with the body.

② Semver level

Unchanged: @objectstack/skills patch; Clause-②: no, Metadata-protocol: none on the PR body and the changeset. The delta is two strings in an eval fixture.

③ Boundary flags

  • The thread reports local skill gates all exit 0 on the new head; not re-run here, CI is the record.
  • The ratchet row did not need to move because the prompt gave back the byte the colon cost; the body's token table (2108, 8432 bytes) stays accurate.
  • File-surface widening, the ratchet raise under the standing ruling, the four dist-dependent NOT MEASURED gate families, the once-red vitest run and the opus-with-fable-review compensation: answered on 8af37ee5, unchanged.
  • PR author is objectstack-fleet[bot]; no other-author note owed. mergeable_state: clean.
  • CI on 8400c225: 57 check-runs, all completed, none failed. Success: Test Core (1/8, 2/8, 3/8 and the roll-up), Test UI 1-16 and the roll-up, Build and E2E UI, Lint UI, Type Check UI, Build UI Deps, Build Core, Plan Test Core shards, Live E2E UI, Dogfood Regression Gate, filter, Auto Label, Lint and Repo Gates, TypeScript Type Check, Type Check (debt ledger, source gates, workspace, consumer gates), Lint (docs and code guards, ESLint, scoped slot lookup and corpus, scoped tooling self-tests, scoped query-options erasure, PM dispatch-gates, CI release and engine gates, repo and tooling gates), Check Changeset, Check PR Size, PR-body guards, Governed Surface Queue Guard. Skipped by design: UI Published Artifacts, Build Docs, Dogfood Verify CLI, Dogfood Regression Gate matrix, Temporal Conformance, 18.x upgrade harness (opt-in), Schedule gate, Packed-tarball smoke (opt-in).

④ Design judgment

The one defect the first record found is gone: the eval that checks an agent learned the index form now passes the agent that explains it in the skill's own words and fails the one that writes a reportName:, and the case agrees with its own assertions. The teaching on the three governed pages was already right and is untouched. The skill files hold against the card's eval prompt and the spec on main.

Implemented-by: claude/project-thread-8oolw6
Reviewed-by: session_016WV4d1QkPVVzNz3FJqb2iS

VERDICT: PASS

Must-fix: none.
Should-fix: none.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS

维护者速读

  • 改了什么:技能里的 report 导航项改为 reportName 可选:不写 reportName 就是应用的报表索引页(APP/reports),控制台自己不再加。objectstack-ui/SKILL.md 改了报表那一行,rules/navigation.md 加了一条索引项示例,objectui/guides/app-composition.md 的路由表加了一行,并加了一条 eval(第 10 条)。6 个文件 +35/−8,含 @objectstack/skills patch changeset,以及一条 token 棘轮行(eval 文件 2009 → 2108)。
  • 为什么改:PR feat(spec): a report nav item without reportName opens the app's report index; the console stops injecting All reports #27566 之后,控制台不再自动注入「All reports」行,只有导航里声明了索引项的应用才有报表索引;技能只教带名字的报表项,照着写的应用就没有报表入口。
  • 风险与回滚:只改技能文字和一条 eval,不改 spec 或控制台行为。三个文档文件靠删重复句留在上限内;棘轮行按「A:先削重复,余额按实测提高」逐字引用并按实测钉住。revert 即回滚。
  • 先看:skills/objectstack-ui/SKILL.md:171,再看 rules/navigation.md:38 和 objectui/guides/app-composition.md:22。
  • 两分钟验证:node scripts/check-skills-token-ratchet.mjs exit 0;git grep -n "reportName?" -- skills/objectstack-ui/SKILL.md 命中第 171 行。
  • 需要你做的:skills/** 是受管面,登记册判 Tier H,请批准本 PR(契约复核 FAIL 6514098359 → 修复后差量 PASS 见上一条记录,Head-sha: 8400c22560ad4c11be9e5fef4689fe2694c78dc9)。

席位意见:ACCEPT。首轮契约复核所教内容全部属实,但判了一条 must-fix:eval 第 10 条的 must_not_contain: ["reportName"] 会让如实解释「不写 reportName」的正确答案判错。已收窄为 "reportName:",差量复核 PASS,没有 should-fix。CI 全绿。

席位核对

  • 形态: one PR, Fixes #27609, six files (+35/−8): skills/objectstack-ui/SKILL.md (one row, :171), rules/navigation.md, evals/views-apps-actions-pages.json (case 10), skills/objectui/guides/app-composition.md (route row, claim-amended in), scripts/check-skills-token-ratchet.mjs (one row), and a @objectstack/skills patch changeset. Governed skills/**: check-governed-merges.mjs --pr 27903 reads Tier H (人合).
  • 前提实测: packages/spec/src/ui/app.zod.ts:687-693 makes reportName optional and says omitting it opens the report index; NavigationRenderer.tsx resolveHref routes no reportName to BASE/reports; UnifiedSidebar.tsx no longer injects the "All reports" row, pinned by UnifiedSidebar.reportIndexEntry-27525.test.tsx (review ①).
  • 门禁 check-runs: head 8400c22560ad4c11be9e5fef4689fe2694c78dc9: 57 check-runs, all completed, 0 failed (every Test Core / Test UI shard, Build & E2E UI, Lint UI, Type Check UI, Check Changeset, Governed Surface Queue Guard success; the rest skipped by design); mergeable_state clean.
  • 接受的偏差: file surface widened to objectui/guides/app-composition.md (same defect, recorded in claim 6513377101); one ratchet row raised (eval file 2009 → 2108) under the standing ruling 「A:先削重复,余额按实测提高」, quoted verbatim and pinned at the measurement; four dist-dependent gates NOT MEASURED locally (dts-closure, dual-build-cjs-loads, lean-entry-closure, sourcemap-no-sources-content), covered by CI. Token readings: SKILL.md 3848/3851, navigation.md 2273/2273, app-composition.md 1078/1079.
  • 范围外去向: none. skills: objectstack-ui and objectstack-data still teach a primary related list's "own tab" and an unbounded relatedLists refusal after the spec describes moved (#27352) #27354 (queued) later edits SKILL.md:109-121, a different section; it is released once this lands.
  • 落地条款: Tier H: a GOVERNED_APPROVERS approval, then the seat lands it under the maintainer's landing grant for this term (seat thread, 2026-10-29 22:04Z).

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

Development

Successfully merging this pull request may close these issues.

skills: objectstack-ui teaches only the named report navigation item, not the report-index form #27566 adds

2 participants