Skip to content

Publish-time validation of predicate path references — a spec-delivered predicate naming a nonexistent path should fail at authoring, not evaluate to a guess at render (#6936 companion) #7010

Closed

Description

@os-project-manager

Spun out of #6936's ruling (maintainer 2026-08-09, Option C: the objectui evaluator goes fail-open-with-warning). That ruling fixes the renderer's posture; this card is the producer-side fix the #6936 filing itself identified as the long-term answer: 「谓词表达式应在发布期被校验(引用的路径必须存在于对应 schema),而不是让渲染器在运行期猜」.

Deliverable

An authoring-time check (landing point to be established by the implementing dev — the AUTHORING_RULES family in metadata-protocol, or packages/lint, following where the existing predicate-shape validations live): a metadata-delivered predicate (visibleWhen / requiredWhen / metadata-admin conditional fields — enumerate the actual carriers as step 1) whose identifier paths do not resolve against the target schema's scope (data.* after objectstack#6254's spelling correction) is refused or warned at publish/validate time, naming the unresolvable path.

Sequencing / evidence base

  • objectstack#6254 fixed 16 bare-spelling predicates in object.form.ts — the corpus that would have been caught by this check; use it as the fixture base.
  • objectstack#6331 made metadata-admin actually read spec-delivered predicates, which is what made the evaluation semantics observable at all.
  • The check must corpus-count before enforcing (standard widening discipline): run over the shipped spec metadata first, report the would-be-refused count in the PR body; a non-trivial hit count is a STOP.

Not in scope

The objectui evaluator change (#6936, ruled C) — independent, already queued in its own card.

No domain:* label applied — routing is the triage seat's.

Refs: #6936 (ruling + measurements), objectstack#6254, objectstack#6331, #5149 (fail-open family).

Activity

  1. os-project-manager commented on Aug 10, 2026

    @os-project-manager
    CollaboratorAuthor

    Claim — devx PM seat, session session_01F8q5J1MQyocgtNspb15fSn, branch claude/issue-7010-predicate-path-publish-check.

    Dispatching to an os-dev agent (opus — the landing point is deliberately left to the implementer and the corpus-count-before-enforce discipline carries a STOP condition, so this is judgment work, not transcription).

    Comment tail read before claiming: empty — no competing claim.

    If an earlier claim comment with a different session ID exists above this one, that claim wins and this one should be treated as withdrawn.


    Generated by Claude Code

  2. os-project-manager commented on Aug 10, 2026

    @os-project-manager
    CollaboratorAuthor

    Landed on main as 424c51051 via PR #7214. Card auto-closed on the Fixes line; clearing the stale pm:dispatched.

    Verified in origin/main: validate-predicate-path-refs.ts ships with the shared collectionEntries import (the pre-#7186 local duplicate folded before merge — zero local definitions remain).

    The full acceptance record is on the PR (comment 5235568500); the short version of why this card closed well: the carriers were enumerated off the Zod schemas and the enumeration corrected this card (the form surface carries only visibleWhen — requiredWhen/readonlyWhen are record-layer keys); the landing point was forced by constraints rather than chosen by taste (#4812's canonical CEL front end + packages/spec's zod-only dependency rule); the corpus-count STOP was respected and came back 0 over all 46 shipped predicates, with a reach guard proving the walker actually visits all 46 and a reverse verification recovering exactly the 16 historical #6254 findings; and one false-green (lazySchema proxy read as not-a-schema, everything vacuously clean) was caught by that guard before shipping — the exact failure mode this discipline exists for.

    Both boundary questions the card left open are now their own tracked cards rather than footnotes: #7219 (the record.* layer — close the oracle before gating an open set) and #7220 (the four-rule visibility family moves to runtime-publish together or not at all).


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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