docs: name FLOW_INPUT_SCHEMA_INVALID in the four flow refusal-code enumerations - #13824
Merged
os-project-manager merged 1 commit intoAug 31, 2026
Merged
Conversation
…umerations Four pages enumerate the flow trigger-refusal status contract and each still listed exactly the three pre-widening codes, stating the enumeration as complete while `FLOW_INPUT_SCHEMA_INVALID` (422, never-dispatched) was missing. Placement was read off `packages/runtime/src/flow-dispatch-status.ts`: `classifyFlowRefusal` tests the code in the never-dispatched arm block, above the `status === 'failed'` arm that answers 400 FLOW_FAILED. `ui/actions.mdx` is the one page that groups its enumeration by that distinction, so the code joins its "a dispatch that never happened" group there. Every entry spells the status together with its code, so the two codes now sharing 422 each stay a self-contained pair. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Pk26oZ12t5N1hwGW1m1MgC
os-project-manager
marked this pull request as ready for review
August 31, 2026 14:32
Contributor
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 33403513351 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
This was referenced Aug 31, 2026
This was referenced Aug 31, 2026
os-project-manager
deleted the
claude/issue-13720-flow-refusal-code-enumeration
branch
August 31, 2026 15:06
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #13720
FlowRefusalCodegained a fourth member inpackages/runtime/src/flow-dispatch-status.ts(b6d3d76b5), answered422and classified never-dispatched. Three pages were updated with it; four others enumerate the same union and were not — so each told a reader the enumeration was complete while a status they will really receive was absent.The four edits
content/docs/api/declarative-endpoints.mdxtype: 'flow'delegation rowcontent/docs/api/plugin-endpoints.mdxPOST /automation/:name/triggercontent/docs/protocol/kernel/http-protocol.mdxtype: 'flow'answer rowcontent/docs/ui/actions.mdxtype: 'flow'over-REST rowFour lines, one code name added to each. No prose was rewritten, no schema moved, no runtime behaviour changed.
Placement was read off the runtime source, not inferred from the status
The four rows are not interchangeable, and one of them groups its enumeration by exactly the distinction this code turns on, so a copy-paste insertion would have been wrong there.
classifyFlowRefusalinpackages/runtime/src/flow-dispatch-status.tstests the new code inside the never-dispatched arm block:The module header states the same thing in prose: the guard's verdict is "a pure function of the flow definition", the engine "refuses ONCE, never enters its retry loop", and the row is stamped with no
status— the never-dispatched class.So, per page:
declarative-endpoints.mdx,plugin-endpoints.mdx,http-protocol.mdxare flat status lists in engine order. The code is inserted after422FLOW_NO_START_NODEand before400FLOW_FAILED, which is the orderclassifyFlowRefusalevaluates.ui/actions.mdxis the page that splits its enumeration into "a run that ran and was rejected" (400FLOW_FAILED) versus "a dispatch that never happened" (404/409/422). The code joins the second group. Placing it besideFLOW_FAILEDwould have told a reader the run started, which the source says it did not.Two codes now share
422FLOW_NO_START_NODEandFLOW_INPUT_SCHEMA_INVALIDboth answer422. Every entry on all four pages spells the status together with its code, so each stays a self-contained pair rather than a claim about what422alone means — an enumeration, not a contradiction. The discriminator iserror.code, which is whathttp-protocol.mdxalready tells readers to branch on in the same sentence ("Branch on the status anderror.code, never on an inner success flag"). Per-code guidance and the retry semantics stay in the one full table,content/docs/automation/flows.mdx, which three of the four pages already link.Deliberately not touched
content/docs/releases/v17.mdx— it carries the same short enumeration and is out of scope for two independent reasons: release notes are never edited in a code PR (AGENTS.md Documentation Guardrails; the file is the repo's hottest conflict magnet), and that page is a historical record of what v17 shipped rather than a live contract page.content/docs/permissions/system-context.mdx— the card body names it as having been correctly updated, but that page names none of the flow refusal codes and makes no completeness claim, so it is not a fifth omission and nothing was added to it. Verified by grep on this branch: zero hits for any union member.content/docs/references/api/contract.mdxandreferences/api/error-code-ledger.mdx— both already carry the code and both are head-bannered AUTO-GENERATED. There is no generator half to this change.Verification
Final commit
1974fb160. All gate results below were run on that exact tree (working tree clean, no commits after).Gate families derived mechanically from the real change set rather than from a recalled list:
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack-> 36 families (22 pnpm, 14 direct node), harvested runnably with--commands.35 of 36 green, 1 not measurable locally. Exit codes were captured before any pipe.
Named in the dispatch, with each gate's own verdict line:
Also green:
check:corpus-claim-drift,check:docs-single-h1,check:docs-audit-scope,check:docs-redirects,check:published-readme-links,check:doc-formula-expressions,check:doc-security-posture,check:skill-examples,check:liveness,check:empty-state,check:variant-docs,check:strictness-ledger,check:yaml-examples,check:role-word,check:react-page-adapter-contract,check:cross-package-test-inputs,check:objectui-changeset,check:pm-half-states,check:changeset-gate-self-tests, plus the 13 direct-node gates includingcheck-empty-changeset,check-adr-0087-registration,check-changeset-no-major,check-doc-frontmatter,check-doc-route-spelling,check-docs-section-name,check-section-landing-index.node scripts/check-test-completeness.mjsis recorded NOT MEASURED, not red: it exits 3 withPREREQUISITE NOT METbecause it grades a savedturbo run testlog that only CI produces, and its own output says so.Three gates first reported
PREREQUISITE NOT METon unbuilt packages (@objectstack/formula,@objectstack/lint,@objectstack/client-react); all three ran green afterturbo run buildfor those packages.@objectstack/specand its dependency closure were built before any gate ran, sincecheck:docsreads built output rather than source.Repo-wide ESLint (
pnpm lint) was narrowed, and the narrowing is proved rather than assumed. ESLint's own configuration declares no.mdxor.mdpopulation — everyfilesglob ineslint.config.mjsis a TypeScript/JavaScript extension set. Asked directly about the five changed paths, ESLint answers for each:File ignored because no matching configuration was supplied. Counted from--format json: 5 results, 0 files actually linted, 0 errors. Since no path in this diff is in ESLint's input set, the repo-wide verdict is identical toorigin/main's for every file, touched and untouched alike.No test changes: this diff contains no executable code.
Zone 2 assumptions
ui/actions.mdxreally does split its enumeration into two groups. A single copy-paste sentence would have been wrong there.FLOW_INPUT_SCHEMA_INVALIDsits in the never-dispatched arm block, above thestatus === 'failed'arm. The PM's reading was right; nothing was falsified.422" above.origin/main(4bc18e542, moved from the0a8ebf33dthe pre-flight used). The union-member census still returns 7 non-generated pages, 5 of which omit the code; four are this card's and the fifth is the release page. All four line numbers still hold.Generated by Claude Code