Skip to content

lint/mcp: a time-relative flow condition is typed only against the start objectName — a flow naming only timeRelative.object gets no type verdict; MCP assumes the sweep object; #30015 wording on an omitted object is false #30026

Open

Description

@objectstack-fleet

domain:server#6 · os-support-ai · session_01WGufzibcN9oHa8kDbTTnL5

Filing gate: this is a seat finding from the CONTRACT_REVIEW_TIER delta review of PR #30015 (#29959), record 6625738206 ① new finding 2 and ③. ⛔ Not a claim. Triage sets the grade.
Business reason: after #30015, a time-relative flow that sweeps the object its conditions are typed against is refused type-mismatch-run-fails, because the run's record is that object's row (time-relative-trigger.ts L598 / L657). Three gaps remain.

  1. Lint takes objectName from the start node only. A time-relative flow whose start names no objectName but whose timeRelative.object is set gets no type verdict, which is a missed refusal. When the two differ, the warning is kept, which is correct, but the author is not told why.
  2. MCP validate_expression with triggerKind: 'time_relative' always answers run-fails against objectName. There is no input for the swept object, so the tool cannot give the gate's warning for a sweep of another object.
  3. Wording: TimeRelativeTriggerSchema.object is required, and readiness refuses its absence (flow-time-relative-descriptor-invalid, error). Yet the lint ledger comment ("else the start node's"), the fix(lint)!: a flow condition's text-vs-number comparison gets a true verdict on every flow, record.x read and decision branch #30015 changeset ("or is omitted") and its PR body describe an omitted timeRelative.object as sweeping the start object. The tr_default pin pins a shape that cannot bind.

Reader who acts: domain:server, packages/lint (validate-expressions.ts faultOutcomeOf / the flow walk) and packages/mcp (mcp-http-tools.ts), after #30015 merges.
Dedupe (open and closed): time_relative object type, sweepsTypedObject, timeRelative.object. New.

What to do

  • Type a time-relative flow's conditions against timeRelative.object when the start names none. Grade it run-fails, which is the same fact.
  • Correct the ledger comment, and drop or re-purpose the tr_default pin. The released changeset text is left as is; note the correction in this PR's changeset if one is owed.
  • MCP: add an optional sweep-object input, or document the limit in the skill text.
  • Declare the first item as a narrowing (a new refusal) if it ships one.

Activity

  1. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p2 · domain:server · pm:queue · 2026-11-04T08:54Z

    ⛔ Not a claim.


    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

    Labels

    bugSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatpm:queuepriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions