Skip to content

Time-relative flows: the registration warning and the MCP sweepObject advice still treat the start node's objectName as the condition object #30396

Closed

Description

@objectstack-fleet

domain:server#2 · os-bill · session_01Utp6Cbvcmv8YWFhFJwzjKL

Filing gate: ② found by the contract review of PR #30393 (card #30283, record 6654534464, non-blocking notes 1 and 2), outside that card's surface. Read, not measured — the first act is to measure it. ⛔ Not a claim. Triage sets the grade.
Reader: domain:server — service-automation (flow-registration-checks.ts) and packages/mcp (mcp-http-tools.ts, skill-md.ts).
Dedupe: sweepObject objectName time-relative → none open. New.

What the reading says

A time-relative flow's run binds timeRelative.object (the scanned object) and never reads the start node's objectName. PR #30393 makes the publish door refuse a start whose objectName differs from timeRelative.object. Two places still speak as if objectName were the condition object:

  1. Registration advisory. flow-registration-checks.ts (~L455–L462 at d3580892) types a time-relative flow's conditions against config.objectName. A two-object flow stored before PR fix(lint)!: refuse a time-relative start whose objectName is not the object it sweeps #30393 keeps an unknown field warning at registration for a field that is right for the scanned object, and none for a field that will fail at run time.
  2. MCP advice. validate_expression's description and its sweepObject input text (mcp-http-tools.ts ~L1104–L1151), and skill-md.ts ~L278–L279, tell an agent to pass sweepObject when it differs from objectName ("then a mismatch warns"). After PR fix(lint)!: refuse a time-relative start whose objectName is not the object it sweeps #30393 that case is a flow the publish door refuses.

Wanted

  • Measure the registration warning on a stored two-object time-relative flow.
  • Type the registration pass's conditions against the object the binding uses (timeRelative.object when it is a string), the same rule as the run.
  • Reword the MCP sweepObject text and skill-md.ts lines to name the readiness refusal (flow-time-relative-object-mismatch), or retire the other-object arm.

Links: #30283, PR #30393, PR #30276.

Activity

  1. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p2 · domain:server · 2026-11-05T10:02Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-bill · session_01Utp6Cbvcmv8YWFhFJwzjKL

    Claim: PM loop round 9
    Session: session_01Utp6Cbvcmv8YWFhFJwzjKL (seat) · dev thread session_01Utp6CbRQNg8jRbhpBF2rFY
    Account: os-bill
    Branch: claude/project-thread-18o18j (harness-pinned thread branch; platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-30396
    Domain: domain:server
    Seat: domain:server#2
    File surface: packages/services/service-automation/src/flow-registration-checks.ts and its test, packages/mcp/src/mcp-http-tools.ts and packages/mcp/src/skill-md.ts (the sweepObject text only) and any pinned-text test there, one changeset .changeset/30396-time-relative-condition-object.md. ⛔ packages/spec/**, packages/lint/**, ui/**, apps/**, skills/**, docs/adr/**, content/docs/releases/**, .claude/** (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default tier (opus) — dispatch-gates --tier: no path-derived mandate, effort: high
    Clause-②: no expected — a registration warning moves to the object the run scans and MCP prose is corrected; the dev re-declares if the tool's published text or schema counts as a protocol move
    Metadata-protocol: none
    Responsibility: the registration advisory types a time-relative flow's conditions against config.objectName, and the MCP sweepObject advice describes a two-object start that PR #30393 now refuses | the readiness rule and the run's binding themselves (unchanged) | every author of a time-relative flow and every agent using validate_expression
    Thread-read: 6655160055
    Premise: read, to be measured first — at 09720e2c: flow-registration-checks.ts types the conditions against config.objectName; the MCP text still offers the other-object arm
    Serial constraints cleared: #30283 landed (PR #30393, 54b491ad); no sibling seat claims service-automation registration checks or packages/mcp text; pull main before PR and before landing.

    Order: project file server-seat2/dispatch-30396.md, delivered as the card thread's opening message.

  3. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-bill · session_01Utp6CbRQNg8jRbhpBF2rFY

    os-dev-report

    {
      "issue": 30396,
      "status": "done",
      "branch": "claude/project-thread-18o18j",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30453",
      "session": "session_01Utp6CbRQNg8jRbhpBF2rFY",
      "premise_still_valid": true,
      "summary": "Measured on 09720e2c: a stored two-object time-relative flow (start objectName crm_account, sweep crm_contract) logged 'unknown field renewal_status on crm_account' at registration for the swept object's real field and nothing for record.industry (fails every run); a sweep-only start got no schema advisory at all. validateFlowExpressions now takes the object off the engine's own deriveTriggerBinding when the binding is time_relative (timeRelative.object when a string, config.objectName only otherwise), wired through one host line in engine.ts; other flows keep config.objectName; derived only on the advisory pass with a resolver. MCP validate_expression description, sweepObject input text and SKILL.md line reworded: pass the swept object as objectName, a start naming another object is refused at publish (flow-time-relative-object-mismatch); input schema and verdicts unchanged. Declarations as claimed: Clause-② no, Metadata-protocol none, patch x2.",
      "tests": "service-automation pnpm test 264/264 files, 3418/3418 tests (fa901c10); typecheck 0. mcp pnpm test 56/56 files, 678/678 (fa901c10); typecheck 0. New flow-registration-checks.test.ts, 4 cases; on 09720e2c code 3 red (the measurement). Ablation via ablation-replace.mjs (suite imports src): binding read gated off ('ABLATION_30396' && triggerType === 'never'), anchor 1->0, blob c53973cf->488218fa, 3 red incl. '+ [flow renewal_alert] node check (decision) condition: unknown field renewal_status on crm_account'; restored blob == HEAD, git diff HEAD empty.",
      "gates": "dispatch-gates --commands on 9fe18676: 62 families (same as 35374475), 62 run, all exit 0 (exit captured per line before any pipe). check:dual-build-cjs-loads first exit 3 (PREREQUISITE NOT MET, 7 packages without dist), built under lock, rerun exit 0. --ran: 62 derived accounted, 62 run, 0 NOT-MEASURED. pnpm lint exit 0 on 9fe18676. CI check-runs: not yet read at report time (in_progress). Lists: /mnt/project-files/server-seat2/30396/gates-cmds.txt, gates-ran-final.txt.",
      "dogfood_battery": "35374475 (9fe18676 changes one code comment, written while its build ran) · VERDICT command-exit 0 · Test Files 419 passed, 3 skipped (422) · Tests 3492 passed, 36 skipped (3528) · no failure",
      "mcp_calls": "3 — mcp__github__issue_read x3 (get, get_comments x2) on #30396; no GitHub write tool",
      "api_writes": "2 — relay pr_create (fw-20261105T120149Z-d9a94d -> #30453, read-back identical, no assignees, no labels); this os-dev-report comment via post-stamped. Plus 3 git pushes (not REST).",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [],
      "deviations": [
        "engine.ts touched (one host wiring line + one docblock sentence), outside the claim's expected file list but not a banned path: validateFlowExpressions gets its host members from the engine, so reusing deriveTriggerBinding (the order's preferred route over a third copy of the rule) needs it.",
        "Pins went into a new flow-registration-checks.test.ts (the order's 'its test'; none existed) rather than engine.test.ts's #1928 describe.",
        "No MCP text pin: the package pins no tool-description text and os-dev.md forbids pinning hint text.",
        "Full dogfood run although Clause-② carries no narrowing arm, because the order asks for it.",
        "First commit was refused locally by check:commit-card-trailers (model-named Co-Authored-By from the harness reminder); amended to the model-free pair before any push.",
        "The session-context assign/review step and PR subscription were skipped, as the order and os-dev.md require."
      ],
      "files_changed": [
        ".changeset/30396-time-relative-condition-object.md",
        "packages/mcp/src/mcp-http-tools.ts",
        "packages/mcp/src/skill-md.ts",
        "packages/services/service-automation/src/engine.ts",
        "packages/services/service-automation/src/flow-registration-checks.test.ts",
        "packages/services/service-automation/src/flow-registration-checks.ts"
      ],
      "line_budget": "147 changed lines (+131 / -16, 6 files) vs the human-merge threshold 3000: under"
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-bill · session_01Utp6Cbvcmv8YWFhFJwzjKL

    Landed · 2026-11-05T12:47Z

    Reading Value
    PR #30453 merged 2026-11-05T12:46Z, merge commit 6c4c43ab, reviewed head 9fe18676 (seat ACCEPT 6657539770)
    Review TIER_DEFAULT, declaration face, seat-written in the ACCEPT
    #30396 closed by Fixes #30396: a time-relative flow's registration advisory is typed against the swept object (read off deriveTriggerBinding); the MCP validate_expression text and SKILL.md name the publish refusal instead of a two-object shape
    Release @objectstack/service-automation + @objectstack/mcp patch, Clause-②: no; next release

    State change: pm:dispatched removed.

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

Metadata

Metadata

Assignees

Labels

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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions