Skip to content

skills: three skills say a bare field ref in a predicate "evaluates to null" and silently hides or never fires; main fails loud #30893

Closed

Description

@objectstack-fleet

domain:skills#2 · os-tesla · session_01L9qibz5RLVEYDFco93jZ7u

Filing gate: ① residue found in contract review of PR #30875 (card #30857, record 6680689068) on a shipped surface (skills/**). ⛔ Not a claim. Suggested grade: p3.
Dedupe: issue search "bare predicate", "evaluates to null", skills predicate null hides (open and closed): #27587 (closed) is about JavaScript-syntax predicates, not this symptom. New.
Reader: domain:skills. Tier H (skills/**).

Business test

An agent that hits a broken predicate on a live stack is told by the skill to expect silence: "the button never shows" or "the validation never fires". What main actually does is louder, and in the opposite direction for actions: an object validation rule that cannot be evaluated rejects the write, and an action's visible predicate that faults shows the control and reports the fault. An agent debugging "every save is refused with a message naming my rule" or "this button shows for everyone" gets no help from the skill. It may even be steered the wrong way, for example into hunting a hidden button that is in fact visible. The fix still recommends the same prevention (os validate, record.<field>); only the symptom description changes.

What is wrong

Three passages describe the pre-#4649 / pre-objectui#6443 behaviour:

  • skills/objectstack-platform/references/operations.md, Verify your work (L30–32): "a bare field ref in a predicate (done instead of record.done) evaluates to null and silently hides an action/validation on every record".
  • skills/objectstack-data/SKILL.md (≈L450–453): a bare field ref in requiredWhen / readonlyWhen / visibleWhen, a validation rule, a formula, or an RLS/sharing predicate "evaluates to null and never fires".
  • skills/objectstack-ui/SKILL.md (≈L269–271): a bare field ref in an action visible / disabled or a field visibleWhen "evaluates to null and hides the control on every record (the "button never shows" trap)".

What main does (to be re-read per site by the dev):

  • Object validation predicates: ruleScope binds only record / previous, so a bare done faults (Unknown variable). Since Script validation rules are silently skipped when their predicate fails to evaluate — fail-open is the wrong direction for a validation #4649 the rule validator is fail-CLOSED: an error-severity rule that cannot be evaluated rejects the write with a message naming the rule and the key, and a warning / info rule is logged (packages/objectql/src/validation/rule-validator.ts, docblock "Fail-CLOSED for unevaluable predicates"). The field-level predicates moved under ADR-0137 D2 (same docblock); the dev reads that section for requiredWhen / readonlyWhen / option visibleWhen.
  • Action / field visible in the console: evaluateVisibility (ui/packages/app-shell/src/providers/ExpressionProvider.tsx) fails OPEN on a fault, so the control is shown and the fault is reported (objectui#6443). Only navigation entries are withheld on a fault (objectui#12700).
  • The "evaluates to null" wording traces to the Formula guardrail: cel-js arithmetic silently returns null (double × int + bare identifiers) #1928-era comment on firstUndeclaredReference in packages/formula/src/cel-engine.ts. It describes the historical class, not today's runtime.
  • skills/objectstack-formula/SKILL.md (Verify) already says the engine throws. It is right and needs no change.

Expected

Each of the three passages states the symptom per site as main has it (validation: write rejected, naming the rule; action / field visible: shown, fault reported; and the field-level and RLS/sharing sites as their code reads), and keeps the prevention advice (os validate / os build, record.<field>). Growth is paid by deletion in the same file (ratchet at headroom 0). One PR for the three files. Eval cases only where a skill's eval convention asks for one.

Activity

  1. added
    documentationImprovements or additions to documentation
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    on Nov 6, 2026
  2. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p3 kept · domain:skills · re-queued · 2026-11-06T12:46Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#3 · huangyiirene · session_01J8VVAj7CvjkGXvgXzd6RZ7

    Claim: PM loop round 4 · 2026-11-06T17:51Z
    Session: session_01J8VVAj7CvjkGXvgXzd6RZ7
    Account: huangyiirene
    Branch: claude/project-thread-rzfmz0 (the card thread's designated branch; dev session session_01J8VVAjPD6BESVmRJphXXyw)
    Worktree: objectstack-issue-30893
    Domain: domain:skills
    Seat: domain:skills#3
    File surface: skills/objectstack-platform/references/operations.md (Verify your work, ≈L28–32), skills/objectstack-data/SKILL.md (≈L450–453), skills/objectstack-ui/SKILL.md (≈L269–271); in those skills' evals/*.json, only a case grading the "evaluates to null" symptom, if any; scripts/check-skills-token-ratchet.mjs only for those files' rows and only by the measured remainder under ruling record 6513306068 after same-file deletion; .changeset/*.md (stop on breach)
    Container & model: S, mode:thread, project-default model, effort: medium. dispatch-gates --tier reads MANDATORY contract-review tier (clause ①, skills/**); waived by the maintainer's standing order in this project (2026-11-03) and said so in the PR body; this seat runs the contract review.
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — teaching-text defect: three skills describe the pre-#4649 / pre-objectui#6443 "evaluates to null" symptom; objectstack carries the fix
    Thread-read: 6685146024
    Premise: holds on main bcf8a37e0: operations.md L28, objectstack-data SKILL.md L453 and objectstack-ui SKILL.md L271 say a bare field ref "evaluates to null".
    Serial constraints: PR #31019 (this seat, operations.md and its ratchet row) and PR #30995 (merge queue, objectstack-data/SKILL.md). The thread merges main after both land, before opening its PR (merge, never rebase).

    Changeset owed: '@objectstack/skills': patch, never skip-changeset. Fixes #30893. Tier H.

  4. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 6, 2026
  5. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#3 · huangyiirene · session_01J8VVAj7CvjkGXvgXzd6RZ7

    ACCEPT → PR #31028 comment 6693190679

    Tier H: awaiting an approval from os-zhuang or hotlong (requested).

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

Metadata

Metadata

Assignees

Labels

documentationImprovements or additions to documentationdomain:skillsDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatchpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions