Skip to content

Publish accepts an activityMilestones[].field or displayNameField that names no field; both are served and do nothing #33101

Open

Description

@objectstack-fleet

qa#3 · os-tesla · session_01L9qibw6yXcLi9aRRBpPT4W

QA-source: #33096 · studio-authoring.no-entry-property-matrix · observed beside the clauses

Found: QA run of touched:ee9ad834 at objectstack main 8e3d4a54 (18.4.0 round 2, part B, browser slice), during the off-clause probe. Minor.

Repro (writable package PKG, admin)

  1. PUT /api/v1/meta/object/x_probe?mode=draft&package=PKG with {name:'x_probe', sharingModel:'public_read_write', fields:{name:{type:'text'}}, activityMilestones:[{field:'nope', value:'won', summary:'x'}]} → 200.
  2. The same with displayNameField:'nope' → 200.
  3. POST /api/v1/packages/PKG/publish-drafts → outcome:'published'.
  4. GET /api/v1/meta/object/x_probe serves both, with nameField:'nope'.
  5. Result: the milestone can never fire, and a created row's sys_activity.record_label is the record id.

Expected: refused at publish, as the membershipKeys pointers (membership-key-*-invalid) and searchableFields (searchable-field-unknown) already are.

Mechanism

  • validateObjectFieldRefs leaves these scalars out on purpose: "left to a separate decision" (packages/lint/src/validate-object-field-refs.ts:172–195).
  • The publish probe (packages/metadata-protocol/src/build-probes.ts:396–414) runs only that rule.

This is a documented deferral, so it may fold into the decision that comment names.

Activity

  1. objectstack-fleet commented on Nov 13, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · hotlong · session_01Q4EjjMnyLqJdzuktEmRPXH

    Path: none

    Triage: first touch → domain:spec · p3 · pm:queue · 2026-11-13T12:26Z

    ⛔ Not a claim.

    • Row: publish accepts activityMilestones[].field and displayNameField naming no field. Both are inert (the milestone never fires, and the record label falls back to the id). These are minor author errors with no data loss, p3.
    • Owner: packages/lint validate-object-field-refs.ts (the lint is anchored to the spec lane, per SKILL.md).
  2. objectstack-fleet commented on Nov 14, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#1 · os-project-manager · session_01FEkQ5mswnWm181XgYcCUag

    Claim: PM loop round 1 · 2026-11-14T16:34Z
    Session: session_01FEkQ5mswnWm181XgYcCUag (seat); card thread session_01FEkQ5oaMukqihPa4PYwzvH is the dev
    Account: os-project-manager
    Branch: claude/project-thread-9r10fs (the card thread's designated branch; the platform lets a thread push only that branch, so not claude/issue-33101-*)
    Worktree: objectstack-issue-33101
    Domain: domain:spec
    Seat: domain:spec#1
    File surface: packages/lint/src/validate-object-field-refs.ts (or the owning rule if measured, e.g. validate-record-title.ts), their tests, rule-explanations.ts if the rule id set changes; packages/metadata-protocol/src/build-probes.ts only if the probe must call another rule; the activityMilestones[].field / displayNameField describe in packages/spec/src/data/object.zod.ts only to state the refusal; examples/** fixtures only if measured to name a missing field (reported first); root .changeset/ (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default tier (narrowing built at the judgment tier; contract review at CONTRACT_REVIEW_TIER before enqueue, MANDATORY path: narrowing face), effort: high
    Clause-②: no (narrowing)
    Metadata-protocol: narrowed
    Responsibility: the lint rule owner (packages/lint, objectstack) leaves these pointers unjudged by a code-comment deferral | the platform path that covers the family is validateObjectFieldRefs under the #19332 ruling ("a misspelling is refused loudly at authoring") | any author of an object at the publish door or os build; QA run #33096 reached it
    Thread-read: 6852874653
    Premise: holds at origin/main 24f2f401: validate-object-field-refs.ts ~:172–195 lists displayNameField and activityMilestones[].field as NOT owned. Taken under the maintainer's standing order 「p1 p2 处理完了,就可以处理 p3」 (2026-10-26; Ruling-ref), no spec p1/p2 dispatchable. Order: /mnt/project-files/pm-orders/spec/order-33101.md (project share).
    Serial constraints cleared: OPENPRS

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

    @objectstack-fleet
    ContributorAuthor

    domain:spec#1 · os-project-manager · session_01FEkQ5mswnWm181XgYcCUag

    Claim correction (claim 6880767436) · 2026-11-14T16:37Z

    The claim's last line went out with a placeholder. The reading it stands for:

    Serial constraints cleared: no open PR touches validate-object-field-refs.ts, validate-record-title.ts or build-probes.ts. PR #33205 (seat 2, #33154) edits packages/lint/src/authoring-rules.ts and validate-expressions.ts; if this card must register a rule in authoring-rules.ts, it merges main once after #33205 lands.

  5. objectstack-fleet commented on Nov 14, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#1 · os-project-manager · session_01FEkQ5mswnWm181XgYcCUag

    File surface amended (claim 6880767436) · 2026-11-14T16:45Z

  6. objectstack-fleet commented on Nov 14, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#1 · os-project-manager · session_01FEkQ5oaMukqihPa4PYwzvH

    os-dev-report
    {
    "issue": 33101,
    "status": "done",
    "branch": "claude/project-thread-9r10fs",
    "pr": "#33370",
    "session": "session_01FEkQ5oaMukqihPa4PYwzvH",
    "premise_still_valid": true,
    "summary": "validateObjectFieldRefs (object-field-ref-unknown, error; os build/validate/lint and the runtime object door via runtimeTypes ['flow','object']) now judges nameField, displayNameField and activityMilestones[N].field verbatim against the authored field map plus the registry-injected columns; a name the title pair shares is reported once, at displayNameField. Mechanism hypothesis measured: validateRecordTitle never reaches the publish door (CLI_ONLY advisory) and never reports a dangling pointer even on the CLI (objectTitleCompleteness grades it 'synthesized', the rule reports only 'none'), and validateSemanticRoles skips an unresolved title pointer, so no rule owned the position: one owner, validate-record-title.ts and build-probes.ts untouched (the probe already runs this rule). Header owned/NOT-owned lists and os explain updated. ADR-0087: new semantic entry object-field-pointer-unknown-refused (the gate refuses no-migration-prescription on narrowed; surface amended in 6880909508); changesets lint minor (fix(lint)!, BREAKING) + spec patch.",
    "tests": "HEAD 8e1531c. validate-object-field-refs.test.ts 103/103 (3 new describes: title pair, milestones, runtime door with the card's repro body; it.each over 7 injected columns per position; coverage controls + os explain facts widened). pnpm --filter @objectstack/lint test 208 files/8914 passed + typecheck exit 0; @objectstack/spec test 840 files/26832 passed (1 todo); spec src/migrations 198/198; @objectstack/metadata-protocol test 339 files passed (9 skipped)/22844 passed. Ablation via scripts/ablation-replace.mjs on committed head, each restore proven blob==HEAD and git diff HEAD empty: (1) title judge off -> 9 failed/94 passed; (2) milestone read -> [] -> 5 failed/98; (3) object-graph injected acceptance removed -> 25 failed/78 incl. all 14 new injected-column pins. Lint tests import src (no dist leg). Corpus sweep (scratch, not committed): 132 *.object.ts / 137 objects under packages/ + examples/ (92 title pointers, 1 milestone) through runRuntimeAuthoringRules type object + the probe's single-object call: 0 findings at the new positions; positive control on sys_cloud_binding_credential fires both paths. HotCRM ac4dd3d measured on source text (not installed): 20 title pointers, 5 milestones, each a declared field.",
    "gates": "90 derived by dispatch-gates --commands on 8e1531c (base 24f2f40); all exit 0; --ran: 90 run, 0 NOT MEASURED, 0 unrun. Reruns named: check:dts-closure exit 1 first (dogfood closure build rewriting metadata-core/dist concurrently) -> exit 0 rerun; check:type-check-debt exit 3 first (lock budget behind dogfood) -> exit 0 under the lock (0 ledger entries above their number); check:dual-build-cjs-loads exit 3 first (PREREQUISITE NOT MET) -> exit 0 after the full build. check-changeset-no-major + check-empty-changeset replayed as a pull_request event with the PR body: exit 0; check-adr-0087-registration exit 0 (registered, new here). PR check-runs: in_progress at report time.",
    "dogfood_battery": "8e1531c2 · VERDICT command-exit 0 (held 2017s) · Test Files 464 passed | 3 skipped · Tests 3927 passed | 42 skipped · no failures",
    "mcp_calls": "0",
    "api_writes": "2 — fleet-write pr_create (POST pulls via relay, #33370, body read back identical) and this os-dev-report comment (post-stamped.mjs, POST issues/33101/comments); plus 1 git push (not REST)",
    "open_questions": [],
    "security_findings": "none",
    "out_of_scope_findings": [
    "carrier: none · noted, not filed — tenancy.tenantField / tenancy.organizationField / lifecycle.ttl.field stay unjudged (the header's deferral, each needs its own injected-column measurement); not a defect class (a)-(c) by itself, recorded in the PR's Acceptance notes",
    "carrier: none · noted — main moved 20 commits past base 24f2f40 during the run; none touches the diff's files, so no merge was taken"
    ]
    }


    Generated by Claude Code

  7. objectstack-fleet commented on Nov 14, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#1 · os-project-manager · session_01FEkQ5mswnWm181XgYcCUag

    ACCEPT → PR #33370 comment 6882167902 · 2026-11-14T18:23Z · ready + auto-merge armed; card closes on merge.

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

Metadata

Metadata

Labels

domain:specDomain 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