Uh oh!
There was an error while loading. Please reload this page.
docs(qa): record the #7545 ruling — an unknown flow node type is late-bound, not refused - #7664
Merged
Merged
Conversation
…node type is late-bound, not refused
The item's negative clause demanded that POST /api/v1/automation REFUSE a flow
carrying an unregistered node type. The platform never promised that: ADR-0018
§M1 has registerFlow() soft-validate node types against the live action registry
("warn, don't hard-fail") so a flow authored against a currently-absent plugin
still registers, and #4771 is the ordering incident that seam protects. QA run
#7516 therefore recorded a FAIL against a promise that does not exist.
The maintainer ruling on #7545 (2026-08-11) upheld the status quo: this is
deliberate late binding with a declaration, not tolerance masking an error.
Recorded, checklist-side only — zero engine code:
- new acceptance clause asserting the real four-part contract (200 + located
WARN carrying 'no registered executor or descriptor' with unknownTypes and the
full knownTypes vocabulary in the record's meta slot + trigger success:false
with the NO_EXECUTOR message + run recorded 'failed'), stating pass-by-design
explicitly and citing #7545 / ADR-0018 §M1 / #4771
- a driving step for the unknown-type probe
- the negative rewritten to name SILENCE as the failure shape, with the 200
explicitly disclaimed as a finding
- source anchors for the ADR section, the engine seam and the ruling
- revision 2 -> 3 with the matching history entry
Fixes#7545
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015fkdTyGmMD5s8ZtEifvuGyThe latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
os-help
marked this pull request as ready for review
August 11, 2026 10:24
Uh oh!
There was an error while loading. Please reload this page.
This was referenced Aug 11, 2026
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 freeto 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#7545
Records the maintainer's ruling in the
flow-node-type-matrixchecklist item. Zero engine code — one checklist item edited, per the ruling's stated remaining scope.The premise, verified before editing
The item's
negativeclause demanded a registration-time refusal:The platform never promised that.
registerFlow()inpackages/services/service-automation/src/engine.tssays so in its own comment — the ADR-0018 §M1 check "stays soft-fail — a flow authored against a currently-absent plugin must still register, and executeNode() throws NO_EXECUTOR at run time" — and ADR-0018 §M1 states it as shipped scope: "registerFlow()soft-validates node types against the live registry (warn, don't hard-fail)". So QA run #7516 recorded a FAIL against a promise that does not exist.The ruling (issue #7545, maintainer, 2026-08-11 — quoted verbatim)
After — the new acceptance clause
The refusal expectation is replaced by a positive four-part clause asserting what the platform actually does. Full text as landed:
oracle: api. Itsverifystates the disclaimer in the operative place a runner reads: "The 200 at registration is the EXPECTED answer and is never on its own a finding — the finding is any of the other three parts missing".After — the rewritten negative
The
negativeno longer demands refusal; it names silence as the failure shape, so the #1887 anti-goal the old clause was reaching for is still guarded — just at the seam where it is real:Also in this item
bogus_nodeflow, capture status + log record, trigger, read the run detail). The clause is otherwise unrunnable — the old expectation needed no step because "it must be refused" was checkable from the POST alone.engine.tsseams (theregisterFlow§M1 comment + post-seal warn branch,warnUnknownNodeTypes, theNO_EXECUTORstep error), and the [Decision] One seam, two strictness levels:POST /api/v1/automationhard-refuses an undeclared node config key but accepts an unknown nodetype#7545 ruling itself.revision2 → 3 with the matchinghistoryentry (the validator enforcesrevision== last history entry's revision).Accuracy notes against the source, beyond the ruling text
Two details were tightened against
engine.tsrather than copied from the issue body, both stated in the clause:unknownTypes/knownTypesride the log record's structured meta slot, not the message text —warnUnknownNodeTypessays so explicitly (finding(service-automation): engine.ts's five name-shaped splices — author-metadata / caller-supplied identifiers interpolated into log messages with no newline constraint #6654), and a runner grepping the message for the vocabulary would find nothing and wrongly fail the item.nodeTypeVocabularySealed(the bug(service-automation): flow 节点类型校验跑在插件贡献的执行器注册之前 —— 每个 ADR-0019 approval flow 都被误报「will fail at execution time」 #4771 fix) and the flow being enabled. A probe against a disabled flow legitimately emits no WARN.Verification
docs/qais not a published package and this PR releases nothing ⇒ no changeset;skip-changesetlabel applied.node scripts/check-platform-checklist.mjs(thepnpm check:platform-checklistgate) reports exactly one problem, and it is pre-existing onmain, unrelated to this item — already filed as #7347:Confirmed pre-existing by running the gate on a pristine
origin/mainworktree with this PR's changes absent — identical single problem, byte for byte. This PR neither adds nor clears it: the item's own structural checks (revision/history agreement, acceptance clauses each naming an oracle, theenumSourcevariants ratchet) all pass.coverage.jsonindexes this item by id only (automation.flow-node-type-matrix, no expectation text), so nothing there needed a matching edit — grepped before editing.No reverse-verification theater: this is a prose clause, and accuracy against the ruling text plus the engine source is the review bar.
Generated by Claude Code