Relationships
#3730 typed-secrets 4.1: workflow passes bind sentinels as Secrets: typed guards and asserts, forEach items and identities, child bindings, webhook inputs, and the synchronous authorization step
Opened by zack · 10/21/2026
Problem
Phase 3 completed the local behavior path behind the internal option (swamp-club#3628). The workflow passes still run untyped: the guard and assert evaluators bind sentinels as text, a forEach item is text, a secret in a step identity is found by value search, child workflow bindings carry values the parent loaded, and webhook trigger inputs are evaluated with no boundary. The model.method rules of Section 4.5 are built but unreachable until a consuming evaluator is typed.
Scope (design/enablers/typed-secrets.md Sections 5 and 3.4, Phase 4)
- Guard and assert evaluators typed: a predicate whose result holds a secret is refused with secret_destination_refused, and an assert message masks a secret.
- forEach collections may hold secrets: each item binds as a Secret, and a secret in a step identity becomes sensitive-, taken from the sentinel rather than found by value search.
- Child workflows keep deferred parent bindings: a value that crosses into another run carries its references, and that run issues its own sentinels.
- The synchronous passes (forEach expansion, step names) get an authorization step of their own for sensitive-field references, for example in prepare, before they are enabled on the typed path (Section 3.4).
- Webhook trigger inputs (trigger_input_resolver.ts) bind no vault and refuse a Secret result, so no sentinel is persisted as orphan run-input text.
- The typed consumer path of model.method becomes reachable: the stored record adaptation in model_method_result.ts applies once a guard or assert evaluator is typed. Match the media type by prefix rather than exactly application/json (review note on swamp-club#3628).
Exit
Behind the internal option: every workflow-pass entry in the inventory stays clean, a guard that reads a secret refuses before any load, a step a guard skips makes no vault read, and forEach identities carry no value. Existing suites pass unchanged with the option off.
Depends on nothing beyond Phase 3.5 (swamp-club#3628).
In Progress
Click a lifecycle step above to view its details.
Sign in to post a ripple.