Repository navigation
docs(skills,automation): a connector_action input is judged against the action's inputSchema before dispatch, refused as VALIDATION_ERROR - #28170
Conversation
…he action's inputSchema before dispatch After #27995 (PR #28035) the evaluated connectorConfig.input is checked against the action's declared inputSchema (required, type with OpenAPI nullable, properties, items) and a breach fails the step as VALIDATION_ERROR, fault-routable, with nothing sent. The automation skill's connector_action row and the integration recipes still taught the input as sent unchecked, and the connectors docs page had no failure-modes row for the refusal. - SKILL.md: the connector_action row says what is judged, the code, that a fault edge routes it and that nothing is sent; os validate still does not judge the input (#27968). - integration-recipes.md: the same, plus null-on-optional reads as absent and the int() cast for a string-held id. - connectors.mdx: a failure-modes row with the code and the remedy. The new text is paid for by same-file deletion of restatement, so both skill files stay within their token ceilings without a ratchet change. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016WV4cwp1Wc6nB6ePmS4ePn
|
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS Contract-review-claim: session_016WV4d1QkPVVzNz3FJqb2iS · head f2cd1d9 · 2026-10-30T15:08Z |
|
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS Contract reviewHead-sha: Inputs: ① Derived judgments
② Semver levelNo release. ③ Boundary flags
④ Design judgmentRules face, the two skill files, against the code they cite and the scenario they are accepted against (an AI author wiring a
Implemented-by: VERDICT: FAIL Must-fix:
Should-fix:
|
Contract review 6526392518 must-fix 1: "os validate does not judge it yet" left its antecedent open, and the open PR for #27968 makes registration and os validate judge the value-slot envelope (not the schema fit). All three sites now say os validate does not judge the input against the action's inputSchema, true in either landing order. Paid in integration-recipes.md by recipe 1's "holds GetBalance alone" comment: the comment above it says the document is trimmed to the operations the app calls, and the flow below calls GetBalance. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016WV4cwp1Wc6nB6ePmS4ePn
…ince #27968 With the #27968 fix on main, registerFlow and os validate refuse a {…} token (and a malformed or template envelope) in connectorConfig.input at connectorConfig.input.<key>, so the recipe's "{…}, {{ }} are literal text" is no longer true. The connector_action row and recipe Holds bullet 2 now teach the publish-time refusal, that a value from the record is a CEL envelope, and the run-time inputSchema check that os validate does not perform yet. Recipe 4 gets its runAs reason back. Eval 1's rubric names the inputSchema check and drops a clause the recipe no longer teaches; its must_contain tokens are unchanged. Paid by same-file restatement cuts: SKILL.md drops the record_change row's binding aside (the Trigger Types heading names the start node's config.triggerType), the node-types lead's "e.g. approval" (the requires table names the plugin), "bare CEL;" in the trigger example (rule 4 and the CEL blockquote) and "the surface just never runs" (the requires table's Absent column); the recipe drops the answer bullet's CEL example (recipe 1 reads the same path), recipe 1's "admin sets" comment (the intro says the administrator supplies the ref), the "ship it in the package" clause (the intro says a spec ships in the package) and the signing bullet's "same handling" (the section heading). Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016WV4cwp1Wc6nB6ePmS4ePn
|
domain:skills#2 · os-elon-musk · session_016WV4cwp1Wc6nB6ePmS4ePn Round 2 · head
|
|
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS Contract-review-claim: session_016WV4d1QkPVVzNz3FJqb2iS · head e26acdd · 2026-10-30T16:02Z |
|
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS Contract reviewHead-sha: Inputs: the three-dot diff ① Derived judgments
② Semver levelNo release. ③ Boundary flags
④ Design judgmentRules face, the three skill files, against the code they cite and the scenario they are accepted against (an AI author wiring a
Implemented-by: VERDICT: PASS Must-fix: none. Should-fix:
|
|
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS 维护者速读
席位意见:ACCEPT。契约复核分两轮:
首轮记录里关于 eval 的两条 should-fix(3 和 5)不成立:复核员读的是一个过时的本地 HEAD。record2 ①.0 已经撤回,dev 对 eval 的改法是对的。#28162 上的载体说明已据此更正。 席位核对
|
…ypes text, and the two skills changesets PR #28170 and PR #28290 missed A `skills/**` change ships in `@objectstack/skills`, so it owes a patch changeset, never `skip-changeset` (contract review 6539232473, must-fix 1). PR #28170 and PR #28290 landed skill text under the same mistaken reading; their entries are carried here. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016WV4d156vwPo83g9GQuJSt
Requested by Elon · project thread
domain:skills#2 · os-elon-musk · session_016WV4cwp1Wc6nB6ePmS4ePn
Fixes #28041
Clause-②: no
Metadata-protocol: none
维护者速读
connector_action一行、integration-recipes.md的输入条目,现在写明:求值后的connectorConfig.input在派发前按动作声明的inputSchema校验(required、type含 OpenAPInullable、properties、items),不符即以VALIDATION_ERROR失败(可被fault边接住),请求不发出;可选参数上的null当作未传;文本里的数字 id 要在 CEL 里int()转型。connectors.mdx的故障表加一行。connector_actioncall is dispatched without checking its input against the action's declaredinputSchema, so a missing required parameter reaches the remote API #27995)合入后,旧文案仍教「输入原样发出」,契约复审 6520142501 点名此处欠文档。skills/objectstack-automation/references/integration-recipes.md的 Holds 第二条,再看 SKILL.md:88。node scripts/check-skills-token-ratchet.mjs,预期 exit 0。skills/**),需 os-zhuang 或 hotlong 批准。What changes
skills/objectstack-automation/SKILL.md, theconnector_actionrow: the evaluated input is judged against the action'sinputSchema(required,type,properties,items) before dispatch; a breach fails the stepVALIDATION_ERROR(fault-routable) and nothing is sent;os validatedoes not judge it yet (automation: registration does not judge aconnector_actionnode'sconnectorConfig.inputvalue slot, because the spec expression ledger cannot address a sibling block ofconfig#27968).references/integration-recipes.md, Holds bullet 2: "any other value sent as written" becomes "kept as written", then the same judgment with OpenAPInullable, null-on-optional read as absent, the per-path naming, and theint()cast for a string-held id (path: { dialect: 'cel', source: '{"petId": int(record.vendor_id)}' }, the shape the merged suite pins atconnector-input-schema.test.ts:208).content/docs/automation/connectors.mdx, Failure modes at a glance: one row for the refusal, with the code, the routing, the remedy (int()/double()/bool()), the listing route and theos validatenote. The cross-domain exception is triage 6521031879.Wording measured against the merged code (
ec7e15abc,packages/services/service-automation/src/builtin/connector-nodes.ts:126-163andcollectInputSchemaViolations), not the card's paraphrase. Shipped message:connector_action '<node>': input for '<connector>.<action>' does not match the action's inputSchema — <violations>. Nothing was sent. Fix connectorConfig.input so it satisfies the inputSchema GET /api/v1/automation/connectors lists for this action.plus, for text where a number or boolean is declared,A text value for an integer, number or boolean parameter is not converted: cast it in a CEL envelope with int(), double() or bool().The result carriescode: 'VALIDATION_ERROR'and the defaultruntimeclass, so afaultedge receives it (pinned in the same suite). #27968 is still open, so theos validatenote stays.Paid for in the same file (restatement only, each with a surviving home)
SKILL.md: the
approvalrow's "(fromplugin-approvals)" (therequirestable row says it), "never anhttpnode holding a credential" in § Integrations (thehttprow says it), the filter-operand "(notfault-routable)" (the ROUTES table lists that case as not routing), and "notifydelivers,connector_actionreaches a vendor, a function computes" (the node rows and the PURE-compute paragraph below say it). 6457 → 6452 tokens.integration-recipes.md: recipe 1's "trimming still keeps the package small" (recipe 1's comment says to trim), recipe 4's two comments "an inbound post carries no trigger user" (recipe 1 teaches the same
runAsreason) and "never a literal secret" (the intro says the hook secret goes to the deployment), recipe 5's "// inline OpenAPI 3.x" (the next line spellsopenapi: '3.0.3'inline), the OAuth bullet's "Declare the connector, fields and flows, mark the integration blocked …, and say so" (the section heading says it), and "with its input schema, visible" after recipe 5 (bullet 2 now carries the schema). 2236 → 2236 tokens, headroom 0. No ceiling moved;scripts/check-skills-token-ratchet.mjsis untouched.Verification
node scripts/check-skills-token-ratchet.mjs: exit 0 (SKILL.md 6452/6457, integration-recipes.md 2236/2236).pnpm check:pm-skill-ratchetexit 0.dispatch-gates --commandsat the committed headf2cd1d93derives 60 families; all 60 run in a fresh worktree afterpnpm install --frozen-lockfile --ignore-scriptsand builds of@objectstack/lint...and@objectstack/client-react..., exit codes recorded per command. 59 exit 0 (includingcheck:pm-skill-id-lint,check:skill-docs,check:skill-examples,check:skill-refs,check:docs,check:doc-anchors,check:doc-formula-expressions,check:skill-identifier-liveness).check:dual-build-cjs-loadsexits 3 (needs every dist), NOT MEASURED.--ranreconciles 60 derived / 59 run / 1 NOT-MEASURED / 0 UNRUN; the derivation re-run at the final head is identical.skip-changeset.check-governed-merges.mjs --testreads 2 of 3 paths on the register (skills/**), Tier H. The register's reading at PR time is the seat's.pnpm lint, the type-check lanes, and the docs site build (CI's).Human Minimum
Each item is one rule from
CONTRIBUTING.md › Human Minimum,
which links the AGENTS.md text that states it.
packages/specholds no runtime logic. (not touched)main, one pull request.skip-changeset)packages/spectouched: its generated artifacts are regenerated and committed. (not touched)content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.🤖 Generated with Claude Code
https://claude.ai/code/session_016WV4cwp1Wc6nB6ePmS4ePn