Seam: packages/metadata-protocol (the /meta save path) → packages/lint (the runtime surface of flow-api-trigger-secret-missing)
Filing gate: ① a measured defect at a seam. Filed by the domain:spec execution seat 2 (session_014EJ1ED8X4MMrT18BhVx4tx, seat post #18549) from the #20553 dev's fork report on PR #20593. ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim.
What happens (measured on PR #20593's head 825c33ff9f, a merge of main at c96beb2707)
protocol.ts saveMetaItem runs in this order:
- The schema check.
:16352 assertRuntimeAuthoringRules({ body: request.item, … }), on the body exactly as submitted.
- The plugin pre-persistence gate and the parent-version read.
:16588 request.item = await this.carryForwardRedactedCredentials(…), placed on purpose "AFTER every gate, immediately before the put".
repo.put.
Since #20552 (c96beb2707), definition reads withhold a flow's nodes.<i>.config.secret. So the body a client saves back after a read has no secret until step 4 restores it.
PR #20593 (#20553) adds flow-api-trigger-secret-missing to os validate and, through CLI_AND_RUNTIME, to the runtime publish gate. At step 2 that rule cannot tell a withheld secret from a missing one: no redaction context reaches AuthoringRuleContext. It therefore refuses the ordinary read→edit→save round trip of a signed api flow.
What this card carries
The seat has ruled that PR #20593 ships the rule CLI-only: os validate / os build / os lint, with a declared surfaceReason naming this card. The runtime publish gate keeps today's behaviour. It passes a secretless api flow, which the engine then refuses at registration: 400 on the /automation doors, and a skip with a warning at boot.
This card restores the runtime refusal the right way. It has two halves, one PR or a vertical dispatch, as triage routes it:
Four axes (the seat's reading, for triage)
Dedupe: a REST listing of the 1,000 most recently updated issues and PRs, grepped for carryForwardRedactedCredentials, runtime authoring gate … redact and flow-api-trigger-secret-missing. The hits are PR #20593 and the queue-flake anchor #20608, whose root cause is this seam. No carrier exists.
Dedupe words: runtime authoring gate redacted body carry-forward · metadata save gate order secret withheld · flow-api-trigger-secret-missing runtime surface
Generated by Claude Code
Seam:
packages/metadata-protocol(the/metasave path) →packages/lint(the runtime surface offlow-api-trigger-secret-missing)Filing gate: ① a measured defect at a seam. Filed by the
domain:specexecution seat 2 (session_014EJ1ED8X4MMrT18BhVx4tx, seat post #18549) from the #20553 dev's fork report on PR #20593. ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim.What happens (measured on PR #20593's head
825c33ff9f, a merge ofmainatc96beb2707)protocol.tssaveMetaItemruns in this order::16352assertRuntimeAuthoringRules({ body: request.item, … }), on the body exactly as submitted.:16588request.item = await this.carryForwardRedactedCredentials(…), placed on purpose "AFTER every gate, immediately before the put".repo.put.Since #20552 (
c96beb2707), definition reads withhold a flow'snodes.<i>.config.secret. So the body a client saves back after a read has no secret until step 4 restores it.PR #20593 (#20553) adds
flow-api-trigger-secret-missingtoos validateand, throughCLI_AND_RUNTIME, to the runtime publish gate. At step 2 that rule cannot tell a withheld secret from a missing one: no redaction context reachesAuthoringRuleContext. It therefore refuses the ordinary read→edit→save round trip of a signedapiflow.config.secreton the start node) is served in cleartext by the flow-definition read; after #20529 every armed hook carries one #20552 pins fail on PR feat(lint): os validate refuses an api flow with no per-flow secret #20593's merge group.protocol.metadata-redaction.test.ts, "GET → edit → PUT keeps the stored secret".flow/inbound_hook failed author-time validation … [flow-api-trigger-secret-missing]: queue run36532203829, reproduced by the dev at825c33ff9f.What this card carries
The seat has ruled that PR #20593 ships the rule CLI-only:
os validate/os build/os lint, with a declaredsurfaceReasonnaming this card. The runtime publish gate keeps today's behaviour. It passes a secretlessapiflow, which the engine then refuses at registration: 400 on the/automationdoors, and a skip with a warning at boot.This card restores the runtime refusal the right way. It has two halves, one PR or a vertical dispatch, as triage routes it:
packages/metadata-protocol: the runtime authoring gate judges the body that will be stored, meaning the carried-forward body, or it is handed the redaction context. The schema check stays on the author's body, so feat(spec)!: refuse inline credentials at publish — driver config + connector authoring door (#7990, spec half) #8078's inline-credential refusal is unchanged.apiflow with no secret:skills/objectstack-automationcalls it optional, andos validatepasses it #20553 dev, from the rule table rather than a run: the only runtime rule that also coversdatasourceislintLivenessProperties, which emits warnings only.config.secreton the start node) is served in cleartext by the flow-definition read; after #20529 every armed hook carries one #20552 recorded "The gates judge what the AUTHOR wrote" as a deliberate choice, so the engine lane judges this half.packages/lint: once the gate judges the stored body, returnflow-api-trigger-secret-missingtoCLI_AND_RUNTIMEand remove itssurfaceReason.config.secreton the start node) is served in cleartext by the flow-definition read; after #20529 every armed hook carries one #20552 round-trip tests stay green. Add one pin: a first active save of a secretlessapiflow answers 422 with this rule id, and nothing is stored.Four axes (the seat's reading, for triage)
/meta保存签名apiflow 是日常路径(两条 [security] a flow's inbound-hook secret (config.secreton the start node) is served in cleartext by the flow-definition read; after #20529 every armed hook carries one #20552 钉子即此路径);无 secret 的首次发布在/meta门就应响亮拒收,而不是「保存成功、注册时只打一行告警」。/meta门上的发布时响亮拒收(AI 作者的主入口)。Dedupe: a REST listing of the 1,000 most recently updated issues and PRs, grepped for
carryForwardRedactedCredentials,runtime authoring gate … redactandflow-api-trigger-secret-missing. The hits are PR #20593 and the queue-flake anchor #20608, whose root cause is this seam. No carrier exists.Dedupe words:
runtime authoring gate redacted body carry-forward·metadata save gate order secret withheld·flow-api-trigger-secret-missing runtime surfaceGenerated by Claude Code