Repository navigation
Python: fix(declarative): treat omitted workflow inputs as blank in PowerFx - #9730
Draft
Naveen Chatlapalli (1aifanatic) wants to merge 5 commits into
Draft
Naveen Chatlapalli (1aifanatic) wants to merge 5 commits into
Naveen Chatlapalli (1aifanatic) wants to merge 5 commits into
Conversation
…owerFx
When a caller omits an input that a formula references, PowerFx fails to
compile inputs.<name> / Workflow.Inputs.<name> ("Name isn't valid") and
eval() returns None for the whole expression. That breaks the documented
default pattern =If(IsBlank(inputs.name), "World", inputs.name): the
simple_workflow sample printed "Hello, !" for workflow.run({}).
Bind referenced-but-missing inputs to blank for that evaluation only, the
same result as passing the input as None, without writing them to state.
Also print the simple_workflow sample's second run, which was discarded.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Naveen Chatlapalli (1aifanatic)
temporarily deployed
to
github-app-auth
October 26, 2026 18:36 — with
GitHub Actions
Inactive
Naveen Chatlapalli (1aifanatic)
temporarily deployed
to
github-app-auth
October 26, 2026 18:36 — with
GitHub Actions
Inactive
Contributor
There was a problem hiding this comment.
🟡 Changes recommended
Reference discovery matches literal and comment text while missing valid quoted and whitespace-separated references.
2 open issues
What changed in this PR
This PR addresses #9729 by binding omitted workflow inputs as blank during PowerFx evaluation, allowing default expressions to run without modifying workflow state.
Changes:
- Adds evaluation-only blank bindings for references through both input aliases.
- Tests omitted-input defaults and verifies state remains unchanged.
- Prints the custom-name run’s outputs in the simple workflow sample.
| File | Description |
|---|---|
python/samples/03-workflows/declarative/simple_workflow/main.py |
Prints outputs from the “Alice” run. |
python/packages/declarative/tests/test_powerfx_yaml_compatibility.py |
Adds missing-input regression tests for both aliases. |
python/packages/declarative/agent_framework_declarative/_workflows/_declarative_base.py |
Discovers missing input references and binds evaluation-only blanks. |
Review effort: Balanced
Skip comments and string literals when looking for inputs.<name> and Workflow.Inputs.<name>, and accept single-quoted field names and whitespace or comments around the dots. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Naveen Chatlapalli (1aifanatic)
temporarily deployed
to
github-app-auth
October 27, 2026 12:25 — with
GitHub Actions
Inactive
Formulas that already compile keep their base result, so member names and local bindings called inputs are unaffected. A custom inputs namespace is no longer replaced by the workflow inputs record. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Naveen Chatlapalli (1aifanatic)
temporarily deployed
to
github-app-auth
November 4, 2026 04:59 — with
GitHub Actions
Inactive
A formula such as If(IsBlank(inputs.user.name), "World", inputs.user.name) with omitted inputs bound `user` to blank, so the retry failed with "Deprecated use of '.'" and raised instead of returning None as before. Input references are now read as whole paths, and a missing parent is bound as a record whose missing fields are blank. A parent that the formula also uses as a value is left unbound, since a record would not be blank. If the retry still fails for any reason, eval keeps the undefined-reference fallback and returns None. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Naveen Chatlapalli (1aifanatic)
deployed
to
github-app-auth
November 6, 2026 16:53 — with
GitHub Actions
Active
Use compiler name-error spans to keep valid locally shadowed inputs and Workflow references from adding global blank fields during retry. Convert UTF-16 diagnostic offsets and retain the undefined-reference fallback for unsupported diagnostic formats.
Naveen Chatlapalli (1aifanatic)
deployed
to
github-app-auth
November 6, 2026 21:57 — with
GitHub Actions
Active
Naveen Chatlapalli (1aifanatic)
deployed
to
github-app-auth
November 6, 2026 21:57 — with
GitHub Actions
Active
This branch was successfully deployed
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.

Motivation & Context
=If(IsBlank(inputs.name), "World", inputs.name)never applies its default when the caller omitsname, so thesimple_workflowsample printsHello, !forworkflow.run({}). PowerFx fails to compileinputs.namewhen the inputs record has no such field, andDeclarativeWorkflowState.eval()returnsNonefor the whole expression. Details and an input matrix are in #9729.Description & Review Guide
inputsandWorkflow.Inputs, quoted identifiers, comments between tokens, and nested paths. Valid locally scoped references do not add fields to the global input record. Custominputsnamespaces remain independent fromWorkflow.Inputs.Nonefallback."Alice".IsBlankdefaults. Formulas that already evaluate successfully retain their existing behavior.Regression coverage includes both aliases, quoted/comment-separated references, literals, custom namespaces, nested paths, and local bindings through
With,As, andForAll. Diagnostic offsets are converted from UTF-16 so preceding non-BMP characters do not shift reference matching. The latest local-scope regressions fail before the fix. All 1,699 declarative tests pass with the .NET runtime; Ruff lint/format and source Pyright checks pass.Related Issue
Fixes #9729
AI Assistance
AI assistance details: Claude Code helped find the bug by running the declarative samples locally, trace it to
DeclarativeWorkflowState.eval(), implement the initial fix and tests, and draft the linked issue. Codex helped address review feedback, reproduce and fix local-scope handling during retries, add regression coverage, run validation, and update this description.Contribution Checklist
breaking changelabel (or add "[BREAKING]" to the title prefix, before or after any language prefix) — a workflow keeps the label and title prefix in sync automatically.🤖 Generated with Claude Code