Skip to content

Parameters and secrets

A workflow that runs many times usually varies a value each run: a different note, a different reference number. Some of those values are secrets that must never touch disk. OpenAdapt handles both, and treats them differently on purpose.

Parameters

Mark a typed field as a parameter at record time. Its demonstrated value becomes the default, overridable at replay:

openadapt flow record --url https://your.app --out rec --param note
openadapt flow compile rec --out bundle --name my-task
openadapt flow replay  bundle --url https://your.app --param note="Follow-up in 2 weeks"

Repeat --param for multiple values.

Parameterizing typed text works end to end

Parameterizing the typed text of a step is fully supported and verified: a distinct value each run, read back and confirmed by OCR of the resulting screen. Making a value a parameter also strips it from every compiled assertion, by design, because it varies per run.

Parameterizing which record is stricter

Parameterizing a value that changes what appears on screen (which patient to open) is different. Anchors recorded on one entity cannot match another, so resolution degrades to geometry, and that click is identity gated: the run's value is substituted into the recorded band and the whole substituted band must match the resolved row. A wrong row halts, and a row that merely mentions the value halts too.

The disclosed cost

When the entity's own row text varies with the entity (a search result that carries the surname the recorded band baked in), the substituted band can fail to match even the correct row, and the run halts. Clicking by position is what caused wrong-record writes, so OpenAdapt takes the halt. Re-anchoring verifies cleanly only when the band's non-parameter text is stable across entities.

Secrets

A secret is a parameter whose value is never persisted. A password input, or any field you mark --secret, is treated as secret: its value is never written to the recording, the events log, the compiled bundle, or the saved frames (its on-screen region is redacted). At replay it is injected from the environment, and a missing one fails fast.

openadapt flow record --url https://your.app --out rec --secret password
export OPENADAPT_FLOW_SECRET_PASSWORD='...'          # supplied at replay time
openadapt flow replay  bundle --url https://your.app

The environment variable name is OPENADAPT_FLOW_SECRET_<FIELD> with the field name upper-cased. input[type=password] is always treated as secret, whether or not you pass --secret.

Parameter versus secret at a glance

Parameter Secret
Demonstrated value stored Yes, as the default No, never
Overridable at replay --param key=value Injected from env
Stripped from assertions Yes Yes
Region redacted in frames No Yes
Missing at replay Uses the default Fails fast

Leakage is linted at compile time

Recorded parameter values do not leak into geometry landmarks, and a compile-time check fails the build if a demonstrated parameter value appears in any text postcondition or landmark OCR text. The check reads text evidence only, so a later region-stable template can still embed a value's rendered pixels; that failure is in the safe direction (the region will not match under a different run value and the run halts safely), but it is not linted. See the configuration reference for the full list of secret and parameter environment variables.