Repository navigation
[finding] object-level userActions guidance covers sort/search/filter/editInline but not the three view keys adopted at #11195 — group/hideFields/rowColor get a bare rejection without the wrong-layer pointer #11459
Description
Activity
Concentrated triage batch:
finding→pm:blocked, Task (domain:specstands) — the body's first line already carries the machine-readableBlocked-by: #11195(its PR #11458 is held for contract review; the three view keys must exist before their wrong-layer guidance can). On unlock: add the three curatedguidanceentries (group/hideFields/rowColor) to the object-leveluserActionsstrictObject, same wording pattern as the four existing wrong-layer pointers. Clause-②: no (rejection-message prose; the accept set does not move) — re-affirm at claim.
Generated by Claude Code
Claim: PM loop round R8, wave 2
Session:session_012xGvxcwPRTJfA7RfjXEYA4
Branch:claude/issue-11459-object-useractions-guidance
Worktree:objectstack-issue-11459
Domain:domain:spec
File surface:packages/spec/src/data/object.zod.ts(threeguidanceentries on the object-leveluserActionsoptions, mirroring the existingsort/search/filter/editInlineconvention) + whatever generated artifact the repo's own gates demand regenerating for describe/guidance text + one changeset. Stop on breach.
Container & model: S mechanical,mode:subagent,model: sonnet— error-message curation following an in-file convention, judged mechanically by the #5013 alias-integrity audit and existing tests; dispatch-gates @f93df4d: no path-derived tier mandate. Thepackages/spec/src/**path limb applies at the PR gate.
Clause-②: no — the three keys stay rejected by name on the object block; only the refusal's guidance text is added (accept/reject set unchanged, public surface unchanged)
Serial constraints cleared: blocker #11195 verified CLOSED with PR #11458 MERGED (2026-08-23) — the three view keys exist, so the premise is live (PM re-verified onorigin/main: guidance entries atobject.zod.ts:1741-1752cover the four legacy keys only, zero hits for the three new ones). Batch sibling PR #12605 (#11983) touchespackages/spec/src/api/**+packages/rest— disjoint files. In-flight #12573 (packages/rest tests) — no contact. H17 trigger files (#8345/#8346:field.zod.ts/view.zod.ts/ currency) — this card touchesobject.zod.ts, no intersection.
Generated by Claude Code
- added a commit that references this issue
on Aug 26, 2026 os-dev-report
{ "issue": 11459, "status": "done", "branch": "claude/issue-11459-object-useractions-guidance", "pr": "https://github.com/objectstack-ai/objectstack/pull/12606", "premise_still_valid": true, "summary": "Added three curated `guidance` entries (`group`, `hideFields`, `rowColor`) to the object-level `userActions` strictObject in packages/spec/src/data/object.zod.ts, mirroring the existing sort/search/filter/editInline wrong-layer wording convention. Acceptance is byte-identical: all three keys were already rejected by name on the object block (re-verified on origin/main pre-change); only the refusal message gains the same curated VIEW-block pointer the other four keys already carry. Added a new test pin mirroring the existing `sort` pin, asserting the VIEW pointer for all three keys, and a patch changeset following the precedent set by the prior pure-guidance-text change (#7884's visible-when-alias-guidance.md).", "tests": "On merge commit a413af29c (merge base 23d52f99c of origin/main), all under scripts/pm/os-verify-lock.sh: pnpm --filter @objectstack/spec build (clean, 34/34 .d.ts); targeted vitest (object-strictness-batch20.test.ts + alias-integrity.test.ts + object.test.ts) 253/253 passed, including #5013 alias-integrity audit auto-judging the 3 new guidance entries; full spec package vitest 432 files / 11499 tests passed; check:generated all 14 artifacts up to date (no regen needed — guidance prose is not a .describe()/authorable key); spec typecheck clean; full `pnpm build` 71/71 tasks (prerequisite for check:dev-prereqs / check:type-check-debt); every gate named by `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack` for this diff — all green (authorable-surface, cross-package-test-inputs, doc-authoring, doc-formula-expressions, empty-state, liveness, merge-driver, objectql-double-limit, page-declaration-shape, published-files, slot-lookup, spec-parsed-alias, strictness-ledger, test-source-alias, type-source-resolution, variant-docs, ci-filter-parity, comment-mask-adoption, dev-prereqs, plugin-teardown-shape, docs-audit affected-docs + drift-comment); convention-triggered gates for the edited test file (type-check-coverage OK, type-check-debt --re-measure: 31 entries re-measured, none above recorded ceiling; query-options-erasure, engine-double-contract 689 pinned/134 debt/3 exempt unchanged, where-matcher 303/303); changeset-triggered family (changeset-gate-self-tests, objectui-changeset, adr-0087-registration, changeset-no-major, empty-changeset, release-rehearsal-clone --self-test) all green; scoped eslint --no-inline-config over the 2 touched source files: 0 errors/0 warnings (confirmed via --print-config: no parserOptions.project, so no type-aware linting — collapse to this scope is measured-safe, not assumed); control-byte self-scan on touched files + changeset clean.", "mcp_calls": 9, "open_questions": [], "out_of_scope_findings": [] }
Generated by Claude Code
ACCEPT — reviewer of record: spec seat R8,
session_012xGvxcwPRTJfA7RfjXEYA4. PR: #12606 (draft, heada413af29c, 3 files).Checked against the PR itself: diff is exactly the charter — three
guidanceentries mirroring the four existing wrong-layer pointers (wording follows thesearch/filter"governs CRUD affordances only" pattern), the block's leading comment updated in place, one mirrored test pin (asserts the VIEW pointer for all three keys; the pre-existing disjoint-vocabulary rejection pin untouched), one patch changeset with the #7884visible-when-alias-guidanceprecedent named. Accept/reject set byte-identical by construction and by measurement (all three keys rejected by name before AND after). #5013 alias-integrity audit auto-judged the new entries green;check:generatedconfirmed no artifact regen owed (guidance prose is not a describe/authorable key). Full spec suite 432 files / 11499 green at the merge commit.Clause-② enqueue-gate determination (recorded, this seat stops here): declaration limb
no(accept set unchanged — verified above), but the path limb fires — the diff touchespackages/spec/src/data/object.zod.ts(packages/spec/src/**contract surface) and the dispatch tier wassonnet, belowCONTRACT_REVIEW_TIER(claude-fable-5, dispatch-gates.mjs:3813). Per the enqueue gate this seat may NOT self-clear:needs:contract-reviewattached to both carriers (this card + PR #12606) in the same stroke. The PR stays draft — no ready-flip, no queue — until the contract-review chain (fable-tier reviewer) clears the label. Review scope note for that reviewer: the only contract-file diff is refusal-message prose + a comment; the two pins that would move on any accept-set change (object-strictness-batch20.test.tsdisjoint-vocabulary + the new pointer pin) are both green.
Generated by Claude Code
- added a commit that references this issue
on Sep 1, 2026
Blocked-by: #11195 (meaningful only once the three keys exist on the view block; that card's PR #11458 is held for contract review — neither is closed by this issue).
Observation
packages/spec/src/data/object.zod.ts— the object-leveluserActionsstrictObject carries curatedguidanceentries for the high-traffic VIEW-vocabulary keys an author writes on the wrong layer:sort,search,filter,editInlineeach answer with a wrong-layer pointer ("…is a VIEWuserActionskey…"). Once #11195 lands, the view vocabulary gainsgroup,hideFields,rowColor— three keys with the same wrong-layer trap (an author who learned them on the view writes them on the object) — but the object block has no guidance entries for them, so they get only the generic unknown-key rejection with an edit-distance suggestion (which, over the object block'screate/import/edit/delete/exportCsvshape, has nothing useful to offer).Measured on PR #11458's built dist: all three are refused by name on the object block (loud, correct), just without the curated pointer the four existing entries provide.
Remedy (small, mechanical, mirrors the existing convention)
Add three
guidanceentries to the object block'suserActionsoptions inobject.zod.ts, following the existingsort/search/filterwording. Note the alias-integrity audit (#5013) will judge the new entries automatically (each key must be one the shape rejects — holds for all three).Deliberately NOT folded into #11195's PR: it is a behavioural extension (error-message curation on a surface outside that card's pins), flagged in that card's report instead.
Found while implementing #11195 (session
session_01T9cDbY2NBiVJWYx3BpWfH2).