Skip to content

docs(skills): teach connector_action input as an evaluated value slot and the openapi include allowlist - #28012

Merged
os-zhuang merged 1 commit into
mainfrom
claude/project-thread-3xu1av
Oct 30, 2026
Merged

os-zhuang merged 1 commit into
mainfrom
claude/project-thread-3xu1av

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

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:

  1. skills/objectstack-automation/SKILL.md, the connector_action row: connectorConfig.input is a value-slot map like subflow input; os validate does not judge it yet, so a malformed envelope fails at run time. (Was: "sent as written — no CEL or {{ }} in it".)
  2. 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.
  3. references/integration-recipes.md, recipe 1's closing sentence: providerConfig.include allowlists operation keys as the mcp provider's does (absent = every operation; a non-array or unknown entry is fatal); trimming still keeps the package small. (Was: "The openapi provider has no include key — the trimmed document is the allowlist".)
  4. and 5. evals/integrations-declared.json case 1 expected_output: the trimmed document stays, with include named 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/skills patch changeset and one ratchet row (below).

Why

  • Input slot. 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) calls resolveValueSlotMap(engine, cfg.input, variables, 'input', context) before dispatch. builtin/value-slot-map.ts lists connector_action connectorConfig.input beside subflow/map input, script inputs, screen defaults and notify templateData: an envelope-shaped top-level value is evaluated, a malformed one throws, and every other value is a literal copy.
  • Registration gap. automation: registration does not judge a connector_action node's connectorConfig.input value slot, because the spec expression ledger cannot address a sibling block of config #27968 measured that a malformed CEL envelope, a template envelope and a bare '{rec.id}' all register under connectorConfig.input, because the spec ledger FLOW_NODE_EXPRESSION_PATHS only addresses node.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-84 declares providerConfig.include with "the same allowlist meaning as the mcp provider's include"; resolveIncludeList returns undefined when absent and throws on a non-array or a non-string entry; :293-298 refuses an entry the document does not carry.

Token budget

Verification

Head 1f28d891, base origin/main 8f41b2d1. node scripts/pm/dispatch-gates.mjs --commands derives 64 families; reconciled with --ran: 60 exit 0, 4 NOT MEASURED, 0 red, 0 unrun.

  • Green, among them: 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 (after turbo run build --filter=@objectstack/formula --filter=@objectstack/lint).
  • Also run by hand: node ui/scripts/check-skill-eval-tokens.mjs exit 0; integrations-declared.json parses, its assertions are unchanged, and the new expected_output holds every must_contain token and no must_not_contain token.
  • NOT MEASURED (exit 3, prerequisite: a whole-tree 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

  • 1. Schemas start as Zod; packages/spec holds no runtime logic. (not touched)
  • 2. Every name I added uses the casing for its kind. (no names added)
  • 3. No formatter ran; pnpm lint passes. (no lint-covered source changed)
  • 4. One issue, one branch off an up-to-date main, one pull request.
  • 5. A change that publishes carries a changeset, and both declaration lines are filled in here and in the changeset.
  • 6. packages/spec touched: n/a.
  • 7. No hand edits to content/docs/references/, packages/*/CHANGELOG.md or content/docs/releases/.
  • 8. Title, body and comments are in English (the 维护者速读 block is the repo's Chinese channel).

Acceptance notes

维护者速读

  • 改了什么:自动化技能三个文件五处文字:连接器节点的 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 把按记录取值当成平台缺口、把裁剪文档当成唯一白名单。
  • 风险与回滚:只改说明文字与评测期望,不动代码;回滚即还原本 PR。
  • 先看: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。
  • 需要你做的:contract review owed(fable),席位复核 PASS 之前不求批。

🤖 Generated with Claude Code

https://claude.ai/code/session_016WV4cwkH2Pj7G4DWB8WTaf

… 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
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation tooling labels Oct 30, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS

Contract-review-claim: session_016WV4d1QkPVVzNz3FJqb2iS · head 1f28d89 · 2026-10-30T07:56Z

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 1f28d891b0dea2eacccd8c98d70401c92c4c42a7
Local-runs: probe — node scripts/check-skills-token-ratchet.mjs re-run in a detached worktree at the head, and once more with the base's two files swapped in, to pin the 2204 → 2236 raise and the SKILL.md 6448 → 6457 count that ① item 8 and 10 rest on (the eval-token gate and the dependency-free changeset / skill lints ran in the same worktree, every one exit 0; check-doc-authoring, check-closing-keyword-parity and check-skill-examples were not measurable there, no node_modules, and are read off the green CI families instead)
Scope: skills/objectstack-automation/SKILL.md, skills/objectstack-automation/references/integration-recipes.md, skills/objectstack-automation/evals/integrations-declared.json + packages/services/service-automation/src/builtin/connector-nodes.ts (:40-57 descriptor, :110-120 dispatch), packages/services/service-automation/src/builtin/value-slot-map.ts (header, resolveValueSlotMap :63, resolveValueSlot :96, copyLiteral :112), packages/services/service-automation/src/engine.ts (evaluateValueEnvelope doc :8960-8990), packages/services/service-automation/src/dag-traversal.ts :1104, packages/services/service-automation/src/builtin/connector-input-value-slot.test.ts :79-86 (read as the #27980 fixture), packages/spec/src/automation/flow-node-expression-paths.ts (FLOW_NODE_EXPRESSION_PATHS :341, isExpressionEnvelopeShaped :729), packages/spec/src/automation/flow.zod.ts :950-953, packages/spec/src/integration/connector.zod.ts :895, packages/spec/src/shared/connector-auth.zod.ts (ConnectorInstanceAuthSchema :118-158), packages/connectors/connector-openapi/src/openapi-provider.ts (:54-84, :285-298), scripts/check-skills-token-ratchet.mjs (rows :489 and :871-889), ui/scripts/check-skill-eval-tokens.mjs, .changeset/27982-automation-connector-input-slot.md

① Derived judgments

Base: the PR's merge base with origin/main is 8f41b2d13; a0cc51f4a (#27980, the executor), 7f17135aa (#27387, providerConfig.include) and 469436572 (#27985, the mcp refusal) are all ancestors of it. origin/main at review time (e199adfb7) has moved past the base only on unrelated skills files (data datasources.md / relationships.md, ui SKILL.md, formula and objectui evals, two objectui guides); nothing under skills/objectstack-automation/**, none of the cited code, and neither gate script changed, so every judgment below against the base is a judgment against main. Every sentence the diff adds or changes, judged against that tree:

  1. SKILL.md :88, "connectorConfig.input is a value-slot map like subflow input" — TRUE. connector-nodes.ts:117 calls resolveValueSlotMap(engine, cfg.input, variables, 'input', context) before the try, the same resolver and the same 'input' slot label as subflow-node.ts:95 and map-node.ts:180; the value-slot-map.ts header lists connector_action connectorConfig.input (automation: a connector_action node's connectorConfig.input is handed to the provider as written — a CEL envelope there passes os validate and is never evaluated, so a flow cannot send a per-record value to a declarative connector #27327) beside subflow / map input, script inputs, screen defaults and notify templateData. "Value slot" is the skill's own word for the siblings (SKILL.md :191 "Each operand is a value slot — a literal or a CEL envelope evaluated before the query"; Valid-but-silently-wrong item 1 names "subflow / map input.*"), so the card's "same words as its siblings" holds.
  2. SKILL.md :88 and recipes :21, "os validate does not judge it yet, so a malformed envelope fails at run time" — TRUE on main. FLOW_NODE_EXPRESSION_PATHS (flow-node-expression-paths.ts:341) carries no connectorConfig entry (the word connector occurs nowhere in that file); engine.ts evaluateValueEnvelope doc :8970-8976 states that the ledger addresses only node.config, that connectorConfig is a sibling block, that "a malformed one registers and faults at run time — until automation: registration does not judge a connector_action node's connectorConfig.input value slot, because the spec expression ledger cannot address a sibling block of config #27968 declares it"; automation: registration does not judge a connector_action node's connectorConfig.input value slot, because the spec expression ledger cannot address a sibling block of config #27968 is open. The executor resolves the map before dispatch, so a malformed envelope throws out of evaluateValueEnvelope (valueEnvelopeRefusals) and the node fails with its source; nothing is sent upstream. The registration gap is still real.
  3. Recipes :18-20, "a top-level CEL envelope is evaluated, any other value sent as written ({…}, {{ }} are literal text)" — TRUE. resolveValueSlot dispatches by shape: isExpressionEnvelopeShaped (a plain non-array object whose dialect is a string) → evaluateValueEnvelope; everything else → copyLiteral, which walks arrays and plain objects and hands strings on unchanged. "Top-level" carries the nested-envelope-is-literal rule the header spells. For the ledger slots a {…} token is refused by each executor's parseNodeConfig through FlowValueSlotSchema; connector_action publishes no configSchema (connector-nodes.ts:40-57) and the ledger does not reach connectorConfig, so a string like '{rec.id}' there is copied as the text it spells. The recipes sentence is the true one for this slot, and item 1's "refused at objectstack validate" list correctly leaves this slot out. The row's dropped parenthetical "(a connectors: entry with a provider, …)" is restated at SKILL.md :405-409.
  4. The record-field example input: { customer: { dialect: 'cel', source: 'record.stripe_id' } } works with the envelope the executor evaluates: { dialect, source } is envelope-shaped; dag-traversal.ts:1104 binds record in the run's variables (variables.set('record', context.record)), the same record.* scope the skill's sibling examples use (recipients: { dialect: 'cel', source: 'record.assignee' } :106, sourceId :115, recipe 4's record.tracking_no); the fix(service-automation): a connector_action evaluates a CEL envelope in connectorConfig.input #27980 fixture (connector-input-value-slot.test.ts:79-86) drives the identical shape (customerId: { dialect: 'cel', source: 'rec.id' }) through a real engine. The example sits in the Holds bullet, not inside recipe 1's schedule flow, where no record is bound — the placement is right.
  5. Recipes :64-66, "providerConfig.include allowlists operation keys as the mcp provider's does (absent = every operation; a non-array or unknown entry is fatal); trimming still keeps the package small" — TRUE. The spec types providerConfig as z.record(z.string(), z.unknown()) (connector.zod.ts:895, "validated by the provider factory at boot"), so the provider is the schema: openapi-provider.ts:54-63 declares include?: unknown with "the same allowlist meaning as the mcp provider's include"; resolveIncludeList :70-80 returns undefined when absent (every operation) and throws on a non-array or on any entry that is not a non-empty string; :285-298 throws on an entry the document does not carry. "Operation keys" is the provider's own vocabulary (an operationId, or the generated method_path key). Trimming advice: skills(objectstack-automation): integration-recipes and its eval still say the openapi provider has no include key; since #27387 it has one, with the mcp allowlist meaning #27987 left "whether trimming stays the recommended allowlist" to the skill owner; the head keeps trimming as the package-size reason, which is the residual truth (an include over the untrimmed 4.7 MB converted document still ships that document), and recipe 1's // holds GetBalance alone stays coherent with it.
  6. The three same-file cuts, each read against its claimed surviving home: (a) recipe 1's comment "3.x only, … every $ref dereferenced offline" — the same comment still says "OpenAPI 3.x document", the paragraph :61-64 says "Convert Swagger 2.0 or YAML and dereference every $ref offline, in-document ones included", and "package-relative" is kept: no fact lost; (b) recipe 5's ", written from the vendor's docs" — the heading :125 is "Vendor with no machine-readable spec — write the document by hand": no fact lost; (c) the OAuth bullet's "four variants and" — the declarative union ConnectorInstanceAuthSchema (connector-auth.zod.ts:118-158) has FOUR variants, none, bearer, api-key, basic; the Holds auth bullet :25-28 lists bearer, api-key, basic — three — and none is taught nowhere in the automation skill. The load-bearing fact "has no oauth2" survives, so this is a restatement cut in substance, but the row comment's "the Holds auth bullet lists them" over-states by one variant. Should-fix 1, not a must-fix: no taught sentence is false.
  7. Eval case 1 expected_output: the include alternative, the trimmed document kept, two named gaps instead of three, and the per-contract payload read through envelopeId: { dialect: 'cel', source: 'record.envelope_id' } — all follow items 2-5; assertions untouched. ui/scripts/check-skill-eval-tokens.mjs at the head: exit 0, "Every must_contain token is taught by its own skill bundle"; the ratchet prints the file at 1235 tokens, measured not ratcheted (6513306068 part 1). One PR-body claim is not literally true: "the new expected_output holds every must_contain token and no must_not_contain token" — type: 'api' is absent from the prose (it says "an api flow") and connector-esign is present ("not a connector-esign family"). Both were equally true of the main version, and no gate in the tree reads expected_output against the assertions (the eval-token gate judges must_contain against the bundle; the ratchet only measures), so nothing regresses and the eval self-consistency the ruling names (the fixture is one consistent story of what a correct answer does and avoids) holds. Should-fix 3 (PR-body wording only).
  8. Token ratchet, integration-recipes.md: the base's file is 8816 bytes, ceil(8816 / 4) = 2204, the old ceiling with zero headroom (confirmed by running the script with the base's file under the new row: "2204 tokens (ceiling 2236; headroom 32)"); the head's file is 8942 bytes, ceil(8942 / 4) = 2236, the new ceiling, pinned AT the measurement. The script at the head: exit 0, and --self-test 97 cases pass. The row comment quotes the 2026-10-27 ruling verbatim 「A:先削重复,余额按实测提高」 and names 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 as the standing path; the PR body quotes both. One arithmetic slip: the comment restates the previous row's "8814" start (the tree holds 8816 bytes; both round to 2204), so "+128 net" is +126 measured; the end point and the ceiling are exact. Should-fix 2.
  9. Stale claims elsewhere in skills/** at the head: "sent as written" hits only the new recipes :19 (the true sentence) and SKILL.md :86 (http url / headers "served as written" — a different, true fact about what flow readers see) and :101 (RAW keys); a case-insensitive grep for "no include", "has no include" and "no include key" over skills/ returns nothing. The PR's grep claim holds.
  10. SKILL.md count: base 6448 tokens (ceiling 6457, headroom 9) → head 6457 (headroom 0); the row is unchanged and the gate is green. The PR body's "Paid in the same file by cutting the row's restatement" is partial: the cut paid part of the row's growth and the remaining 9 tokens came from the file's headroom. No ratchet breach, no row movement; a precision gap in the PR body only, folded into should-fix 3.
  11. Scope and declarations: the diff touches exactly the five files the claim and the dev report list, nothing else; the PR body carries Fixes #27982, names skills(objectstack-automation): integration-recipes and its eval still say the openapi provider has no include key; since #27387 it has one, with the mcp allowlist meaning #27987 in prose (closed by triage as a duplicate at 06:56Z, before the thread started, so a Closes on it would be noise), Clause-②: no, Metadata-protocol: none; the changeset repeats both lines. check-empty-changeset and check-changeset-no-major exit 0 locally; Check Changeset and the PR-body guards are green on the head.
  12. Out of scope, found while reading the cited code: packages/spec/src/automation/flow.zod.ts:950-951 (a doc-comment example on FlowSchema) still says "connectorConfig.input is handed to the action as written: no template is read there, so it holds literals" — stale since fix(service-automation): a connector_action evaluates a CEL envelope in connectorConfig.input #27980, outside skills/** and outside this PR's surface. Should-fix 4 as a follow-up for the server / spec lane, where automation: registration does not judge a connector_action node's connectorConfig.input value slot, because the spec expression ledger cannot address a sibling block of config #27968 will touch the same ledger.

② Semver level

@objectstack/skills patch (packages/skills/package.json publishes skills/**). Prose and an eval fixture corrected to the code, plus one ratchet row; no schema, key, export or behaviour changes; Clause-②: no is right and no narrowing is declared or present. Patch is the correct level and the changeset says so.

③ Boundary flags

  • Seat report open_questions: none. out_of_scope_findings: none from the dev; one from this review (① item 12, flow.zod.ts:950-951).
  • Deviations declared, each answered: (a) no relay comment on skills(objectstack-automation): integration-recipes and its eval still say the openapi provider has no include key; since #27387 it has one, with the mcp allowlist meaning #27987 and no Closes for it — right, triage had already closed it as a duplicate; (b) the skill text names no card number for the registration gap — right, AGENTS.md keeps tracker numbers out of taught text, and the PR body names automation: registration does not judge a connector_action node's connectorConfig.input value slot, because the spec expression ledger cannot address a sibling block of config #27968; (c) attribution block order in the PR body — cosmetic, the PR-body guards are green.
  • Author: PR user.login is objectstack-fleet[bot] (the attribution comment names os-elon-musk); no non-bot login to record.
  • Contract-review-claim: comment 6517826099 names this session and this head; it is the only comment on the PR; no competing claim, no hold.
  • CI at review time (39 check runs on 1f28d891b, last polled about 08:05 UTC): every completed run is success — Build Core, Type Check (workspace, source gates, consumer gates, debt ledger), Lint (ESLint; scoped tooling self-tests, slot lookup and corpus, query-options erasure; repo and tooling gates; docs and code guards; PM dispatch-gates; CI, release and engine gates; Lint and Repo Gates), Test UI, Test Core (2/8), (3/8), Plan Test Core shards, Live E2E UI, Dogfood Regression Gate, Governed Surface Queue Guard, Check Changeset, Check PR Size, PR-body guards, Auto Label; Test Core (1/8) still in_progress; the rest skipped by path filter. No failure. The skills token ratchet and the eval-token gate live in the green Lint families, matching the local re-runs.
  • Draft PR, mergeable_state: blocked, register Tier H — human approval still owed after this record.

④ Design judgment

Rules face, per hits file:

  • skills/objectstack-automation/SKILL.md — against the card's scenario (an AI author must stop parking per-record payloads as a platform gap) and the executor on main: the row now says what connector-nodes.ts:117 does, in the skill's sibling vocabulary, and says the one thing that differs from the siblings — registration does not judge this slot yet — without claiming a refusal the ledger cannot give. It teaches nothing the executor does not do. Holds.
  • skills/objectstack-automation/references/integration-recipes.md — the Holds bullet's shape rule is resolveValueSlot restated (envelope evaluated, else literal, {…} / {{ }} literal text), and its example is the fix(service-automation): a connector_action evaluates a CEL envelope in connectorConfig.input #27980 fixture's shape in the skill's record.* scope; recipe 1's closing sentence is resolveIncludeList and the unknown-entry refusal restated, and keeps the one reason trimming still has. The three cuts leave the load-bearing facts in place (① item 6); the only precision gap is the untaught none variant, affordable only by another cut since the file sits at its ceiling. Holds, with should-fix 1 and 2.
  • skills/objectstack-automation/evals/integrations-declared.json — case 1 now grades the teaching the two files give (include as the alternative allowlist, the record read through an envelope, two platform gaps), with its assertions untouched and every must_contain token still taught by the bundle. Holds.

No file in hits is a schema or ADR, so no first-consumer or execution-plan judgment is owed.

Implemented-by: claude/project-thread-3xu1av
Reviewed-by: session_016WV4d1QkPVVzNz3FJqb2iS

VERDICT: PASS

Must-fix: none.

Should-fix:

  1. skills/objectstack-automation/references/integration-recipes.md Holds auth bullet (:25-28) names bearer, api-key, basic and not none, while the declarative union ConnectorInstanceAuthSchema (packages/spec/src/shared/connector-auth.zod.ts:118-158) has four variants; the ratchet row comment's "the Holds auth bullet lists them" therefore over-states by one. Either add none (a public upstream) to the Holds bullet, paid by a further same-file cut since the file is at its ceiling, or re-word the row comment to say the count was dropped and only "no oauth2" is kept. No taught sentence is false either way.
  2. scripts/check-skills-token-ratchet.mjs row :871-889: the comment's start point "8814" is inherited from the previous row; the tree on main holds 8816 bytes (both round to 2204), so the measured delta is +126 bytes, not "+128 net". The end point 8942 and the ceiling 2236 are exact. Comment arithmetic only; can ride any later row edit.
  3. PR body precision (no file change): (a) "the new expected_output holds every must_contain token and no must_not_contain token" is not literally true — type: 'api' is absent and connector-esign present, as on main; no gate reads that containment, so say "assertions unchanged; check-skill-eval-tokens exit 0" instead; (b) SKILL.md "paid in the same file by cutting" is partial — 6448 → 6457, nine tokens came from headroom, the row did not move.
  4. Follow-up card for the server / spec lane, not this PR: packages/spec/src/automation/flow.zod.ts:950-951 doc-comment example still teaches "connectorConfig.input is handed to the action as written: no template is read there"; stale since fix(service-automation): a connector_action evaluates a CEL envelope in connectorConfig.input #27980 (a0cc51f4a). Natural home: the automation: registration does not judge a connector_action node's connectorConfig.input value slot, because the spec expression ledger cannot address a sibling block of config #27968 PR, which touches the same ledger.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS

维护者速读

席位意见:ACCEPT。契约复核 PASS,没有 must-fix;每一句都对照了 main 上的代码。should-fix 不阻塞,留到下次改这些文件时处理:① integration-recipes.md 的 Holds auth 一条少列了 none(共四种),棘轮行注释说「已列出」多说了一种;② 棘轮行注释起点写 8814,实际 8816,只是注释算术;③ PR 正文两处措辞不够精确,见记录。CI 无失败。

席位核对

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s tooling

Projects

None yet

2 participants