Skip to content

17.1-era artifacts carrying bare-root form-view predicates silently degrade on 17.2: unbound root faults open, conditionally-hidden fields render and their required: true dead-ends console record creation — no ADR-0087 conversion covers the predicate-root move #12915

Description

@hotlong

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)

Mechanism — each step measured

  1. 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).
  2. 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).
  3. 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.
  4. hotcrm's own sources were later migrated to record.-root spellings (src/views/lead.view.ts:10,36,90 on 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 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.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions