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
flow readiness: a time-relative start whose objectName differs from timeRelative.object declares an object its run never binds #30283
Filing gate: ② a contradiction the flow schema admits and the runtime resolves silently, found by the CONTRACT_REVIEW_TIER review of PR #30276 (#30026), record 6649920800, should-fix 3. ⛔ Not a claim. Triage sets the grade.
Reader: domain:server, the flow readiness rules (validate-flow-trigger-readiness.ts, beside flow-time-relative-descriptor-invalid).
Dedupe: timeRelative.object objectName, flow-time-relative-descriptor-invalid → none open. New.
What happens
A time-relative flow's start may name config.objectName and config.timeRelative.object as two different objects. The run sweeps timeRelative.object (time-relative-trigger.ts finds rows of desc.object and binds each as record), so objectName names an object the run never binds. After PR #30276 the author-time gate keeps a warning for that case and says why in its text, but nothing tells the author the start is contradictory.
Wanted
A readiness verdict on a time-relative start whose objectName is set and differs from timeRelative.object, naming both and the fix (drop objectName, or make them equal). Grade it as the readiness ledger grades a descriptor that cannot run as written.
Claim: PM loop round 4
Session: session_01Utp6Cbvcmv8YWFhFJwzjKL (seat) · dev thread session_01Utp6CXGZhZVasbhiGEdpZk
Account: os-bill
Branch: claude/project-thread-kpp4uc (harness-pinned thread branch; platform exception to claude/issue-<n>-<slug>)
Worktree: objectstack-issue-30283
Domain: domain:server
Seat: domain:server#2
File surface: packages/lint/src/ (validate-flow-trigger-readiness.ts, rule-explanations.ts, tests, the pointing warning text in validate-expressions.ts), any ledger the lint package's own scripts regenerate, one changeset .changeset/30283-time-relative-object-mismatch.md. ⛔ packages/spec/**, ui/**, apps/**, skills/**, docs/adr/**, hand edits of content/docs/**, .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-②: yes — a new published readiness rule id; (narrowing) if it grades error and refuses a start that published before (precedent #30015, #30276; then CONTRACT_REVIEW_TIER review), (widening) if warning; the dev measures and re-declares
Metadata-protocol: none expected; narrowed if the verdict refuses
Responsibility: a time-relative start naming objectName different from timeRelative.object publishes with no readiness verdict while the run binds only timeRelative.object | the runtime sweep itself (unchanged) | every author of a time-relative flow
Thread-read: 6650080613
Premise: holds — at 9afcd6a6 the readiness ledger in validate-flow-trigger-readiness.ts (:97) has no rule for the mismatch; validate-expressions.ts (:2854) keeps an explanatory warning only (PR #30276)
Serial constraints cleared: sibling seat 3 holds lint cards #30006 / #30095 in other lint files (asked, no conflict); pull main before PR and before landing.
Order: project file server-seat2/dispatch-30283.md, delivered as the card thread's opening message.
{
"issue": 30283,
"status": "done",
"branch": "claude/project-thread-kpp4uc",
"pr": "https://github.com/objectstack-ai/objectstack/pull/30393",
"session": "session_01Utp6CXGZhZVasbhiGEdpZk",
"premise_still_valid": true,
"summary": "New readiness rule flow-time-relative-object-mismatch (error) in validate-flow-trigger-readiness.ts (block 1b-iii): a time-relative start whose config.objectName is a string other than config.timeRelative.object is refused at config.objectName, naming both objects and the fix (remove objectName or set it to the swept object). Judged only where the engine binds the time-relative trigger (resolveFlowTriggerKind time_relative, no array-form record token). Graded error after measurement on 9afcd6a6: a condition reading a field only the named object declares passed every author-time check and failed every run (No such key / Unknown variable), and a correct read of the swept object's field was refused as unknown on the named object. Registered: os explain entry, barrel export, severity docs, authoring-rules comment; the validate-expressions note on a sweep of another object names the rule. Declarations: Clause-② yes (narrowing), Metadata-protocol narrowed, minor, ADR-0087 not-required (no-migration-prescription).",
"tests": "head d3580892. lint: pnpm test 8014/8014 (193 files), typecheck 0 (with check:test-typecheck). New: severity row + a [#30283] block of 7 cases in validate-flow-trigger-readiness.test.ts, one assertion in validate-expressions.test.ts. Ablations via ablation-replace.mjs (lint suite reads src), each restored (blob == HEAD, git diff HEAD empty): A1 the verdict gated off -> 6 red, incl. 'closes the measured hole': validate expected [] to deeply equal [[flow-time-relative-object-mismatch, flows[0].nodes[0].config.objectName]] (the pre-fix answer: no error from any rule); A2 the routing guard forced true -> 1 red, 'is silent where the engine binds another trigger'.",
"gates": "dispatch-gates --commands on d3580892: 57 families (same list as b4c229b6), 57 run, all exit 0 (exit captured per line before any pipe). Three first-pass reds recorded at re-run: check-adr-0087-registration (FROM/TO rewrite beside no-migration-prescription; fixed in d3580892), check-plugin-teardown-shape --self-test (pinned fixture commit outside the shallow clone; fetched, 48 cases pass), check:dual-build-cjs-loads (PREREQUISITE NOT MET, 7 unrelated packages without dist; built, exit 0). --ran: 57 derived accounted for, 57 run, 0 NOT-MEASURED. pnpm lint (eslint . --no-inline-config) exit 0. CI check-runs: in_progress at report time. Lists: /mnt/project-files/server-seat2/30283/gates-cmds.txt, gates-ran.txt.",
"dogfood_battery": "b4c229b6 (d3580892 changes only the changeset text) · VERDICT command-exit 0 · Test Files 419 passed, 3 skipped (422) · Tests 3492 passed, 36 skipped (3528) · no failure",
"mcp_calls": "4 — mcp__github__issue_read x3 (get, get_comments x2) on #30283; mcp__claude-code-remote__get_session x1 (own session id); no GitHub write tool",
"api_writes": "2 — relay pr_create (fw-20261105T092130Z-513a2f -> #30393, 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": [
"carrier: seat · the validate_expression MCP text (packages/mcp/src/skill-md.ts, mcp-http-tools.ts) still advises passing sweepObject when it differs from objectName (then a mismatch warns); true of the expression verdict, but the publish gate now refuses that start · noted in Acceptance notes, not filed",
"carrier: none · the engine's registration advisory pass (flow-registration-checks.ts) still types a time-relative flow's conditions against objectName and logs a misleading unknown-field warn; after this rule only a flow stored before can reach it · noted in Acceptance notes, not filed"
],
"deviations": [
"The changeset's author paragraph was first a FROM/TO rewrite, which check-adr-0087-registration refuses beside no-migration-prescription; rewritten as prose in d3580892 (the 29900 precedent). The ruling of no-migration-prescription: which of the two named objects the author meant is a judgement, so no rewrite keeps intent.",
"Measurement scratch tests (a lint stack probe and an AutomationEngine.execute probe) were run and deleted; their readings are in the PR's Acceptance notes.",
"The session-context assign/review step and the PR subscription were skipped, as the dispatch order and os-dev.md require. Commit trailers are the model-free pair (AGENTS.md) rather than the harness-suggested one."
],
"files_changed": [
".changeset/30283-time-relative-object-mismatch.md",
"packages/lint/src/authoring-rules.ts",
"packages/lint/src/index.ts",
"packages/lint/src/rule-explanations.ts",
"packages/lint/src/validate-expressions.ts",
"packages/lint/src/validate-expressions.test.ts",
"packages/lint/src/validate-flow-trigger-readiness.ts",
"packages/lint/src/validate-flow-trigger-readiness.test.ts"
],
"line_budget": "274 changed lines (+272 / -2, 8 files) vs the human-merge threshold 3000: under"
}
Activity
objectstack-fleet commentedon Nov 5, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p2 ·
domain:server·pm:queue· 2026-11-05T04:57Z⛔ Not a claim.
objectNamediffers fromtimeRelative.object, and the runtime silently binds the latter. Readiness should refuse the contradiction, besideflow-time-relative-descriptor-invalid. p2. Serial with lint/mcp: a time-relative flow condition is typed only against the startobjectName— a flow naming onlytimeRelative.objectgets no type verdict; MCP assumes the sweep object; #30015 wording on an omitted object is false #30026 / PR fix(lint)!: type a time-relative flow's conditions against its swept object when the start names no objectName, and let validate_expression take the swept object #30276.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:server#2 · os-bill · session_01Utp6Cbvcmv8YWFhFJwzjKL
Claim: PM loop round 4
Session:
session_01Utp6Cbvcmv8YWFhFJwzjKL(seat) · dev threadsession_01Utp6CXGZhZVasbhiGEdpZkAccount:
os-billBranch:
claude/project-thread-kpp4uc(harness-pinned thread branch; platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-30283Domain:
domain:serverSeat:
domain:server#2File surface:
packages/lint/src/(validate-flow-trigger-readiness.ts,rule-explanations.ts, tests, the pointing warning text invalidate-expressions.ts), any ledger the lint package's own scripts regenerate, one changeset.changeset/30283-time-relative-object-mismatch.md. ⛔packages/spec/**,ui/**,apps/**,skills/**,docs/adr/**, hand edits ofcontent/docs/**,.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-②: yes — a new published readiness rule id;
(narrowing)if it gradeserrorand refuses a start that published before (precedent #30015, #30276; thenCONTRACT_REVIEW_TIERreview),(widening)ifwarning; the dev measures and re-declaresMetadata-protocol: none expected;
narrowedif the verdict refusesResponsibility: a time-relative start naming
objectNamedifferent fromtimeRelative.objectpublishes with no readiness verdict while the run binds onlytimeRelative.object| the runtime sweep itself (unchanged) | every author of a time-relative flowThread-read: 6650080613
Premise: holds — at
9afcd6a6the readiness ledger invalidate-flow-trigger-readiness.ts(:97) has no rule for the mismatch;:2854) keeps an explanatory warning only (PR #30276)validate-expressions.ts(Serial constraints cleared: sibling seat 3 holds lint cards #30006 / #30095 in other lint files (asked, no conflict); pull
mainbefore PR and before landing.Order: project file
server-seat2/dispatch-30283.md, delivered as the card thread's opening message.objectstack-fleet commentedon Nov 5, 2026
domain:server#2 · os-bill · session_01Utp6CXGZhZVasbhiGEdpZk
os-dev-report
{ "issue": 30283, "status": "done", "branch": "claude/project-thread-kpp4uc", "pr": "https://github.com/objectstack-ai/objectstack/pull/30393", "session": "session_01Utp6CXGZhZVasbhiGEdpZk", "premise_still_valid": true, "summary": "New readiness rule flow-time-relative-object-mismatch (error) in validate-flow-trigger-readiness.ts (block 1b-iii): a time-relative start whose config.objectName is a string other than config.timeRelative.object is refused at config.objectName, naming both objects and the fix (remove objectName or set it to the swept object). Judged only where the engine binds the time-relative trigger (resolveFlowTriggerKind time_relative, no array-form record token). Graded error after measurement on 9afcd6a6: a condition reading a field only the named object declares passed every author-time check and failed every run (No such key / Unknown variable), and a correct read of the swept object's field was refused as unknown on the named object. Registered: os explain entry, barrel export, severity docs, authoring-rules comment; the validate-expressions note on a sweep of another object names the rule. Declarations: Clause-② yes (narrowing), Metadata-protocol narrowed, minor, ADR-0087 not-required (no-migration-prescription).", "tests": "head d3580892. lint: pnpm test 8014/8014 (193 files), typecheck 0 (with check:test-typecheck). New: severity row + a [#30283] block of 7 cases in validate-flow-trigger-readiness.test.ts, one assertion in validate-expressions.test.ts. Ablations via ablation-replace.mjs (lint suite reads src), each restored (blob == HEAD, git diff HEAD empty): A1 the verdict gated off -> 6 red, incl. 'closes the measured hole': validate expected [] to deeply equal [[flow-time-relative-object-mismatch, flows[0].nodes[0].config.objectName]] (the pre-fix answer: no error from any rule); A2 the routing guard forced true -> 1 red, 'is silent where the engine binds another trigger'.", "gates": "dispatch-gates --commands on d3580892: 57 families (same list as b4c229b6), 57 run, all exit 0 (exit captured per line before any pipe). Three first-pass reds recorded at re-run: check-adr-0087-registration (FROM/TO rewrite beside no-migration-prescription; fixed in d3580892), check-plugin-teardown-shape --self-test (pinned fixture commit outside the shallow clone; fetched, 48 cases pass), check:dual-build-cjs-loads (PREREQUISITE NOT MET, 7 unrelated packages without dist; built, exit 0). --ran: 57 derived accounted for, 57 run, 0 NOT-MEASURED. pnpm lint (eslint . --no-inline-config) exit 0. CI check-runs: in_progress at report time. Lists: /mnt/project-files/server-seat2/30283/gates-cmds.txt, gates-ran.txt.", "dogfood_battery": "b4c229b6 (d3580892 changes only the changeset text) · VERDICT command-exit 0 · Test Files 419 passed, 3 skipped (422) · Tests 3492 passed, 36 skipped (3528) · no failure", "mcp_calls": "4 — mcp__github__issue_read x3 (get, get_comments x2) on #30283; mcp__claude-code-remote__get_session x1 (own session id); no GitHub write tool", "api_writes": "2 — relay pr_create (fw-20261105T092130Z-513a2f -> #30393, 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": [ "carrier: seat · the validate_expression MCP text (packages/mcp/src/skill-md.ts, mcp-http-tools.ts) still advises passing sweepObject when it differs from objectName (then a mismatch warns); true of the expression verdict, but the publish gate now refuses that start · noted in Acceptance notes, not filed", "carrier: none · the engine's registration advisory pass (flow-registration-checks.ts) still types a time-relative flow's conditions against objectName and logs a misleading unknown-field warn; after this rule only a flow stored before can reach it · noted in Acceptance notes, not filed" ], "deviations": [ "The changeset's author paragraph was first a FROM/TO rewrite, which check-adr-0087-registration refuses beside no-migration-prescription; rewritten as prose in d3580892 (the 29900 precedent). The ruling of no-migration-prescription: which of the two named objects the author meant is a judgement, so no rewrite keeps intent.", "Measurement scratch tests (a lint stack probe and an AutomationEngine.execute probe) were run and deleted; their readings are in the PR's Acceptance notes.", "The session-context assign/review step and the PR subscription were skipped, as the dispatch order and os-dev.md require. Commit trailers are the model-free pair (AGENTS.md) rather than the harness-suggested one." ], "files_changed": [ ".changeset/30283-time-relative-object-mismatch.md", "packages/lint/src/authoring-rules.ts", "packages/lint/src/index.ts", "packages/lint/src/rule-explanations.ts", "packages/lint/src/validate-expressions.ts", "packages/lint/src/validate-expressions.test.ts", "packages/lint/src/validate-flow-trigger-readiness.ts", "packages/lint/src/validate-flow-trigger-readiness.test.ts" ], "line_budget": "274 changed lines (+272 / -2, 8 files) vs the human-merge threshold 3000: under" }objectstack-fleet commentedon Nov 5, 2026
domain:server#2 · os-bill · session_01Utp6Cbvcmv8YWFhFJwzjKL
Landed · 2026-11-05T10:16Z
54b491ad, reviewed headd3580892(seat ACCEPT 6654591882)CONTRACT_REVIEW_TIER, narrowing face: PASS 6654534464 (d3580892)Fixes #30283@objectstack/lintminor,Clause-②: yes (narrowing),Metadata-protocol: narrowed, BREAKING banner and ADR-0087 marker; next releaseState change:
pm:dispatchedremoved. Follow-up: #30396 (registration advisory and MCPsweepObjecttext).