You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
skills: the formula row of objectstack-data field-types should say a formula is no group key either (follow-up to #30773) #30824
Follow-up to #30773 (PR #30815), from the seat's ruling on contract review 6677341880, should-fix 3. skills/** is Tier H, so it was kept out of that PR.
What is missing
skills/objectstack-data/rules/field-types.md (the formula row of the field-type table) says a formula is virtual, not aggregatable, and that a dataset measure needs a stored field. It does not say a formula cannot be a group key either.
Since PR #30815, a dataset or analyticsCubes dimension over a formula is refused at authoring (dimension-virtual-field-refused in lint, 400 DATASET_INVALID at the dataset compile). Since #29304, every analytics query that groups by one is refused with 400 INVALID_FIELD. An AI author reading the skill still has nothing telling it not to write such a dimension.
What is wanted
Add "nor a group key" (or equivalent wording) to the formula row, so the row says a formula can be neither aggregated nor used as a dataset or cube dimension, and that both need a stored field. Keep within the skills ratchet: one short clause, with the before/after readings the skills PR rules ask for.
Claim: PM loop round 2 · 2026-11-06T06:37Z
Session: session_01L9qibz5RLVEYDFco93jZ7u
Account: os-tesla (the card's assignee)
Branch: claude/project-thread-70v39y (the card thread's designated branch; dev session session_01L9qibzWJ43paU98P99Cmu9)
Worktree: objectstack-issue-30824
Domain: domain:skills
Seat: domain:skills#2
File surface: skills/objectstack-data/rules/field-types.md (the formula row only), one root .changeset/30824-formula-no-group-key.md, a ratchet ledger row only if a measured ceiling moves DOWN. ⛔ every other file, ⛔ every ceiling raise (compress, do not raise) (stop on breach)
Container & model: S, mode:thread, model: claude-fable-5-1 (dispatch-gates --tier: MANDATORY for skills/** clause ①, no one-line exit), effort: high (p3)
Clause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card (contract review 6677341880 should-fix 3 on PR #30815)
Thread-read: 6678070733
Premise: holds: the formula row of field-types.md names no group-key refusal, and PR #30815 (the refusal) is merged
Serial constraints: seat 1's draft PR #30831 edits other skills/objectstack-data/** files, not this one; merge origin/main before pushing and re-measure the ratchet.
Tier H (skills/**): draft until a governed approver approves; the seat's at-tier contract review precedes ACCEPT.
{
"issue": 30824,
"status": "done",
"branch": "claude/project-thread-70v39y",
"pr": "https://github.com/objectstack-ai/objectstack/pull/30921",
"session": "session_01L9qibzWJ43paU98P99Cmu9",
"premise_still_valid": true,
"summary": "The formula row of skills/objectstack-data/rules/field-types.md now reads 'virtual: neither aggregatable nor a dataset or cube dimension (group key); both need a stored field', stating the refusals main ships (lint dimension-virtual-field-refused, dataset compile 400 DATASET_INVALID, query 400 INVALID_FIELD). The growth is paid by deleting the in-file pointer comment '// see the Calculated table' on the Formula example (+34 / -30 bytes; file tokens 3198 -> 3199, ceiling 3207 untouched, no re-wrap). One changeset, '@objectstack/skills': patch. The seat's Claim 6678864865 names this branch; origin/main (1697d5ca) merged before measuring.",
"tests": "No test files changed (skill prose only). Readings on origin/main 1697d5ca vs f89a2740: field-types.md 252 -> 252 lines, 12790 -> 12794 bytes, 3198 -> 3199 tokens; sum of every skills/**/SKILL.md 4525 -> 4525 lines, 226885 -> 226885 bytes; bundle total 227012 -> 227013. node scripts/check-skills-token-ratchet.mjs: exit 0, 'skills/objectstack-data/rules/field-types.md is 3199 tokens (ceiling 3207; headroom 8)', '57 authored bundle file(s) within their ceilings'. The two eval fixtures under skills/objectstack-data/evals/ are unchanged and parse (9 + 6 evals).",
"gates": "Derived on f89a2740: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack = 43 families, each run with </dev/null, exit codes landed in gates-ran-f89a2740.list; --ran reconciliation: '43 derived famil(ies) accounted for — 41 run, 2 NOT-MEASURED (2 DERIVED from a recorded exit 3)'. 40 exited 0 on the first pass, incl. check-skills-token-ratchet (+ --self-test), check:skill-identifier-liveness, check:skill-frame-sync, check:skill-compatibility, check:corpus-claim-drift, check:doc-authoring, check:pm-skill-id-lint, check:pm-governed-merges, check:empty-changeset, check:changeset-no-major, check:adr-0087-registration, check:closing-keyword-parity, check:comment-mask-corpus, @objectstack/lint check:doc-formula-expressions (after the lint closure build). pnpm check:dts-closure exited 1 on the first pass only because my lint closure build ran under OS_SKIP_DTS=1 (4 packages missing .d.ts — a local artefact, not the diff); rebuilt with env -u OS_SKIP_DTS and re-run: exit 0 (48/48 declaration files present). NOT MEASURED locally (exit 3, PREREQUISITE NOT MET, every published dist needed): pnpm check:dual-build-cjs-loads, pnpm check:lean-entry-closure — the diff touches no package they load; CI runs both. Tier: dispatch-gates --tier = claude-fable-5-1 MANDATORY (skills/**), the model this thread ran on; check-governed-merges --test: Tier H by path. PR check-runs on f89a2740 at report time: Lint & Repo Gates: success; TypeScript Type Check: success; Test Core (2/8): success; Test Core (1/8): in_progress; Build Core: success; PR-body guards (claim · duplicate · Part-of · single-writer path): success; Governed Surface Queue Guard: success; Check Changeset: success.",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"mcp_calls": "0 — no GitHub MCP tool was called (reads via gh api GET; writes: git push + relay pr_create + this post-stamped comment). The harness's assignee/reviewer MCP step was skipped on purpose.",
"api_writes": "2 — relay pr_create (fleet-write request fw-20261106T114540Z-98fb12, run 42212628710, PR #30921, body 6532 bytes stored identical, no assignees), and this os-dev-report comment via post-stamped.mjs on #30824.",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": [
"class: none (reading, no wrong answer from a public door) · the row keeps the pre-existing shorthand 'not aggregatable' although a count over a formula is accepted by the measure table (count reads no value); objectstack-ui/rules/dashboards.md already says so under 'Total over a computed value', which the row's pointer reaches · dedupe words: count formula aggregatable field-types · carrier: none — noted in the PR's Acceptance notes, not filed"
]
}
File surface, widened by the seat after contract review 6684262819 (its two should-fixes): skills/objectstack-data/rules/field-types.md (the formula row, as claimed), .changeset/30824-formula-no-group-key.md, plus skills/objectstack-ui/rules/dashboards.md (§ Dataset-Bound Widgets: the dimension / groupBy refusal bullet names formula, the row the field-types pointer relies on) and scripts/check-skills-token-ratchet.mjs (the two rows re-locked down at the measurement, headroom 0). ⛔ every other file.
Governed: yes, Tier H (skills/**), unchanged by the widening. No other seat holds either added file (seat 1 is offline; PR #30831 has landed).
Landed · 2026-11-06T16:43Z · PR #30921 merged as 95ba4100 through the merge queue (ACCEPT 6687153900). The Claim is discharged; pm:dispatched removed. Branch claude/project-thread-70v39y is retired.
Activity
chore(changeset): the Skills-docs line names the docs moved here and …
objectstack-fleet commentedon Nov 6, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: audit · p3 ·
domain:skills· 2026-11-06T05:54Z⛔ Not a claim.
objectstack-datafield-types formula row: a formula is not a group key either (the analytics: a dataset or cube dimension over a formula field is accepted at authoring, though every query now refuses it (follow-up to #29304) #30773 follow-up). It needs an'@objectstack/skills': patchchangeset.Generated by Claude Code
objectstack-fleet commentedon Nov 6, 2026
domain:skills#2 · os-tesla · session_01L9qibz5RLVEYDFco93jZ7u
Claim: PM loop round 2 · 2026-11-06T06:37Z
Session:
session_01L9qibz5RLVEYDFco93jZ7uAccount:
os-tesla(the card's assignee)Branch:
claude/project-thread-70v39y(the card thread's designated branch; dev sessionsession_01L9qibzWJ43paU98P99Cmu9)Worktree:
objectstack-issue-30824Domain:
domain:skillsSeat:
domain:skills#2File surface:
skills/objectstack-data/rules/field-types.md(theformularow only), one root.changeset/30824-formula-no-group-key.md, a ratchet ledger row only if a measured ceiling moves DOWN. ⛔ every other file, ⛔ every ceiling raise (compress, do not raise) (stop on breach)Container & model:
S,mode:thread,model: claude-fable-5-1(dispatch-gates --tier: MANDATORY forskills/**clause ①, no one-line exit),effort: high(p3)Clause-②: no
Metadata-protocol: none
Responsibility:
n/a — not a defect card(contract review 6677341880 should-fix 3 on PR #30815)Thread-read: 6678070733
Premise: holds: the
formularow offield-types.mdnames no group-key refusal, and PR #30815 (the refusal) is mergedSerial constraints: seat 1's draft PR #30831 edits other
skills/objectstack-data/**files, not this one; mergeorigin/mainbefore pushing and re-measure the ratchet.Tier H (
skills/**): draft until a governed approver approves; the seat's at-tier contract review precedes ACCEPT.Order:
/mnt/project-files/skills-seat-2/r2026-11-06/dispatch-30824.md(frameFRAME.mdbeside it).objectstack-fleet commentedon Nov 6, 2026
domain:skills#2 · os-tesla · session_01L9qibzWJ43paU98P99Cmu9
os-dev-report
Report of 2026-11-06T11:55Z for #30824, draft PR #30921, head f89a274.
{ "issue": 30824, "status": "done", "branch": "claude/project-thread-70v39y", "pr": "https://github.com/objectstack-ai/objectstack/pull/30921", "session": "session_01L9qibzWJ43paU98P99Cmu9", "premise_still_valid": true, "summary": "The formula row of skills/objectstack-data/rules/field-types.md now reads 'virtual: neither aggregatable nor a dataset or cube dimension (group key); both need a stored field', stating the refusals main ships (lint dimension-virtual-field-refused, dataset compile 400 DATASET_INVALID, query 400 INVALID_FIELD). The growth is paid by deleting the in-file pointer comment '// see the Calculated table' on the Formula example (+34 / -30 bytes; file tokens 3198 -> 3199, ceiling 3207 untouched, no re-wrap). One changeset, '@objectstack/skills': patch. The seat's Claim 6678864865 names this branch; origin/main (1697d5ca) merged before measuring.", "tests": "No test files changed (skill prose only). Readings on origin/main 1697d5ca vs f89a2740: field-types.md 252 -> 252 lines, 12790 -> 12794 bytes, 3198 -> 3199 tokens; sum of every skills/**/SKILL.md 4525 -> 4525 lines, 226885 -> 226885 bytes; bundle total 227012 -> 227013. node scripts/check-skills-token-ratchet.mjs: exit 0, 'skills/objectstack-data/rules/field-types.md is 3199 tokens (ceiling 3207; headroom 8)', '57 authored bundle file(s) within their ceilings'. The two eval fixtures under skills/objectstack-data/evals/ are unchanged and parse (9 + 6 evals).", "gates": "Derived on f89a2740: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack = 43 families, each run with </dev/null, exit codes landed in gates-ran-f89a2740.list; --ran reconciliation: '43 derived famil(ies) accounted for — 41 run, 2 NOT-MEASURED (2 DERIVED from a recorded exit 3)'. 40 exited 0 on the first pass, incl. check-skills-token-ratchet (+ --self-test), check:skill-identifier-liveness, check:skill-frame-sync, check:skill-compatibility, check:corpus-claim-drift, check:doc-authoring, check:pm-skill-id-lint, check:pm-governed-merges, check:empty-changeset, check:changeset-no-major, check:adr-0087-registration, check:closing-keyword-parity, check:comment-mask-corpus, @objectstack/lint check:doc-formula-expressions (after the lint closure build). pnpm check:dts-closure exited 1 on the first pass only because my lint closure build ran under OS_SKIP_DTS=1 (4 packages missing .d.ts — a local artefact, not the diff); rebuilt with env -u OS_SKIP_DTS and re-run: exit 0 (48/48 declaration files present). NOT MEASURED locally (exit 3, PREREQUISITE NOT MET, every published dist needed): pnpm check:dual-build-cjs-loads, pnpm check:lean-entry-closure — the diff touches no package they load; CI runs both. Tier: dispatch-gates --tier = claude-fable-5-1 MANDATORY (skills/**), the model this thread ran on; check-governed-merges --test: Tier H by path. PR check-runs on f89a2740 at report time: Lint & Repo Gates: success; TypeScript Type Check: success; Test Core (2/8): success; Test Core (1/8): in_progress; Build Core: success; PR-body guards (claim · duplicate · Part-of · single-writer path): success; Governed Surface Queue Guard: success; Check Changeset: success.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "0 — no GitHub MCP tool was called (reads via gh api GET; writes: git push + relay pr_create + this post-stamped comment). The harness's assignee/reviewer MCP step was skipped on purpose.", "api_writes": "2 — relay pr_create (fleet-write request fw-20261106T114540Z-98fb12, run 42212628710, PR #30921, body 6532 bytes stored identical, no assignees), and this os-dev-report comment via post-stamped.mjs on #30824.", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [ "class: none (reading, no wrong answer from a public door) · the row keeps the pre-existing shorthand 'not aggregatable' although a count over a formula is accepted by the measure table (count reads no value); objectstack-ui/rules/dashboards.md already says so under 'Total over a computed value', which the row's pointer reaches · dedupe words: count formula aggregatable field-types · carrier: none — noted in the PR's Acceptance notes, not filed" ] }objectstack-fleet commentedon Nov 6, 2026
domain:skills#2 · os-tesla · session_01L9qibz5RLVEYDFco93jZ7u
Claim amendment · 2026-11-06T12:20Z · amends claim 6678864865 (same seat, same branch
claude/project-thread-70v39y)File surface, widened by the seat after contract review 6684262819 (its two should-fixes):
skills/objectstack-data/rules/field-types.md(the formula row, as claimed),.changeset/30824-formula-no-group-key.md, plusskills/objectstack-ui/rules/dashboards.md(§ Dataset-Bound Widgets: the dimension /groupByrefusal bullet namesformula, the row the field-types pointer relies on) andscripts/check-skills-token-ratchet.mjs(the two rows re-locked down at the measurement, headroom 0). ⛔ every other file.Governed: yes, Tier H (
skills/**), unchanged by the widening. No other seat holds either added file (seat 1 is offline; PR #30831 has landed).objectstack-fleet commentedon Nov 6, 2026
domain:skills#2 · os-tesla · session_01L9qibz5RLVEYDFco93jZ7u
Landed · 2026-11-06T16:43Z · PR #30921 merged as
95ba4100through the merge queue (ACCEPT 6687153900). The Claim is discharged;pm:dispatchedremoved. Branchclaude/project-thread-70v39yis retired.