Repository navigation
docs(skills): objectstack-ui gains an eval for a report's dateRange and exportOptions - #26774
Conversation
… and `exportOptions` A third eval file, `skills/objectstack-ui/evals/report-period-export.json`, carries one report-authoring prompt: `dateRange` on a `type: 'date'` dataset dimension with the dashboard's preset names, `exportOptions` with `'csv'` / `'xlsx'` under the base object's existing `allowExport`; a `joined` container, a hand-rolled `runtimeFilter` window, a second preset table and an invented permission key are refused. `evals/README.md` lists the file; both ratchet rows are pinned at the measurement under the standing ruling quoted beside them; a patch changeset for `@objectstack/skills`. Claude-Session: https://claude.ai/code/session_01ADHkmSMxfTnb6u1AsKaTcU Co-authored-by: Claude <noreply@anthropic.com>
席位核对ACCEPT ·
|
Contract reviewServed-tier: Director seat (summon #52, ledger objectstack#12708), summoned by the ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgment
Implemented-by: VERDICT: PASS Generated by Claude Code |
Requested by Steve · project thread
Fixes #26633
Clause-②: no
Metadata-protocol: none
维护者速读
objectstack-ui技能新增第三个 eval 文件evals/report-period-export.json,只含一条报表编写题:要求报表在type: 'date'的数据集维度上声明dateRange(沿用仪表盘的预设名),并用exportOptions声明 csv / xlsx 下载;禁止joined容器、手写runtimeFilter日期窗、第二张预设表和自造的导出权限键。evals/README.md列出该文件;token 棘轮两行按实测钉住;@objectstack/skills补丁 changeset。dateRange) and the export of its table (exportOptions) #26628 给报表加了这两个键,但两个既有 eval 文件都在 token 上限(余量 0),没有任何 eval 检查 agent 会用这两个键;本卡是它欠下的 eval。skills/objectstack-ui/evals/report-period-export.json(题面与断言)、scripts/check-skills-token-ratchet.mjs(README 行 289 → 335、新文件行 457,算式在注释里)、skills/objectstack-ui/evals/README.md。node scripts/check-skills-token-ratchet.mjs,预期四个objectstack-ui/evals文件全部 ✓ 且余量 0;node -e "JSON.parse(require('fs').readFileSync('skills/objectstack-ui/evals/report-period-export.json','utf8'))"无输出即解析通过。skills/**受管面,Tier H)。What changes
skills/objectstack-ui/evals/report-period-export.json(same fixture shape as its two siblings, one eval). The prompt names a dataset with atype: 'date'close_datedimension and asks for a summary report that opens on the current quarter, lets the viewer pick another period, and lets users who may already export the base object download the table as CSV or Excel. The assertions requiredefineReport,dateRange,dimension: 'close_date',defaultRange: 'this_quarter',exportOptions,'csv','xlsx'andallowExport(the existing permission-set axis, named in words), and refusetype: 'joined'/blocks:(either key on a joined container),close_date: {(a hand-rolledruntimeFilterwindow on the date column),presets:(a second preset table),permissions.export/canExport/allowExport: true(an invented report permission key) and'pdf'. Every key in the prompt, the expected output and the assertions is read offpackages/spec/src/ui/report.zod.tsandlist-view-export-options.tsonorigin/maindc9d1ff (dateRange: { dimension?, defaultRange, allowCustomRange },exportOptions: { formats?, includeHeaders?, fileNamePrefix? }, formatscsv/xlsx, presetthis_quarterfromDATE_RANGE_PRESETS); none is invented.analytics-inline-vs-dataset.jsonand its ratchet row, so the prompt gets a new file and a new row instead of a serial conflict.skills/objectstack-ui/evals/README.mdlists the new file in one three-line entry, between its two siblings.scripts/check-skills-token-ratchet.mjs: a new row for the eval file pinned AT the measurement (1828 bytes → 457 tokens, headroom 0) and the README row moved 289 → 335 (1143 → 1339 bytes), each with its arithmetic comment and the standing maintainer ruling quoted verbatim beside the sibling row: 「A:先削重复,余额按实测提高」. Paid down first as the ruling asks: the new file is fixtures and restates nothing; the README's four sections share no sentence; so 0 bytes were available to cut and the whole addition is raised to the measurement, not past it. No other row moves..changeset/26633-report-period-export-eval.md:@objectstack/skillspatch, both declaration lines at line start (the published skills bundle is built fromskills/**).Skills readings (
skills/**touched; before =origin/maindc9d1ff, after = head):skills/objectstack-ui/evals/report-period-export.jsonlines / tokensskills/objectstack-ui/evals/README.mdlines / tokensskills/objectstack-ui/**linesSKILL.mdlinesskills/**tree linesWhy
A report can now declare its period and its export (
dateRange/exportOptions, PR #26628), and the skill's rule example showsdateRange, but no eval scored an agent that hand-rolls aruntimeFilterdate window, invents apermissions.exportbit, redeclares the preset table, or puts either key on ajoinedcontainer. This file is the instrument that makes those wrong answers fail at scoring.Tests
node scripts/check-skills-token-ratchet.mjsat head:82 authored bundle file(s) within their ceilings; 10 generator-owned file(s) measured, not ratcheted, exit 0; the fourobjectstack-ui/evalsrows each ✓ at headroom 0.node scripts/check-skills-token-ratchet.mjs --self-test:79 cases pass, exit 0.JSON.parse, no output).Acceptance notes
dateRangebut notexportOptions.skills/objectstack-ui/rules/dashboards.md§ Report Configuration carries thedateRangeexample from PR feat(spec): a report declares its period (dateRange) and the export of its table (exportOptions) #26628;exportOptionsis taught only on the docs pagecontent/docs/ui/reports.mdx§ Period and export. This eval therefore asserts a key the published skill does not yet teach in its rules. Noted, not filed — the card's file surface is the eval, its README line, the ratchet rows and the changeset; the teaching line is the skills lane's call (that file sits at headroom 0 too).allowExportmust-contain is a review cue as much as a scorer: an answer that explains the export gate as "the base object's export permission" without the key name scores as a miss and deserves a read, the way eval 2 ofanalytics-inline-vs-dataset.jsondocuments its strictdateGranularity.check:skill-docs/check:skill-refs/check:skill-examplesreadSKILL.md,references/and the rules' code fences, none the eval JSON. The gates this diff does reach are listed under Verification.Verification
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackat head78362c8b(the final commit) derived 61 commands (51 matched by path, 2 by change kind, 8 whole-tree). All 61 ran in the worktree after that commit, each exit 0 captured before any pipe — among themnode scripts/check-skills-token-ratchet.mjsand its--self-test(79 cases),pnpm check:pm-governed-merges,pnpm check:pm-dispatch-gates,pnpm check:published-files,node scripts/check-empty-changeset.mjs --base origin/main,node scripts/check-adr-0087-registration.mjs --base origin/main,node scripts/check-changeset-no-major.mjs --base origin/main,pnpm check:skill-identifier-liveness,pnpm check:skill-frame-sync,pnpm check:skill-compatibility,pnpm check:doc-authoring,pnpm check:ratchet-remedy-authority,pnpm check:nul-bytes.dispatch-gates --ran:61 derived famil(ies) accounted for — 61 run, 0 NOT-MEASURED (a DERIVED zero — all 61 recorded an exit code and none of them is 3).check-test-completeness); the 11 wide-population families and the repo-widepnpm lintare CI's runs.turbo run build --concurrency=2 --filter='./packages/**'underscripts/pm/os-verify-lock.sh,VERDICT command-exit 0(held 8m42s).--self-test(no other test file namescheck-skills-token-ratchet); no package source is touched, so no packagetest/typecheckis owed.Human Minimum
packages/specholds no runtime logic. (No schema touched.)pnpm lintpasses (the repo-wide run is CI's; no source file edited).main, one pull request.packages/spectouched: n/a, not touched.content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.🤖 Generated with Claude Code
https://claude.ai/code/session_01ADHkmSMxfTnb6u1AsKaTcU
Generated by Claude Code