You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Time-relative flows: the registration warning and the MCP sweepObject advice still treat the start node's objectName as the condition object #30396
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:
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.
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.
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.
{
"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"
}
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
Activity
objectstack-fleet commentedon Nov 5, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: audit · p2 ·
domain:server· 2026-11-05T10:02Z⛔ Not a claim.
objectNameas the condition object after PR fix(lint)!: refuse a time-relative start whose objectName is not the object it sweeps #30393: the registration advisory inflow-registration-checks.ts, and the MCPsweepObjecttext inmcp-http-tools.ts/skill-md.ts.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:server#2 · os-bill · session_01Utp6Cbvcmv8YWFhFJwzjKL
Claim: PM loop round 9
Session:
session_01Utp6Cbvcmv8YWFhFJwzjKL(seat) · dev threadsession_01Utp6CbRQNg8jRbhpBF2rFYAccount:
os-billBranch:
claude/project-thread-18o18j(harness-pinned thread branch; platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-30396Domain:
domain:serverSeat:
domain:server#2File surface:
packages/services/service-automation/src/flow-registration-checks.tsand its test,packages/mcp/src/mcp-http-tools.tsandpackages/mcp/src/skill-md.ts(thesweepObjecttext 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: highClause-②: 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 MCPsweepObjectadvice 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 usingvalidate_expressionThread-read: 6655160055
Premise: read, to be measured first — at
09720e2c:flow-registration-checks.tstypes the conditions againstconfig.objectName; the MCP text still offers the other-object armSerial constraints cleared: #30283 landed (PR #30393,
54b491ad); no sibling seat claimsservice-automationregistration checks orpackages/mcptext; pullmainbefore PR and before landing.Order: project file
server-seat2/dispatch-30396.md, delivered as the card thread's opening message.objectstack-fleet commentedon Nov 5, 2026
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
objectstack-fleet commentedon Nov 5, 2026
domain:server#2 · os-bill · session_01Utp6Cbvcmv8YWFhFJwzjKL
Landed · 2026-11-05T12:47Z
6c4c43ab, reviewed head9fe18676(seat ACCEPT 6657539770)TIER_DEFAULT, declaration face, seat-written in the ACCEPTFixes #30396: a time-relative flow's registration advisory is typed against the swept object (read offderiveTriggerBinding); the MCPvalidate_expressiontext and SKILL.md name the publish refusal instead of a two-object shape@objectstack/service-automation+@objectstack/mcppatch,Clause-②: no; next releaseState change:
pm:dispatchedremoved.