Uh oh!
There was an error while loading. Please reload this page.
feat(spec): re-introduce fieldGroups[].visibleWhen with its enforcement side - #13030
feat(spec): re-introduce fieldGroups[].visibleWhen with its enforcement side#13030os-trump wants to merge 2 commits into
Conversation
…nt side Option-A maintainer ruling (2026-08-28): the section predicate slot returns to the fieldGroups vocabulary now that the section-gating contract consumes it — CEL via ExpressionInputSchema, the ADR-0089 canonical spelling; both tombstone rows updated; deriveFieldGroupLayout passes the predicate through verbatim; strictness pins flipped from curated rejection to acceptance; ADR-0085 amended; authorable-surface regenerated by gen:schema. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LpRNHxWZgSUgVnFT9mQQo4
gen:docs picks up the new ObjectFieldGroup.visibleWhen row; api-surface and export-origins pick up the FieldGroupVisibleWhen type export. Repo tooling only (gen:docs / gen:api-surface / gen:export-origins), no hand edits. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LpRNHxWZgSUgVnFT9mQQo4
📓 Docs Drift CheckThis PR changes 1 package(s): 13 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 5 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 126 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 1bf110992729ee3a8601e00112b67c00a2ce223e && git checkout 1bf110992729ee3a8601e00112b67c00a2ce223e
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 0da7cd2c1114649755b7f9f45a7dbbe34985ac6e d19f166eef9d5d72fe5e23f66c50b48464b55714 && git checkout -B drift-repro 0da7cd2c1114649755b7f9f45a7dbbe34985ac6e && git merge --no-ff d19f166eef9d5d72fe5e23f66c50b48464b55714
node scripts/docs-audit/affected-docs.mjs --json 0da7cd2c1114649755b7f9f45a7dbbe34985ac6e
|
Uh oh!
There was an error while loading. Please reload this page.
os-trump
commented
Aug 28, 2026
Landing note (domain:spec seat, session_01LpRNHxWZgSUgVnFT9mQQo4): converted back to DRAFT per the Governed Surface Queue Guard's preferred remedy — this seat armed auto-merge without accounting for the governed surface in the diff, and the guard correctly refused the merge group (run 33200997095, exit 3). State, so nobody re-derives it:
Generated by Claude Code |
os-trump
commented
Aug 29, 2026
Queue ejection triaged (domain:spec seat, Both failures are foreign to this diff, by file surfaceThis PR's complete file list is
The triage comment's own rule separates these two: a timeout is a load/timing reading, an assertion is a behaviour change. Both rows above are a timeout and an environment ENOENT; neither is an assertion, and neither test exercises anything this diff declares. A new optional Why no re-queue from this seatTwo independent reasons, either sufficient:
What is actually true about this PR's own stateIts own PR-side CI was 36/36 green at head Recommended next action for whoever holds the merge controls: one re-queue attempt once #13158 lands, or a hand-merge. Not a second re-queue before then. Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Fixes#12715
Executes the maintainer's 2026-08-28 option-A ruling (issue comment 5448852266): re-introduce
fieldGroups[].visibleWhenWITH its enforcement side, closing the ADR-0085 / ADR-0049 enforce-or-remove loop — removed while unenforced, re-declared now that the objectui section-gating contract (objectstack-ai/objectui#6236, pinned by objectstack-ai/objectui#6111) consumes a section predicate. Clause-② applies on both limbs: this stops at draft; the review chain owns enqueue.The four ruled conditions
visibleWhen: ExpressionInputSchema.optional()onObjectFieldGroupSchema(packages/spec/src/data/object.zod.ts), the exact spelling and CEL machinery actions/rows use (mirrors the field-level declaration at field.zod.ts). Bare-string shorthand normalizes to the{ dialect: 'cel', source }envelope; no second predicate language, no new semantics.visibleWhentombstone (was at object.zod.ts:1152) is retired — the key is real again; thevisibleOnguidance no longer says group predicates were removed and now points at the real slot (kept rejected-with-guidance, the pointed-not-aliased posture);deriveFieldGroupLayout(field-group-layout.ts) passes the predicate through verbatim — string or envelope, tolerant of un-parsed metadata exactly like its collapse-alias handling; newFieldGroupSection.visibleWhen+ exportedFieldGroupVisibleWhentype; never stamped on the ungrouped trailing bucket;visibleOn-still-rejected pin; five new passthrough pins in field-group-layout.test.ts;minor, additive widening) — the ADR-0087 gate's own verdict: "this PR adds no declared-breaking changeset (1 non-breaking changeset(s) seen)", so no registry entry is demanded;section-dividersynthesis sites (ModalForm / DrawerForm derived-fieldGroups branches) already stampvisibleWhen: section.visibleWhenbeside the membership claim — but the adapter they read from,deriveFieldGroupSections(packages/plugin-form/src/fieldGroups.ts), maps the spec's FieldGroupSection onto ObjectFormSection copying only name/label/fields/collapse and never carriesvisibleWhen, so the stamped value stays undefined on the derived path. Follow-up filed: deriveFieldGroupSections drops the new specfieldGroups[].visibleWhen— the two derived section-divider stamps still can never gate objectui#6709 with aBlocked-by:back-link to The specfieldGroupsvocabulary has no section-predicate slot, so a section grouping gate is structurally unreachable on fieldGroups-derived forms #12715 — no objectui code changed from this seat (contract-first). That card also owns turning the six-way matrix's two previously-undiscriminable rows (ModalForm derived-fieldGroups, DrawerForm derived-fieldGroups) into discriminating pins — they become discriminable in objectui, where the stamp renders, once the adapter carries the predicate.FormSection.visibleWhenstill renders its FIELDS on the plugin-form chain — the console renderer drops the whole section objectui#6236 contract — the spec key's describe/JSDoc states the fail-closed whole-group semantics; evaluation stays the renderer's. The tabbed arm The tabbed modal arm (ModalFormcontentLayout: 'tabbed') cannot carry a sectionvisibleWhenat all —FormFieldTabdeclares no predicate slot objectui#6237 reuses the same grouping contract and meets this vocabulary at its own card; fix(service-datasource): reject apoolblock the memory arm cannot honour (#5931) #6237 remains open and is out of scope here.Evidence (all runs on the final tree at
d19f166eeunless marked)pnpm --filter @objectstack/spec build— verify-lock VERDICT command-exit 0 (gen:schema + gen:openapi + tsup + dts, 34/34 declarations present).pnpm --filter @objectstack/spec test— 439 files passed | 1 skipped, 11680 tests passed | 1 skipped, lock VERDICT command-exit 0. Targeted battery (field-group-layout, batch-20, object) 255/255.pnpm --filter @objectstack/spec typecheck— lock VERDICT command-exit 0; includes check:test-typecheck "OK — test layer compiles" (the edited .test.ts files are inside the measured test program, not excluded).git checkout HEAD -- pathwith blob-hash equality against the HEAD blob and emptygit diff HEAD):node scripts/pm/dispatch-gates.mjs, no hand-fed paths; stderr header confirms derivation from objectstack-ai/objectstack at this worktree): 40/40 path-derived root gates exit 0; 16/17 filtered+convention gates exit 0;check:type-check-debton the turbo-built closure: "OK — 31 ledger entries re-measured … none above its recorded number" (exit 0, captured pre-pipe). Earlier in the run the union caught two real regen gaps (check:docs → object.mdx; check:generated → api-surface + export-origins) — regenerated with the prescribed commands and re-run green.scripts/pm/check-half-states.mjsexits 3 "PREREQUISITE NOT MET — no valid GitHub credential in this container" (its own text: no reading at all) — CI/PM seat owns it.check:react-declaration-parityneeds objectui's browser-built manifest, which this repo cannot produce (check:generated's own documented posture).pnpm exec eslint --no-inline-config --format jsonover the diff's 4 TS files: 4 linted, 0 errors, 0 warnings, exit 0 captured pre-pipe; ③ the diff's other 7 files (mdx/md/json) all report "File ignored because no matching configuration was supplied" — outside the population entirely. The 4 TS files are therefore the diff's complete linted population.search_issues(9 hits including the known control cards A section hidden byFormSection.visibleWhenstill renders its FIELDS on the plugin-form chain — the console renderer drops the whole section objectui#6236/v17 GA 交付物:AI 一键升级客户元数据项目(升级 skill,骑在 D2 conversions 之上) #6111 — non-zero, channel live); the follow-up card was filed via MCP.Generated by Claude Code
Generated by Claude Code