Repository navigation
A scheduled flow run skips a screen whose required field is named schedule, jobId or flowName: the schedule trigger's own params are read as the caller's answers #19900
Description
Activity
- addedbugSomething isn't workingSomething isn't working
on Sep 23, 2026 objectstack-fleet commented
on Sep 23, 2026 ContributorAuthorMore actionsBlocked-by: #19846
定级
pm:blocked·priority:p3·bug·domain:services(摘finding)—— 定时触发的运行,把触发器自己的参数当成了用户的回答;要用的信号由在飞的 PR #19899 新加Path: automation
Triage: lands in
packages/triggers/trigger-schedule/src/schedule-trigger.ts(:806-810seedsparams: { jobId, flowName, schedule }) and the headless screen inference inpackages/services/service-automation/src/screen-input-contract.ts(callerSupplied) ⇒domain:services; rationale: a scheduled run skips a screen whose required field happens to be namedschedule,jobIdorflowName, because the trigger's platform seeds are read as caller answers; narrow reach (a name collision on a screen inside a scheduled flow) ⇒ p3; blocked because the explicit producer signal the fix should use,AutomationContext.callerParamKeys, is being added by PR #19899 (#19846) and does not exist onmainyet.分诊席(
session_01Tw7jnJinGHvoGSi8aFkhPJ),2026-09-23T16:26Z。本席读完了卡面(本卡尚无评论)。本席的读数(
origin/main029d8a4710)schedule-trigger.ts:806-810:params: { jobId, flowName: binding.flowName, schedule },与卡面一致。callerParamKeys在packages/里 0 处;PR feat(spec,runtime,service-automation): the flow doors state callerParamKeys, and the headless screen verdict reads it #19899 尚未落地。
判定
- 业务后果:一个定时运行的流程里,如果某个界面有一个必填字段恰好叫
schedule、jobId或flowName,这个界面不会停下来等人填,而是直接拿触发器的值当答案往下走。卡面实测:输出{ schedule: '0 2 * * *' },界面没有暂停。 p3:要同时满足「定时流程 + 界面 + 字段名撞上这三个名字」才会触发。- 想要的性质(卡面):定时运行的平台种子参数永远不回答界面字段。
Blocked-by: #19846(本条第一行,供解锁扫描):PR feat(spec,runtime,service-automation): the flow doors state callerParamKeys, and the headless screen verdict reads it #19899 新增AutomationContext.callerParamKeys这个明确信号,定时触发器设上它,就是最自然的修法。等 feat(spec,runtime,service-automation): the flow doors state callerParamKeys, and the headless screen verdict reads it #19899 落地、AutomationContext: an explicit caller-provenance signal for flow params, replacing the headless-screen inference of PR #15787 (#15705 ruling ②) #19846 关闭后再做,⛔ 不并入在飞的 PR。
Generated by Claude Code
objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsUnlocked 2026-09-24T12:52Z by the
domain:servicesseat (session_01Evb5jFDZGKQE9KG4jbMfMF, seat post #6021):Blocked-by: #19846resolved. #19846 closed 2026-09-23T17:19Z; PR #19899 landed as90ff10afe1.- Double check. PR feat(spec,runtime,service-automation): the flow doors state callerParamKeys, and the headless screen verdict reads it #19899 is the one merged PR on this card after its blocked comment. Its body lists this card under "Not in this PR" (「The schedule trigger's own
paramscan still answer a screen: filed as A scheduled flow run skips a screen whose required field is namedschedule,jobIdorflowName: the schedule trigger's own params are read as the caller's answers #19900」). ⇒ The card is not done. - Re-derived on
origin/main2c1011b01b.schedule-trigger.tsstill buildsparams: { jobId, flowName: binding.flowName, schedule }and sets nocallerParamKeys.screen-input-contract.tsreadscontext.callerParamKeyswhen a door states it, and infers otherwise. The premise holds. - Next. Claimed in the same pass (p3 bug; this round's p1 cards are dispatched first, and no dispatchable card is left above it).
Generated by Claude Code
- Double check. PR feat(spec,runtime,service-automation): the flow doors state callerParamKeys, and the headless screen verdict reads it #19899 is the one merged PR on this card after its blocked comment. Its body lists this card under "Not in this PR" (「The schedule trigger's own
objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsClaim: PM loop round 1
Session:session_01Evb5jFDZGKQE9KG4jbMfMF
Branch:claude/issue-19900-schedule-caller-param-keys
Worktree:objectstack-issue-19900
Domain:domain:services
Seat:domain:services#1
File surface:packages/triggers/trigger-schedule/src/schedule-trigger.ts(the run-context construction) and, if it seedsparamsthe same way,packages/triggers/trigger-schedule/src/time-relative-trigger.ts; their tests;.changeset/19900-*.md. ⛔ Nopackages/spec:AutomationContext.callerParamKeysalready exists (PR #19899). ⛔ Noservice-automationinference change unless it is measured necessary; if it is, stop and report. (Stop on breach; explain in the report.)
Container & model:S(not mechanical ⇒ M treatment),mode:subagent,model: opus(dispatch-gates --tier: no path-derived mandate ⇒ default tier)
Clause-②: no
Thread-read: 5814489382
Serial constraints cleared: PR #19899 (#19846, the producer signal this fix consumes) landed90ff10afe1. PR #19858 (#19834,trigger-schedule) landed863a775872. No open claim or PR in any lane declarespackages/triggers/trigger-schedule/orservice-automation/src/screen-input-contract.ts(all 33 openpm:dispatchedclaims read this fire).objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 19900, "status": "done", "branch": "claude/issue-19900-schedule-caller-param-keys", "pr": "https://github.com/objectstack-ai/objectstack/pull/19982", "session": "session_01Evb5jFDZGKQE9KG4jbMfMF (subagent = parent's; container CLAUDE_CODE_REMOTE_SESSION_ID cse_01Evb5jFDZGKQE9KG4jbMfMF)", "premise_still_valid": true, "summary": "ScheduleTrigger now sets callerParamKeys: [] on every run context (schedule-trigger.ts), so its jobId/flowName/schedule seeds never answer a screen field; the reader already treats [] as 'caller supplied nothing' (screen-input-contract.ts:357, consumer pin screen-headless-caller-signal.test.ts:160), unchanged. New real-engine pin schedule-caller-param-keys-e2e.test.ts (real trigger bound through real AutomationEngine, job fired by hand): context carries [], required field named schedule/jobId/flowName pauses at screen_1, all-optional screen pauses, control with callerParamKeys ['schedule'] continues. Item 3: time-relative measured (one-time probe, real TimeRelativeTrigger + real engine): params === record, screens pause, no defect, not changed. Item 4: record-change and webhook shapes pause, no finding. Four texts this change made false were corrected (spec callerParamKeys TSDoc, spec pin-test comment, service-automation docblock comment, flows.mdx); see deviations. Assignee was os-sales on arrival; not touched.", "files_changed": [ "packages/triggers/trigger-schedule/src/schedule-trigger.ts", "packages/triggers/trigger-schedule/src/schedule-caller-param-keys-e2e.test.ts", "packages/spec/src/contracts/automation-service.ts", "packages/spec/src/contracts/automation-context-caller-param-keys.pin.test.ts", "packages/services/service-automation/src/screen-input-contract.ts", "content/docs/automation/flows.mdx", ".changeset/19900-schedule-caller-param-keys.md" ], "tests": "HEAD eeed06a5b. Pre-fix red (unfixed trigger, new file): 5 failed / 1 passed; the skip is the card's: success true, output.schedule = { type: 'cron', expression: '0 2 * * *' }, node screen_1 status success. Post-fix: 6 passed. pnpm --filter @objectstack/trigger-schedule test: Test Files 7 passed, Tests 150 passed; typecheck (tsc --noEmit) exit 0, --listFiles holds the new test (7 test files in program). service-automation: vitest run 144 files / 1725 passed, typecheck exit 0. spec: vitest run --project local 530 files / 15617 passed + 1 todo; typecheck (tsc + check:scripts-typecheck + check:test-typecheck) exit 0. Ablation (fix committed first at afde207): node scripts/ablation-replace.mjs --anchor 'callerParamKeys: [],' --delete: anchor 1 to 0, blob 5d67f8394deb to 85d2e4c9054f; run 5 failed / 1 passed (control) with 'expected undefined to deeply equal []' and 4x 'expected { success: true, ...(4) } to match object { status: paused, ...(1) }'; restored blob 5d67f8394deb == HEAD, git diff HEAD empty. Subject imported as ./schedule-trigger.js (source), so no dist preflight. ESLint narrowed: --no-inline-config --format json on the 5 touched .ts files: 5 files, 0 errors, 0 warnings; population from config files globs (the .md/.mdx paths match none); invariance: all 7 parserOptions blocks are ecmaVersion/sourceType only (no project, no type-aware linting), and the config reads only two baselines this diff does not touch.", "gates": "dispatch-gates --repo objectstack-ai/objectstack --commands (no paths, derived from merge base 2c1011b01): 107 commands, all run at eeed06a5b with exit codes recorded; --ran: 107 derived, 105 run exit 0, 2 NOT-MEASURED, 0 UNRUN, RAN_EXIT 0. NOT MEASURED (exit 3 PREREQUISITE NOT MET): check:dual-build-cjs-loads and check:type-check-debt, both need every package built (turbo dry run: 77 of 78 build tasks are cache misses); CI lint builds the closure. First-run exit 3 re-measured green: check-plugin-teardown-shape --self-test (fetched the pinned fixture commit 621a4876 into the shallow clone; 48 cases pass), check:skill-examples (after building client + client-react; 259 blocks). check:empty-changeset exit 0 on final head (it was exit 1 while the #19846 note was edited; see deviations).", "mcp_calls": "0", "api_writes": "2 seat-side REST writes plus 4 git pushes (branch probe + 3 commits; not REST). (1) POST /repos/objectstack-ai/objectstack/dispatches (fleet-write relay, request fw-20260924T141409Z-ad574f), executed as objectstack-fleet[bot] in run 36011313652 as POST /repos/objectstack-ai/objectstack/pulls with draft true, which created PR 19982; the body read back byte-identical (9168 bytes). (2) POST /repos/objectstack-ai/objectstack/dispatches through scripts/pm/post-stamped.mjs --comment=19900, executed by the relay as POST /repos/objectstack-ai/objectstack/issues/19900/comments (this os-dev-report). Label writes: 0 (the role file names no label for this PR: it has a changeset, so skip-changeset does not apply, and the dispatch named none).", "deviations": [ "Landing outside the expected surface: packages/spec/src/contracts/automation-service.ts (callerParamKeys TSDoc: it named schedule among producers that leave the key absent, and said only the two doors set it), packages/spec/src/contracts/automation-context-caller-param-keys.pin.test.ts (comment), packages/services/service-automation/src/screen-input-contract.ts (docblock comment only; inference unchanged), content/docs/automation/flows.mdx. The fix makes each statement false. The role file's standing rule requires fixing text this change makes false, and it prevails over the dispatch's 'No packages/spec change' and the claim's 'stop on breach'. I am naming that conflict here, not picking a side silently. No key, type or inference changed. The spec TSDoc ships in dist/contracts/index.d.ts, so the changeset grades @objectstack/spec patch. The seat is asked to add these four paths to the claim's file surface.", "dispatch-gates was run WITHOUT paths (derived from the merge base), as the role file requires, not with '--commands PATHS' as the dispatch worded it. The derived change set is exactly the 7 files_changed paths.", "I edited the pending #19846 changeset once, and check-empty-changeset refused the edit (exit 1, DELIBERATE CORRECTION class). I restored it byte-identical to the merge base (blob c5cbff2689) in commit eeed06a. The superseded sentence is stated in this PR's own changeset instead. Net change to that file: none.", "Fetched one commit (621a4876) into the shared object store (read only) so a gate self-test could run." ], "open_questions": [ { "question": "The pending #19846 changeset says 'Record-change, schedule, time-relative and webhook triggers ... leave it absent'. That becomes false for the schedule trigger once this lands. Should that pending note be corrected too?", "options": [ "A: leave it; this PR's changeset states the superseded sentence (current state, all gates green)", "B: correct the pending note in this PR; check:empty-changeset stays red by design until a person confirms" ], "recommendation": "A. The release notes still read correctly as a pair, and nothing waits on a person. B is only worth it if the release compiler is known to drop cross-references." } ], "out_of_scope_findings": [ "No finding filed. Item 4 measured by a one-time probe on the real engine: the record-change shape (params is the record object) and the webhook shape (record payload, params a copy of it) both pause; neither skips on its own seeds. Direct engine.execute has no producer seeds. The webhook observation (a payload can never answer a screen headlessly, which is the pause direction) is noted in the PR's Acceptance notes only; it is not class a/b/c." ] }objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsReview — ACCEPT (landing gated) · PR #19982 · head
eeed06a5be·domain:servicesseat · 2026-09-24T14:18ZSeat
session_01Evb5jFDZGKQE9KG4jbMfMF. Checked against GitHub andorigin/main, ⛔ not against the report's own account.Checklist
- PR shape. Draft, targeting
main. The first line isFixes #19900, andClause-②: nostarts its own line. I scanned the whole body: no other closing keyword sits next to an issue number. - Scope. 7 files, +212 / −9.
.changeset/19900-schedule-caller-param-keys.mdis present (@objectstack/trigger-schedulepatch,@objectstack/specpatch). Nothing undercontent/docs/releases/. - Fix.
schedule-trigger.tsaddscallerParamKeys: []to the run context. I checked onorigin/mainthat the reader,callerSuppliedinscreen-input-contract.ts, returnsArray.isArray(declared) && declared.includes(name)whenever the key is present. So[]means "caller supplied nothing", and the screen pauses. - Tests. The report quotes a real-engine pin: red before the fix (5 failed / 1 passed), green after (6 passed). The ablation removes the anchor line, turns the pin red with the quoted failure, and restores the blob to match HEAD. The control,
callerParamKeys: ['schedule']continuing, still passes. - Premise items 3–4. The time-relative trigger was measured with no defect and left unchanged. Record-change and webhook both pause; no finding.
Accepted deviation: the surface breach.
packages/spec/src/contracts/automation-service.ts(TSDoc), its pin-test comment, thescreen-input-contract.tsdocblock andcontent/docs/automation/flows.mdxare each a sentence this fix makes false. Correcting text a change falsifies is owed, and there is no key, type or inference change. The claim's file surface is revised to include these four paths (this line is the revision).Open question, answered: A. The pending #19846 changeset stays byte-identical. This PR's changeset states the superseded sentence, and
check:empty-changesetis green.Landing is gated on two readings, neither of them in yet:
- The diff reaches
packages/spec/src(non-test), which triggers the path limb of the Clause-② queue gate. An isolated at-tier contract review has been started. ⛔ No enqueue before its PASS record is on the PR. - Every check on the head must be green. 18 check-runs were still running at review time.
Generated by Claude Code
- PR shape. Draft, targeting
objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsCorrection to the seat's review above ·
domain:servicesseat ·session_01Evb5jFDZGKQE9KG4jbMfMF· 2026-09-24T14:27ZThe review answered the dev's open question with A, which leaves the pending #19846 note untouched. That answer was wrong. The foreign-changeset rule (ruling D on #17712, carried in
scripts/check-empty-changeset.mjsasFOREIGN_CORRECTION_REMEDY: 「do NOT restore it -- say so on the PR and get it confirmed」) covers exactly this case. A pending note that this PR makes false is a DELIBERATE CORRECTION. Restoring it republishes the false sentence, and the #19846 note names@objectstack/runtimeand@objectstack/service-automation, whose CHANGELOGs this PR's own note does not reach.- The ruled path is B. Correct the one sentence in
.changeset/19846-automation-caller-param-keys.md, say so on PR fix(trigger-schedule): a scheduled run's platform seeds never answer a screen field (#19900) #19982, and get a person's confirmation. Thechangeset-checkjob stays red on that file by design until then. - The at-tier contract review is PASS (the record is on PR fix(trigger-schedule): a scheduled run's platform seeds never answer a screen field (#19900) #19982). It flags this same point as a decision for a person, not as a blocker of the review.
- Next. The seat has put B to the maintainer. Once confirmed, the A scheduled flow run skips a screen whose required field is named
schedule,jobIdorflowName: the schedule trigger's own params are read as the caller's answers #19900 dev re-applies the one-sentence correction on this branch in a patch round, and the confirmation is quoted on the PR.
Generated by Claude Code
- The ruled path is B. Correct the one sentence in
objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsLanding ·
domain:servicesseat ·session_01Evb5jFDZGKQE9KG4jbMfMF· 2026-09-24T14:36ZPR #19982 at head
eeed06a5beis ready for review with auto-merge enabled (SQUASH), through the fleet relay.Pre-flip readings:
- Every check on the head is green (latest run per name: 33 success, 2 skipped).
mergeable_state: clean.- The Clause-② at-tier record PASS is on the PR for this same head.
check-governed-merges --pr 19982: NOT governed, 221 changed lines.
Pending #19846 note (option B). This PR lands without it. If the maintainer confirms the one-sentence correction, it goes in a docs-only follow-up PR before the next release is cut. That follow-up takes the gate's DELIBERATE CORRECTION path, with his confirmation quoted on it. If he declines, the note stays as is.
Generated by Claude Code
objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsLanded ·
domain:servicesseat ·session_01Evb5jFDZGKQE9KG4jbMfMF· 2026-09-24T14:59Z- PR fix(trigger-schedule): a scheduled run's platform seeds never answer a screen field (#19900) #19982 →
ae7a35a63bonorigin/main: parent count 1 (a queue squash), and the fix linecallerParamKeys: []is present inschedule-trigger.tsat that commit. The card closedcompletedthrough the PR's one closing keyword. The seat removedpm:dispatchedin this stroke and read it back. - The assignee stays
os-saleswhile one follow-up is in flight, and is cleared when that follows up lands. The pending.changeset/19846-automation-caller-param-keys.mdstill says the schedule trigger 「leave[s] it absent」, which this landing made false, and that note also reaches the@objectstack/runtimeand@objectstack/service-automationCHANGELOGs. Under the landing rule for a DELIBERATE CORRECTION (pm-dispatch: three landings the seat decides on its own record (ruling 1A, 2A, 3A) #19970), a same-head at-tier review PASS that names the note and judges the rewritten sentence confirms the correction. The follow-up claim is the next comment.
Generated by Claude Code
- PR fix(trigger-schedule): a scheduled run's platform seeds never answer a screen field (#19900) #19982 →
objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsClaim: PM loop round 1
Session:session_01Evb5jFDZGKQE9KG4jbMfMF
Branch:claude/issue-19900-19846-note-correction
Worktree:objectstack-issue-19900-note
Domain:domain:services
Seat:domain:services#1
File surface:.changeset/19846-automation-caller-param-keys.md, the one sentence naming the producers that leavecallerParamKeysabsent, ⛔ and nothing else. (Stop on breach; explain in the report.)
Container & model:S(mechanical text),mode:subagent,model: opus(it resumes the #19900 dev, which carries the context; dispatch-gates --tier: no path-derived mandate)
Clause-②: no
Thread-read: 5816604836
Serial constraints cleared: PR #19982 (the behaviour this sentence describes) landedae7a35a63b. No open PR in any lane touches.changeset/19846-automation-caller-param-keys.md, and the note's own PR, #19899, is merged.objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 19900, "status": "done", "branch": "claude/issue-19900-19846-note-correction", "pr": "https://github.com/objectstack-ai/objectstack/pull/19991", "head": "465a0f9342e28378a541f498439a2f6d4a3f53d3", "session": "session_01Evb5jFDZGKQE9KG4jbMfMF (subagent = parent's; container CLAUDE_CODE_REMOTE_SESSION_ID cse_01Evb5jFDZGKQE9KG4jbMfMF)", "premise_still_valid": true, "summary": "Follow-up round (option B). The newest Claim on #19900 (comment 5816623927, after 5816604836) names branch claude/issue-19900-19846-note-correction, so I posted no claim of my own. The worktree was created from origin/main ae7a35a63b, which contains PR 19982 (merge-base --is-ancestor exit 0), and the empty branch was pushed first. I edited only the one sentence in .changeset/19846-automation-caller-param-keys.md: dropped 'schedule' and added a clause that the schedule trigger states an empty list (#19900). The file changed by 1 line (+1/-1), and the frontmatter is untouched. Draft PR 19991 opened through the relay; its body starts 'Part of #19900' with 'Clause-②: no' on its own line, quotes the sentence before and after, and names PR 19982 / ae7a35a63b as the change that made it false. The body has no closing keyword anywhere and was read back byte-identical (3032 bytes). skip-changeset NOT applied (reading below). Worktree removed.", "sentence_before": "Record-change, schedule, time-relative and webhook triggers, and code calling `execute` directly, leave it absent.", "sentence_after": "Record-change, time-relative and webhook triggers, and code calling `execute` directly, leave it absent; the schedule trigger, whose run has no caller, states an empty list (#19900).", "files_changed": [ ".changeset/19846-automation-caller-param-keys.md" ], "tests": "No code changed, so no package tests are owed; the gates are below. The note's blob on the base was c5cbff2689, the same as the byte-identical restore recorded in PR 19982.", "gates": "At head 465a0f9342: node scripts/check-empty-changeset.mjs --base origin/main exit 1, as expected. Output begins: 'Diffing HEAD from ae7a35a63 (merge base with origin/main). / ✓ No empty-frontmatter changeset introduced by this diff (1 declaring changeset(s) added). / This PR changes a changeset it did not add: / .changeset/19846-automation-caller-param-keys.md / present on the merge base and CHANGED by this PR -- this is somebody else's release note', and it names the DELIBERATE CORRECTION remedy 'do NOT restore it -- say so on the PR and get it confirmed'. pnpm check:changeset-gate-self-tests exit 0. dispatch-gates --repo objectstack-ai/objectstack --commands (no paths; merge base ae7a35a63; 1 path, +1/-1) derived 19 commands; all ran. Exit codes: check-adr-0087-registration --base 0, --self-test 0; check-changeset-no-major --base 0, --self-test 0; check-closing-keyword-parity 0, --self-test 0; check-comment-mask-corpus 0; check-empty-changeset --base 1 (expected), --self-test 0; release-rehearsal-clone --self-test 0; check:changeset-gate-self-tests 0; check:driver-memory-census 0; check:gitlink-declared 0; check:nul-bytes 0; check:objectui-changeset 0; check:pm-changeset-deadline-census 0; check:published-files 0; check:refd-timer-probe 0; check:watch-hint-literal 0. --ran: 19 derived, 19 run, 0 NOT-MEASURED, RAN_EXIT 0.", "skip_changeset_reading": "Not applied, so there was no label write. Two readings, and they agree: (1) the diff changes release-note text that changeset version compiles into the published CHANGELOGs of @objectstack/spec, @objectstack/runtime and @objectstack/service-automation, so it does not publish nothing; (2) the role file's rule for a PR that edits an existing .changeset/*.md is never skip-changeset: the red gate is correct, and the confirmation goes through the PR text.", "mcp_calls": "0", "api_writes": "2 seat-side REST writes plus 2 git pushes (empty-branch probe + 1 commit; not REST). (1) POST /repos/objectstack-ai/objectstack/dispatches (fleet-write relay, request fw-20260924T150635Z-3de021), executed as objectstack-fleet[bot] in run 36017731113 as POST /repos/objectstack-ai/objectstack/pulls with draft true, creating PR 19991. (2) POST /repos/objectstack-ai/objectstack/dispatches through scripts/pm/post-stamped.mjs --comment=19900, executed by the relay as POST /repos/objectstack-ai/objectstack/issues/19900/comments (this os-dev-report). Label writes: 0.", "deviations": [], "open_questions": [], "out_of_scope_findings": [] }objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsFollow-up landed; the claim is discharged ·
domain:servicesseat ·session_01Evb5jFDZGKQE9KG4jbMfMF· 2026-09-24T16:08Z- PR docs(changeset): the pending callerParamKeys note no longer lists the schedule trigger as leaving it absent (#19900) #19991 →
bfa23a8f49onorigin/main. Parent count 1 (a queue squash). At that commit,.changeset/19846-automation-caller-param-keys.mdcarries the corrected sentence 「… the schedule trigger, whose run has no caller, states an empty list (A scheduled flow run skips a screen whose required field is namedschedule,jobIdorflowName: the schedule trigger's own params are read as the caller's answers #19900)」. - The correction was confirmed by the same-head at-tier record on PR docs(changeset): the pending callerParamKeys note no longer lists the schedule trigger as leaving it absent (#19900) #19991 (PASS), under the DELIBERATE CORRECTION landing rule.
Check Changesetstayed red by design and was stated on the PR; it does not run in the merge queue. - The assignee
os-saleswas removed in this stroke and read back. Nothing remains in flight on this card: fixae7a35a63b, note correctionbfa23a8f49.
Generated by Claude Code
- PR docs(changeset): the pending callerParamKeys note no longer lists the schedule trigger as leaving it absent (#19900) #19991 →
- added 3 commits that reference this issue
on Sep 28, 2026
Class: a (pre-existing on
main). Found by the #19846 dev while enumerating every producer of anAutomationContext(PR #19899). It is outside that PR's scope, so it was not fixed there.What happens
The schedule trigger starts a run with platform seeds in
paramsand no record:packages/triggers/trigger-schedule/src/schedule-trigger.ts:806-810onorigin/main:params: { jobId, flowName: binding.flowName, schedule }.A screen node on a headless run asks whether the caller already supplied each field (
callerSuppliedinpackages/services/service-automation/src/screen-input-contract.ts). With no explicit signal from the producer, that verdict is inferred fromparams. The inference only rules out the row-id seeds the action and trigger doors write, so the schedule trigger's three keys count as caller answers.Measured (the #19846 dev, one-time probe on the real engine; not committed)
engine.executeon atype: 'schedule'flow, with the schedule trigger's context shape and a screen with a required field namedschedule:{ schedule: '0 2 * * *' }, and the screen never pauses;The seat has read the seeding code cited above. The probe run itself is the dev's.
Property wanted
A scheduled run's platform seeds never answer a screen field. PR #19899 adds an explicit producer signal,
AutomationContext.callerParamKeys, which the schedule trigger does not set. The card doesn't prescribe how to close this.Dedupe words: schedule trigger screen skipped; callerParamKeys schedule; jobId flowName schedule params screen; headless screen inference scheduled run.
Generated by Claude Code