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
Found during the post-merge browser dogfood of PR #12843 (2026-08-28, isolated-posture epic #12701 aftercare). Filed by PM session local_6f4b2700-a5fd-43ae-98a2-65e25e1dfe95. Dedupe: searched requiredWhen/visibleWhen family in objectstack and objectui — the objectui conditional-rule cards (objectui#4161/#5627/#6261, all closed) fix evaluator plumbing, none covers the artifact-era root move; no objectstack card names a predicate-root conversion.
In the console: HotCRM → 线索 → 新建, fill only the four genuinely-required fields (name/company/email; status stays new) → submit is BLOCKED: 未通过原因 (disqualification_reason), 重复于 (duplicate_of_type), 重复的线索 (duplicate_of_lead) are rendered and flagged required.
Same payload POSTed to /api/v1/data/crm_lead from the same session: 201 Created. Server-side validation is correct; the dead-end is client-side and metadata-era-induced.
Mechanism — each step measured
The 17.1 artifact authors form-view entries as {"field": "disqualification_reason", "required": true, "visibleWhen": {"dialect": "cel", "source": "status == \"unqualified\""}} — bare identifier root, the era's working spelling (hotcrm v2.2.2 ran fine on 17.1 with it).
The CURRENT contract binds form-field predicates to the record. root and declares the fail-mode: "a bare identifier is unbound and faults open" (packages/spec/src/ui/view.zod.ts:1981).
So on 17.2 the predicate faults open → the conditionally-hidden field renders → its unconditional required: true (authored to be gated by visibility) blocks every create.
The pinned console behaves per the current contract (fault open — and the loud-rejection precedent for unbound roots is the 2026-08-27 features.* ruling recorded on view.zod.ts). The era-compatibility fix surface is the ADR-0087 conversions registry in packages/spec: a versioned conversion rewriting bare-identifier form-view predicate roots to the record. root for artifacts whose declared floor predates the root move. The rail for applying it already exists: PR #12843's applyArtifactForwardConversions replays the registry (retired entries included) at every framework artifact door, keyed off the artifact's declared floor — a new registry entry plugs straight in, M2-return semantics preserved by the same versioned-window rule.
Open design point for triage/spec seat: the rewrite needs a field-name-aware guard (only prefix identifiers that name fields of the view's object; leave has(...) args and non-field identifiers alone), and a ruling on whether fault-open for still-unconverted spellings should become loud like features.*.
Impact
Any pre-move artifact using the visibility-gated-required authoring pattern dead-ends record creation in the console UI for those objects (API unaffected). For the single-DB SaaS posture this is tenant-facing: a tenant admin cannot create a lead through the UI on an artifact-deployed hotcrm of that era.
Found during the post-merge browser dogfood of PR #12843 (2026-08-28, isolated-posture epic #12701 aftercare). Filed by PM session
local_6f4b2700-a5fd-43ae-98a2-65e25e1dfe95. Dedupe: searched requiredWhen/visibleWhen family in objectstack and objectui — the objectui conditional-rule cards (objectui#4161/#5627/#6261, all closed) fix evaluator plumbing, none covers the artifact-era root move; no objectstack card names a predicate-root conversion.Reproduction (real machine, real artifact)
main(contains feat(metadata): versioned ADR-0087 forward conversion at the artifact-ingestion door #12843's versioned forward-conversion door),os serve -p 4712withOS_ARTIFACT_URL=file://<hotcrm>/dist/objectstack.json— a REAL artifact built 2026-08-05 by released@objectstack/cli17.1.0 (hotcrm v2.2.2,engines.protocol ^17.0.0-rc.1).new) → submit is BLOCKED: 未通过原因 (disqualification_reason), 重复于 (duplicate_of_type), 重复的线索 (duplicate_of_lead) are rendered and flagged required./api/v1/data/crm_leadfrom the same session: 201 Created. Server-side validation is correct; the dead-end is client-side and metadata-era-induced.Mechanism — each step measured
{"field": "disqualification_reason", "required": true, "visibleWhen": {"dialect": "cel", "source": "status == \"unqualified\""}}— bare identifier root, the era's working spelling (hotcrm v2.2.2 ran fine on 17.1 with it).record.root and declares the fail-mode: "a bare identifier is unbound and faults open" (packages/spec/src/ui/view.zod.ts:1981).required: true(authored to be gated by visibility) blocks every create.record.-root spellings (src/views/lead.view.ts:10,36,90on current hotcrm main documents exactly this fail-open) — which is why only ALREADY-BUILT artifacts exhibit the degradation. This is the Artifacts built by released 17.x tooling are REFUSED by the 17.2 runtime: retired-key tombstones fire at artifact parse, and no artifact-ingestion door runs the ADR-0087 conversion that exists for exactly this #12772 shape one layer up: the artifact parses now, but a semantic surface the era legally authored is silently broken.Why this lands here (not objectui, not hotcrm)
The pinned console behaves per the current contract (fault open — and the loud-rejection precedent for unbound roots is the 2026-08-27
features.*ruling recorded on view.zod.ts). The era-compatibility fix surface is the ADR-0087 conversions registry inpackages/spec: a versioned conversion rewriting bare-identifier form-view predicate roots to therecord.root for artifacts whose declared floor predates the root move. The rail for applying it already exists: PR #12843'sapplyArtifactForwardConversionsreplays the registry (retired entries included) at every framework artifact door, keyed off the artifact's declared floor — a new registry entry plugs straight in, M2-return semantics preserved by the same versioned-window rule.Open design point for triage/spec seat: the rewrite needs a field-name-aware guard (only prefix identifiers that name fields of the view's object; leave
has(...)args and non-field identifiers alone), and a ruling on whether fault-open for still-unconverted spellings should become loud likefeatures.*.Impact
Any pre-move artifact using the visibility-gated-required authoring pattern dead-ends record creation in the console UI for those objects (API unaffected). For the single-DB SaaS posture this is tenant-facing: a tenant admin cannot create a lead through the UI on an artifact-deployed hotcrm of that era.