Repository navigation
docs(skills): teach connector_action input as an evaluated value slot and the openapi include allowlist - #28012
Conversation
… and the openapi include allowlist The automation skill still taught that `connectorConfig.input` is sent as written and that the `openapi` provider has no `include` key. Both stopped being true: the executor evaluates the input map through the shared value-slot map, and `providerConfig.include` is the mcp-style allowlist. Re-teach the SKILL.md row, the integration-recipes Holds bullet and recipe 1, and the integrations-declared eval case 1. Name that `os validate` does not judge the input slot yet. Pay the recipes growth with three same-file restatement cuts and raise its ratchet row by the measured remainder. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016WV4cwkH2Pj7G4DWB8WTaf
|
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS Contract-review-claim: session_016WV4d1QkPVVzNz3FJqb2iS · head 1f28d89 · 2026-10-30T07:56Z |
|
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS Contract reviewServed-tier: ① Derived judgmentsBase: the PR's merge base with
② Semver level
③ Boundary flags
④ Design judgmentRules face, per
No file in Implemented-by: VERDICT: PASS Must-fix: none. Should-fix:
|
|
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS 维护者速读
席位意见:ACCEPT。契约复核 PASS,没有 must-fix;每一句都对照了 main 上的代码。should-fix 不阻塞,留到下次改这些文件时处理:① 席位核对
|
Requested by Elon · project thread
domain:skills#2 · os-elon-musk · session_016WV4cwkH2Pj7G4DWB8WTaf
Fixes #27982
The family card folds #27987 (closed by triage as a duplicate of this card), so its two locations are fixed here too.
What changes
The automation skill re-teaches two things from the code, at the five locations the card lists:
skills/objectstack-automation/SKILL.md, theconnector_actionrow:connectorConfig.inputis a value-slot map likesubflowinput;os validatedoes not judge it yet, so a malformed envelope fails at run time. (Was: "sent as written — no CEL or{{ }}in it".)references/integration-recipes.md, the "Holds on every recipe" input bullet: a top-level CEL envelope is evaluated, any other value is sent as written ({…}and{{ }}are literal text), with one example that reads a record field into the input (input: { customer: { dialect: 'cel', source: 'record.stripe_id' } }), and the same registration-gap note.references/integration-recipes.md, recipe 1's closing sentence:providerConfig.includeallowlists operation keys as themcpprovider's does (absent = every operation; a non-array or unknown entry is fatal); trimming still keeps the package small. (Was: "Theopenapiprovider has noincludekey — the trimmed document is the allowlist".)evals/integrations-declared.jsoncase 1expected_output: the trimmed document stays, withincludenamed as the alternative allowlist; the per-contract payload now reads the record through a CEL envelope, so the "Three gaps" become two. Assertions are unchanged.Plus a
@objectstack/skillspatch changeset and one ratchet row (below).Why
packages/services/service-automation/src/builtin/connector-nodes.ts(after PR fix(service-automation): a connector_action evaluates a CEL envelope in connectorConfig.input #27980) callsresolveValueSlotMap(engine, cfg.input, variables, 'input', context)before dispatch.builtin/value-slot-map.tslistsconnector_actionconnectorConfig.inputbesidesubflow/mapinput,scriptinputs,screendefaultsandnotifytemplateData: an envelope-shaped top-level value is evaluated, a malformed one throws, and every other value is a literal copy.connector_actionnode'sconnectorConfig.inputvalue slot, because the spec expression ledger cannot address a sibling block ofconfig#27968 measured that a malformed CEL envelope, a template envelope and a bare'{rec.id}'all register underconnectorConfig.input, because the spec ledgerFLOW_NODE_EXPRESSION_PATHSonly addressesnode.config. The texts therefore do not tell the author that a{…}token there is refused (as Valid-but-silently-wrong item 1 says for the ledger slots); they say it is literal text. The skill names no card number, as elsewhere in the skills tree.include.packages/connectors/connector-openapi/src/openapi-provider.ts:54-84declaresproviderConfig.includewith "the same allowlist meaning as themcpprovider'sinclude";resolveIncludeListreturnsundefinedwhen absent and throws on a non-array or a non-string entry;:293-298refuses an entry the document does not carry.Token budget
SKILL.md: 6457 / 6457, no row change. Paid in the same file by cutting the row's restatement "(aconnectors:entry with aprovider, …)" of § Integrations are declared, not coded.references/integration-recipes.md: 2204 → 2236 (+32). Three same-file restatements cut first: recipe 1's comment "3.x only, … every$refdereferenced offline" (the paragraph under the recipe says it), recipe 5's ", written from the vendor's docs" (its heading says it), the OAuth bullet's "four variants and" (the Holdsauthbullet lists them). The remainder moves the row on the standing path: maintainer ruling 2026-10-27 「A:先削重复,余额按实测提高」, made the gate-recognised path by ruling record 6513306068 on [Decision] skills token ratchet: price evals/** out (they never enter a customer context), and make the standing 「先削重复,余额按实测提高」 ruling the gate-recognised path for teaching text — or keep the per-raise ruling round #27847. Arithmetic is in the row comment.ui/scripts/check-skill-eval-tokens.mjsis green (everymust_containtoken taught by its bundle).Verification
Head
1f28d891, baseorigin/main8f41b2d1.node scripts/pm/dispatch-gates.mjs --commandsderives 64 families; reconciled with--ran: 60 exit 0, 4 NOT MEASURED, 0 red, 0 unrun.check-skills-token-ratchet.mjs(and--self-test),check:skill-docs,check:skill-refs,check:skill-compatibility,check:skill-frame-sync,check:skill-identifier-liveness,check:pm-skill-id-lint,check-changeset-no-major,check-empty-changeset,check-closing-keyword-parity,check:doc-formula-expressions(afterturbo run build --filter=@objectstack/formula --filter=@objectstack/lint).node ui/scripts/check-skill-eval-tokens.mjsexit 0;integrations-declared.jsonparses, its assertions are unchanged, and the newexpected_outputholds everymust_containtoken and nomust_not_containtoken.dist):check:dts-closure,check:dual-build-cjs-loads,check:lean-entry-closure,check:sourcemap-no-sources-content. This diff touches no package source or build output; CI sweeps them.Clause-②: no
Metadata-protocol: none
Human Minimum
packages/specholds no runtime logic. (not touched)pnpm lintpasses. (no lint-covered source changed)main, one pull request.packages/spectouched: n/a.content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.Acceptance notes
connector_actionnode'sconnectorConfig.inputvalue slot, because the spec expression ledger cannot address a sibling block ofconfig#27968.维护者速读
input改教为会求值的值槽,openapi提供方改教为有include白名单;评测用例 1 随之更正。input(fix(service-automation): a connector_action evaluates a CEL envelope in connectorConfig.input #27980),include也已上线(feat(connector-openapi): declarative providerConfig.include operation allowlist #27387),旧文字会让 AI 把按记录取值当成平台缺口、把裁剪文档当成唯一白名单。skills/objectstack-automation/references/integration-recipes.md的 Holds 第二条与配方 1 末句。node scripts/check-skills-token-ratchet.mjs与node ui/scripts/check-skill-eval-tokens.mjs均为 0。🤖 Generated with Claude Code
https://claude.ai/code/session_016WV4cwkH2Pj7G4DWB8WTaf