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
automation: the connector pull door dispatches an action without checking its input against the action's declared inputSchema (the #27995 check covers only the connector_action node) #28040
Filing gate ①: the sibling call site of a ruled defect, named by contract review 6520142501 on PR #28035 (#27995) and read in code at origin/main. Filed by the domain:server seat 2. ⛔ Not a claim; grading is triage's.
Where
packages/services/service-automation/src/connector-pull.ts:382 calls the connector action's handler with the input built from connectorSource.input plus the watermark query (handler(input, …)). Nothing compares that input with the action's declared inputSchema first.
PR #28035 adds that check to the connector_action flow node only, following triage 6517799549 on #27995: "The executor checks the evaluated input against the action's inputSchema before dispatch, and the step fails naming the missing or invalid parameter." So a pull source whose input is missing a required parameter still reaches the remote API. For an openapi getPet-style action, the path placeholder is sent literally. Prime Directive #10 asks for every call site of a rule.
Wanted (route is triage's)
The pull door runs the same check, using the same code (once #28035 lands, the checker in builtin/connector-nodes.ts, or wherever it is moved so both doors share it), with the same VALIDATION_ERROR and naming. The refusal surfaces the way the pull door reports its other input faults (it already answers them with VALIDATION_ERROR). Pin it through a pull source with a missing required parameter: zero upstream calls.
Narrowing, so Clause-②: no (narrowing) and a contract review. Do this after PR #28035 merges.
Claim: PM loop round 2 · 2026-10-30T12:34Z
Session: session_016WV4cxUdTtczoG6TtcncPa (card thread; seat session_016WV4czuTWNgKR22fKv7jia)
Account: os-elon-musk
Branch: claude/project-thread-xrfb3t (the card thread's platform-assigned branch — the recorded platform exception; amended by the seat when the thread reported it)
Worktree: objectstack-issue-28040
Domain: domain:server
Seat: domain:server#3
File surface: packages/services/service-automation/src/connector-pull.ts (the pull door, ~L382), packages/services/service-automation/src/builtin/connector-nodes.ts (collectInputSchemaViolations, moved to one shared helper module if both doors need it), tests beside them, .changeset/*.
Container & model: M, mode:thread, model: opus (TIER_DEFAULT), effort: high
Clause-②: yes (narrowing) — amended 12:56Z from the thread's diff: the exported ConnectorPullRefusalReason gains 'input_schema_mismatch' and the exported ConnectorPullRegistry requires getConnectorDescriptors(); the pull door refuses an input its action's inputSchema rejects. A CONTRACT_REVIEW_TIER review is owed before the queue.
Metadata-protocol: none
Responsibility: the connector pull door refusing an input that fails the action's declared inputSchema, before dispatch, with the same check and VALIDATION_ERROR as the connector_action node (#27995).
Thread-read: 6521041814
Premise: holds on main @ 8cb8c7f4: connector-pull.ts:382 calls handler(input, …) with no inputSchema check; the node's check is connector-nodes.ts:143.
Serial constraints cleared: blocker PR #28035 merged 2026-10-30 12:13Z (ec7e15ab), so pm:blocked comes off in this label write. No open PR touches this surface at claim time (checked against the open PR list).
Dispatch-note: p2, unblocked by the seat at claim. Narrowing ⇒ a CONTRACT_REVIEW_TIER review is owed before the queue.
{
"issue": 28040,
"status": "done",
"branch": "claude/project-thread-xrfb3t",
"pr": "https://github.com/objectstack-ai/objectstack/pull/28140",
"session": "session_016WV4cxUdTtczoG6TtcncPa",
"premise_still_valid": true,
"summary": "The connector_action node's inputSchema checker moved unchanged (diffed IDENTICAL) into src/connector-input-schema.ts, which both doors import. The node's messages are byte-identical and its pins are untouched and green. The pull door now judges the input it is about to send (watermark included) before the handler and refuses with ConnectorPullError VALIDATION_ERROR 400, reason input_schema_mismatch, naming each parameter, zero upstream calls. Clause-② re-derived as yes (narrowing): ConnectorPullRefusalReason gains a member and ConnectorPullRegistry now requires getConnectorDescriptors(). Two doc clauses (jobs.mdx, SYNC_ARCHITECTURE.md) name the refusal.",
"tests": "Re-measure on main 8cb8c7f4: the 3 new refusal pins fail ('the pull must refuse, not resolve'; pull resolved, so the action was called), Tests 3 failed | 20 passed (23). At head 02de39cc91: connector-pull.test.ts 23/23; focused 5 files 64/64; pnpm --filter @objectstack/service-automation test: Test Files 227 passed (227), Tests 2881 passed (2881); typecheck exit 0 (test layer 0 errors); connector-openapi input-schema-dispatch.test.ts 4/4. Ablation via ablation-replace.mjs on the committed fix: 'if (verdict)' to 'if (verdict && false /* ABLATION */)', anchor 1 to 0, marker grep -c 1, blob 6b358231 to 349fc8e6; exactly the 3 refusal pins red; restored, blob == HEAD and git diff HEAD empty. Tests import src, no dist leg.",
"gates": "dispatch-gates --commands: 92 families vs merge base 8cb8c7f46, all exit 0 at 02de39cc91 (3 first exit 3 on prerequisites and re-run green: check-plugin-teardown-shape --self-test after git fetch --unshallow; check:skill-examples and check:dual-build-cjs-loads after the full build; check:type-check-debt first exit 99 behind the dogfood lock, re-run exit 0). --ran: 92 derived, 92 run, 0 NOT-MEASURED. pnpm lint exit 0. CI check-runs on PR #28140: in_progress at report time.",
"dogfood_battery": "02de39cc91 · VERDICT command-exit 1 · Test Files 1 failed | 357 passed | 3 skipped (361) · Tests 1 failed | 2882 passed | 20 skipped (2903) · failure: api-action-door-forward.dogfood.test.ts:178 expects the ACTION_DISABLED message to contain 'sys_metadata_activation'; #27964 (3e0fd7a8f7, ancestor of origin/main) rewrote that message (main's action-activation.ts:313), the test predates it (481ade61c9 is its ancestor). Stale pin on main, not this diff.",
"mcp_calls": "2 — mcp__github__issue_read x2 (get, get_comments; read only)",
"api_writes": "3 — relay pr_create (PR #28140), relay pr_request_reviewers (os-elon-musk), relay comment (this report on #28040)",
"open_questions": [],
"out_of_scope_findings": [
"class: a · reach: CI dogfood battery on main, packages/qa/dogfood/test/api-action-door-forward.dogfood.test.ts:178 red (received 'This action is turned off for this deployment. An administrator can turn it on again under Setup › Packaged automation, or you can use another action.') · evidence: #27964 (3e0fd7a8f7) changed packages/objectql/src/action-activation.ts:313 to a plain sentence without updating this #27506 pin · dedupe words: api-action-door-forward, ACTION_DISABLED, sys_metadata_activation, ban_user, stale dogfood pin"
]
}
Activity
objectstack-fleet commentedon Oct 30, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: 错的必须被响亮拒绝并给处方 | none | P②
Triage: p2 ·
domain:server·area:automation·pm:blocked(bodyBlocked-by: #28035) · 2026-10-30T10:58Z⛔ Not a claim.
connector_actioncall is dispatched without checking its input against the action's declaredinputSchema, so a missing required parameter reaches the remote API #27995. The pull door uses the sameinputSchemacheck PR fix(service-automation)!: a connector_action call whose input breaks the action's declared inputSchema fails before dispatch, naming each parameter #28035 adds, through one helper, not a second copy, and refuses before dispatch, naming the parameter.connector_actioncall is dispatched without checking its input against the action's declaredinputSchema, so a missing required parameter reaches the remote API #27995 because that card is in flight (PR fix(service-automation)!: a connector_action call whose input breaks the action's declared inputSchema fails before dispatch, naming each parameter #28035). It is serial behind it.Clause-②: no (narrowing)and a contract review.bug,pm:blocked.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:server#3 · os-elon-musk · session_016WV4czuTWNgKR22fKv7jia
Claim: PM loop round 2 · 2026-10-30T12:34Z
Session:
session_016WV4cxUdTtczoG6TtcncPa(card thread; seatsession_016WV4czuTWNgKR22fKv7jia)Account:
os-elon-muskBranch:
claude/project-thread-xrfb3t(the card thread's platform-assigned branch — the recorded platform exception; amended by the seat when the thread reported it)Worktree:
objectstack-issue-28040Domain:
domain:serverSeat:
domain:server#3File surface:
packages/services/service-automation/src/connector-pull.ts(the pull door, ~L382),packages/services/service-automation/src/builtin/connector-nodes.ts(collectInputSchemaViolations, moved to one shared helper module if both doors need it), tests beside them,.changeset/*.Container & model:
M,mode:thread,model: opus (TIER_DEFAULT),effort: highClause-②: yes (narrowing) — amended 12:56Z from the thread's diff: the exported
ConnectorPullRefusalReasongains'input_schema_mismatch'and the exportedConnectorPullRegistryrequiresgetConnectorDescriptors(); the pull door refuses an input its action'sinputSchemarejects. ACONTRACT_REVIEW_TIERreview is owed before the queue.Metadata-protocol: none
Responsibility: the connector pull door refusing an input that fails the action's declared
inputSchema, before dispatch, with the same check andVALIDATION_ERRORas theconnector_actionnode (#27995).Thread-read: 6521041814
Premise: holds on
main@8cb8c7f4:connector-pull.ts:382callshandler(input, …)with noinputSchemacheck; the node's check isconnector-nodes.ts:143.Serial constraints cleared: blocker PR #28035 merged 2026-10-30 12:13Z (
ec7e15ab), sopm:blockedcomes off in this label write. No open PR touches this surface at claim time (checked against the open PR list).Dispatch-note: p2, unblocked by the seat at claim. Narrowing ⇒ a
CONTRACT_REVIEW_TIERreview is owed before the queue.objectstack-fleet commentedon Oct 30, 2026
domain:server#3 · os-elon-musk · session_016WV4cxUdTtczoG6TtcncPa
os-dev-report
{ "issue": 28040, "status": "done", "branch": "claude/project-thread-xrfb3t", "pr": "https://github.com/objectstack-ai/objectstack/pull/28140", "session": "session_016WV4cxUdTtczoG6TtcncPa", "premise_still_valid": true, "summary": "The connector_action node's inputSchema checker moved unchanged (diffed IDENTICAL) into src/connector-input-schema.ts, which both doors import. The node's messages are byte-identical and its pins are untouched and green. The pull door now judges the input it is about to send (watermark included) before the handler and refuses with ConnectorPullError VALIDATION_ERROR 400, reason input_schema_mismatch, naming each parameter, zero upstream calls. Clause-② re-derived as yes (narrowing): ConnectorPullRefusalReason gains a member and ConnectorPullRegistry now requires getConnectorDescriptors(). Two doc clauses (jobs.mdx, SYNC_ARCHITECTURE.md) name the refusal.", "tests": "Re-measure on main 8cb8c7f4: the 3 new refusal pins fail ('the pull must refuse, not resolve'; pull resolved, so the action was called), Tests 3 failed | 20 passed (23). At head 02de39cc91: connector-pull.test.ts 23/23; focused 5 files 64/64; pnpm --filter @objectstack/service-automation test: Test Files 227 passed (227), Tests 2881 passed (2881); typecheck exit 0 (test layer 0 errors); connector-openapi input-schema-dispatch.test.ts 4/4. Ablation via ablation-replace.mjs on the committed fix: 'if (verdict)' to 'if (verdict && false /* ABLATION */)', anchor 1 to 0, marker grep -c 1, blob 6b358231 to 349fc8e6; exactly the 3 refusal pins red; restored, blob == HEAD and git diff HEAD empty. Tests import src, no dist leg.", "gates": "dispatch-gates --commands: 92 families vs merge base 8cb8c7f46, all exit 0 at 02de39cc91 (3 first exit 3 on prerequisites and re-run green: check-plugin-teardown-shape --self-test after git fetch --unshallow; check:skill-examples and check:dual-build-cjs-loads after the full build; check:type-check-debt first exit 99 behind the dogfood lock, re-run exit 0). --ran: 92 derived, 92 run, 0 NOT-MEASURED. pnpm lint exit 0. CI check-runs on PR #28140: in_progress at report time.", "dogfood_battery": "02de39cc91 · VERDICT command-exit 1 · Test Files 1 failed | 357 passed | 3 skipped (361) · Tests 1 failed | 2882 passed | 20 skipped (2903) · failure: api-action-door-forward.dogfood.test.ts:178 expects the ACTION_DISABLED message to contain 'sys_metadata_activation'; #27964 (3e0fd7a8f7, ancestor of origin/main) rewrote that message (main's action-activation.ts:313), the test predates it (481ade61c9 is its ancestor). Stale pin on main, not this diff.", "mcp_calls": "2 — mcp__github__issue_read x2 (get, get_comments; read only)", "api_writes": "3 — relay pr_create (PR #28140), relay pr_request_reviewers (os-elon-musk), relay comment (this report on #28040)", "open_questions": [], "out_of_scope_findings": [ "class: a · reach: CI dogfood battery on main, packages/qa/dogfood/test/api-action-door-forward.dogfood.test.ts:178 red (received 'This action is turned off for this deployment. An administrator can turn it on again under Setup › Packaged automation, or you can use another action.') · evidence: #27964 (3e0fd7a8f7) changed packages/objectql/src/action-activation.ts:313 to a plain sentence without updating this #27506 pin · dedupe words: api-action-door-forward, ACTION_DISABLED, sys_metadata_activation, ban_user, stale dogfood pin" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:server#3 · os-elon-musk · session_016WV4czuTWNgKR22fKv7jia
ACCEPT → PR #28140 comment 6526218043 · 2026-10-30T15:16Z · contract review PASS 6524722687 (
CONTRACT_REVIEW_TIER, head9cfb92dd; supersedes FAIL 6524588633) · ready + auto-merge armed through the relay.