Skip to content

Commit 78362c8

Browse files
committed
docs(skills): objectstack-ui gains an eval for a report's dateRange 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>
1 parent dc9d1ff commit 78362c8

4 files changed

Lines changed: 52 additions & 2 deletions

File tree

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
---
2+
'@objectstack/skills': patch
3+
---
4+
5+
docs(skills): objectstack-ui gains an eval for a report's `dateRange` and `exportOptions`
6+
7+
Clause-②: no
8+
Metadata-protocol: none
9+
10+
- **Before.** The skill taught a report's `dateRange` in `rules/dashboards.md`, but no eval checked that an agent authoring a report reaches for `dateRange` on a `type: 'date'` dataset dimension and for `exportOptions` with `csv` / `xlsx`. An agent could hand-roll a `runtimeFilter` window on the date column, invent a report permission key for export, declare a second preset table, or place either key on a `joined` container, and nothing scored that wrong.
11+
- **Now.** A third eval file, `evals/report-period-export.json`, carries one report-authoring prompt whose assertions require `dateRange: { dimension, defaultRange }` and `exportOptions` with `'csv'` / `'xlsx'`, name the existing permission-set `allowExport` as the only export gate, and refuse a `joined` container, a `close_date` filter window, a `presets:` table and an invented permission key. `evals/README.md` lists the file.
12+
- No schema, key or behaviour changes.

‎scripts/check-skills-token-ratchet.mjs‎

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -679,10 +679,18 @@ export const CEILINGS = new Map([
679679
// objectstack-automation
680680
['skills/objectstack-automation/evals/approvals/test-revise-loop.md', 1329],
681681

682-
// objectstack-ui — the two authored eval files; its `references/react-blocks.md`
682+
// objectstack-ui — the three authored eval files; its `references/react-blocks.md`
683683
// is generator-owned and carries no row here on purpose (see the boundary
684684
// section). Its JSON twin was retired by #14296 item 3 and is gone entirely.
685-
['skills/objectstack-ui/evals/README.md', 289],
685+
// 289 -> 335 (#26633): the README lists the third eval file,
686+
// `report-period-export.json`, in one three-line entry (+196 bytes). The
687+
// README's four sections share no sentence, so there was no duplicate to cut
688+
// (0 bytes). On `origin/main` the file was 1143 bytes (286 tokens, headroom
689+
// 3); the LANDED file is 1339 bytes -> 335 tokens, ceiling +46, pinned AT the
690+
// measurement. Same ruling as the `analytics-inline-vs-dataset.json` row
691+
// below (2026-10-27, tap A: 「A:先削重复,余额按实测提高」).
692+
// ceil($(wc -c < skills/objectstack-ui/evals/README.md) / 4) == ceil(1339 / 4)
693+
['skills/objectstack-ui/evals/README.md', 335],
686694
// 1102 -> 1229: the aggregate × field-type rule and the multi-value-dimension
687695
// rule (card #24425, the skills half of cloud#2861 ruling B) each gain one
688696
// regression case — a `formula` under `sum` and a `multiselect` as the
@@ -710,6 +718,17 @@ export const CEILINGS = new Map([
710718
// Maintainer ruling 2026-10-27 (Warren, decision card 「skills 修复卡的教学和 eval 都撞 token 天花板,怎么付?」,
711719
// option A tapped at 01:21Z), verbatim and untranslated: 「A:先削重复,余额按实测提高」.
712720
['skills/objectstack-ui/evals/analytics-inline-vs-dataset.json', 1348],
721+
// INITIAL measurement (#26633): the third authored eval file — ONE
722+
// report-authoring prompt for `dateRange` on a `type: 'date'` dataset
723+
// dimension and `exportOptions` csv / xlsx under the base object's
724+
// `allowExport`, the eval owed by the spec PR that added both keys. A new
725+
// file because both sibling eval files sat at headroom 0 and the analytics
726+
// file was held by an open PR. Nothing in it restates anything (0 bytes
727+
// cut); 1828 bytes -> 457 tokens, pinned AT the measurement — zero headroom,
728+
// so the next token added here is paid for by deleting one from this file.
729+
// Same ruling as the row above (2026-10-27, tap A: 「A:先削重复,余额按实测提高」).
730+
// ceil($(wc -c < skills/objectstack-ui/evals/report-period-export.json) / 4) == ceil(1828 / 4)
731+
['skills/objectstack-ui/evals/report-period-export.json', 457],
713732

714733
// objectstack-ui `rules/` — the five files the #14296 item 1 split created.
715734
// Each row is an INITIAL measurement AT its landed count, so every one starts

‎skills/objectstack-ui/evals/README.md‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ view / page / dashboard / report metadata.
99
dashboard/report widgets: when a data need fits a `defineDataset`, when it
1010
must escalate to a stored field or app code, and when an ad-hoc
1111
in-page `<ObjectChart>` needs no dataset at all.
12+
- `report-period-export.json` — a non-`joined` report's `dateRange` (one
13+
`type: 'date'` dataset dimension) and `exportOptions` (csv / xlsx under the
14+
base object's `allowExport` permission).
1215
- `views-apps-actions-pages.json` — `defineView` containers, `App.create`
1316
navigation, `defineAction` surfaces, record / interface pages, package
1417
docs, wizard forms.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"skill_name": "objectstack-ui",
3+
"description": "Report period and export (ADR-0021 dataset reports): a non-joined report windows ONE `type: 'date'` dataset dimension through `dateRange` and declares its download in `exportOptions`; who may export stays the base object's `allowExport` permission.",
4+
"evals": [
5+
{
6+
"id": 1,
7+
"prompt": "The opportunity_metrics dataset (base object opportunity) declares the amount_sum measure and the stage and close_date dimensions (close_date is type: 'date', dateGranularity: 'quarter'). Add a pipeline-by-stage summary report that opens on the current quarter, lets the viewer pick another period, and lets users who may already export opportunities download the table as CSV or Excel. Emit the metadata.",
8+
"expected_output": "One non-joined defineReport bound to opportunity_metrics (rows: ['stage'], values: ['amount_sum']) with `dateRange: { dimension: 'close_date', defaultRange: 'this_quarter', allowCustomRange: true }` — the dataset's `type: 'date'` dimension and the dashboard's own preset names, never a second preset table or a hand-rolled `runtimeFilter` window on close_date — and `exportOptions: { formats: ['csv', 'xlsx'] }` (optionally `includeHeaders` / `fileNamePrefix`). Who may download is the base object's existing permission-set `allowExport`, named in words: no report permission key is invented, and neither key is placed on a `joined` container (refused).",
9+
"files": [],
10+
"assertions": {
11+
"must_contain": ["defineReport", "dateRange", "dimension: 'close_date'", "defaultRange: 'this_quarter'", "exportOptions", "'csv'", "'xlsx'", "allowExport"],
12+
"must_not_contain": ["type: 'joined'", "blocks:", "close_date: {", "presets:", "permissions.export", "canExport", "allowExport: true", "'pdf'"]
13+
}
14+
}
15+
]
16+
}

0 commit comments

Comments
 (0)