Skip to content

feat(validate): catch template reference errors before runtime#125

Merged
jrob5756 merged 4 commits intomicrosoft:mainfrom
PolyphonyRequiem:feat/enhanced-validate
May 4, 2026
Merged

feat(validate): catch template reference errors before runtime#125
jrob5756 merged 4 commits intomicrosoft:mainfrom
PolyphonyRequiem:feat/enhanced-validate

Conversation

@PolyphonyRequiem
Copy link
Copy Markdown
Member

@PolyphonyRequiem PolyphonyRequiem commented Apr 25, 2026

Summary

Enhanced conductor validate to catch Jinja2 template reference errors before runtime. Previously, conductor validate only checked YAML schema (Pydantic) — stale agent references, missing workflow inputs, and undeclared dependencies only surfaced at runtime after minutes of execution and real API costs.

What it catches

Errors (validation fails)

  • Stale agent references: {{ old_agent_name.output.field }} where old_agent_name doesn't exist
  • Missing workflow input references: {{ workflow.input.missing_field }} where missing_field isn't declared in input:
  • Stale references in prompt, system_prompt, command, args, working_dir, input_mapping, parallel-group inputs, and workflow output: templates — all template-bearing fields are scanned

Warnings (validation passes with notes)

  • Undeclared dependencies in explicit mode: Agent prompt references {{ a.output.val }} but doesn't declare a.output in its input: list

Example

agents:
  - name: writer
    prompt: |
      Based on {{ old_agent_name.output.findings }}
      Write about {{ workflow.input.nonexistent_field }}
$ conductor validate stale.yaml
╭─ Validation Failed ─╮
│ - agent 'writer' prompt references unknown agent 'old_agent_name'. Available: researcher, writer
│ - agent 'writer' prompt references unknown workflow input 'nonexistent_field'. Declared inputs: topic
╰──────────────────────╯

Changes

  • src/conductor/config/validator.py:
    • Added _extract_template_refs() — parses each template via jinja2.Environment().parse() and walks nodes.Getattr chains rooted at the truly-free names returned by meta.find_undeclared_variables. Loop variables, {% set %} bindings, and macro params are excluded automatically because they don't appear in find_undeclared_variables. String literals are nodes.Const and never enter the walk.
    • Installed _TolerantNameMap(dict) on _JINJA_ENV.filters / .tests so workflow-specific filters (registered on a different env at render time, e.g. | json) don't cause meta.find_undeclared_variables to raise TemplateAssertionError during validation.
    • Added _collect_template_strings() to gather all Jinja2 template strings from an agent. Includes input_mapping for sub-workflow agents (added by feat(composition): dynamic sub-workflow inputs via input_mapping (#101) #109 closing feat(composition): dynamic sub-workflow inputs via input_mapping #101) — uses getattr so it stays a no-op on branches that haven't merged that schema field yet.
    • Added _validate_template_references() with agent name, workflow input, and explicit-mode checks.
    • Extended INPUT_REF_PATTERN to accept {group}.errors, {group}.errors.{member}, and bare {group}.outputs (with optional ? suffix on each).
    • Updated validate_workflow_config() signature to accept optional workflow_path.
  • src/conductor/cli/validate.py:
    • Wired semantic validation (validate_workflow_config) into the CLI validate command — it previously only ran Pydantic schema validation.
    • Displays warnings for non-fatal issues.

Testing

  • 351 tests pass (tests/test_config + tests/test_cli/test_validate.py), no regressions.
  • New test classes in tests/test_config/test_validator.py:
    • TestExtractTemplateRefs — unit tests on the new extractor (loop vars, string literals, {% set %}, macros, builtins, malformed templates, unknown filters/tests).
    • TestInputRefPatternExtensions — parametrized regex shape tests for the new .errors / bare .outputs forms, plus negative cases.
    • TestTemplateReferenceValidation — end-to-end stale-ref detection in prompt, system_prompt, and parallel-group inputs, plus regression tests for the false-positive classes flagged in review (Jinja2 loop variables, string literals).
    • TestExplicitModeWarnings — warnings vs. no-warning paths.
    • TestOutputTemplateValidation — workflow output: template stale-ref detection.
    • TestExamplesRegression — loops over examples/*.yaml to prove no example regresses.
    • TestInputMappingTemplateCollection — covers input_mapping collection + stale-ref detection via a duck-typed agent (so the test runs regardless of whether this branch has merged the input_mapping schema field from feat(composition): dynamic sub-workflow inputs via input_mapping (#101) #109).
  • New TestSemanticValidationIntegration class in tests/test_cli/test_validate.py — 5 CLI-level tests covering exit codes, warning rendering, and the false-positive case being non-blocking.
  • All examples/*.yaml validate cleanly.

@PolyphonyRequiem PolyphonyRequiem force-pushed the feat/enhanced-validate branch 3 times, most recently from 4744356 to c2b107f Compare April 25, 2026 03:26
@codecov-commenter
Copy link
Copy Markdown

codecov-commenter commented Apr 25, 2026

Codecov Report

❌ Patch coverage is 94.02985% with 8 lines in your changes missing coverage. Please review.
⚠️ Please upload report for BASE (main@dbcf20f). Learn more about missing BASE report.

Files with missing lines Patch % Lines
src/conductor/config/validator.py 93.54% 8 Missing ⚠️
Additional details and impacted files
@@           Coverage Diff           @@
##             main     #125   +/-   ##
=======================================
  Coverage        ?   85.16%           
=======================================
  Files           ?       53           
  Lines           ?     7579           
  Branches        ?        0           
=======================================
  Hits            ?     6455           
  Misses          ?     1124           
  Partials        ?        0           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Enhanced `conductor validate` to scan Jinja2 templates in agent prompts,
script args, input_mapping, and workflow output for reference errors:

Level 1 — Template reference resolution:
- {{ X.output.Y }} where X is not a valid agent name → error
- {{ workflow.input.X }} where X is not a declared input → error
- In explicit mode, LLM agents referencing agent outputs not in their
  input: list → warning

Also wires semantic validation (validate_workflow_config) into the CLI
`conductor validate` command, which previously only ran Pydantic schema
validation.

Catches errors like: stale agent name references after renames, missing
workflow input declarations, and undeclared dependencies in explicit mode
— all before runtime, at zero cost.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copy link
Copy Markdown
Collaborator

@jrob5756 jrob5756 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some testing and cleanup

Comment thread src/conductor/config/validator.py Outdated
# {{ agent_name.output }}
# {% if agent_name.output.field %}
# Excludes built-in namespaces: workflow, context, item, _index, _key
_TEMPLATE_REF_PATTERN = re.compile(r"(?:\{\{|\{%)[^}%]*?\b(\w+)\.(?:output|outputs)\b")
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Critical: false positives on valid workflows.

This regex has no awareness of Jinja2 syntax beyond the {{/{% delimiters. Two problem cases I verified:

  1. Jinja2 {% for %} loop variables{% for r in researcher.outputs %}{{ r.output.text }}{% endfor %} matches r.output and reports r as 'unknown agent'. This is a normal Jinja2 idiom and these workflows used to validate fine.
  2. String literals inside templates{{ x | replace("foo.output", "") }} reports foo as 'unknown agent'.

Repro:

import re
p = re.compile(r'(?:\{\{|\{%)[^}%]*?\b(\w+)\.(?:output|outputs)\b')
[m.group(1) for m in p.finditer('{% for x in y %}{{ x.output }}{% endfor %}')]
# => ['x']
[m.group(1) for m in p.finditer('{{ x | replace("foo.output", "") }}')]
# => ['foo']

Because these become errors (not warnings), conductor validate will hard-fail on previously-valid workflows. Either:

  • Replace with a real Jinja2 AST walk (jinja2.Environment().parse() + jinja2.meta.find_undeclared_variables), which gives string- and scope-aware variable tracking, or
  • Downgrade these to warnings until the AST approach lands.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Confirmed both repros locally — good catches.

Replaced the regex with jinja2.Environment().parse(...) + meta.find_undeclared_variables, then walked nodes.Getattr chains rooted at the truly-free names. Both classes of false positive are now structurally impossible:

  • The loop variable r is bound by {% for r in ... %} and so doesn't appear in find_undeclared_variables — it's filtered out before we ever look at the chain.
  • String literals are nodes.Const, not nodes.Getattr, so they never enter the walk.

Added regression tests for both in TestExtractTemplateRefs.test_for_loop_variable_is_not_a_ref and test_string_literal_is_not_a_ref, plus end-to-end versions in TestTemplateReferenceValidation.

Fix: 278b389

r"^(?:"
r"(?P<agent>[a-zA-Z_][a-zA-Z0-9_]*)\.output(?:\.(?P<field>[a-zA-Z_][a-zA-Z0-9_]*))?|"
r"(?P<parallel>[a-zA-Z_][a-zA-Z0-9_]*)\.outputs\.(?P<pg_agent>[a-zA-Z_][a-zA-Z0-9_]*)(?:\.(?P<pg_field>[a-zA-Z_][a-zA-Z0-9_]*))?|"
r"(?P<parallel>[a-zA-Z_][a-zA-Z0-9_]*)\.(?:outputs|errors)(?:\.(?P<pg_agent>[a-zA-Z_][a-zA-Z0-9_]*)(?:\.(?P<pg_field>[a-zA-Z_][a-zA-Z0-9_]*))?)?|"
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Needs test coverage for the new accepted forms.

This pattern was extended to accept .errors (in addition to .outputs) and to make the trailing .pg_agent[.pg_field] optional. Please add tests asserting the new accepted shapes — at minimum:

  • {group}.errors
  • {group}.errors.{member}
  • {group}.outputs (bare, no member)
  • Optional ? suffix on each of the above

Without tests, future refactors can silently regress this regex.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added — see TestInputRefPatternExtensions in tests/test_config/test_validator.py. Parametrized coverage for the new shapes:

  • {group}.errors and {group}.errors?
  • {group}.errors.{member} and {group}.errors.{member}.{field}
  • {group}.outputs (bare) and {group}.outputs?

Plus a legacy-shape test (agent.output, workflow.input.param, etc.) so the regex can't drift backward, and a negative test that explicitly rejects bare workflow.input and other malformed shapes — so a future refactor that loosens the pattern fails a test instead of silently regressing.

Fix: 278b389

templates.append((f"agent '{agent.name}' command", agent.command))
for i, arg in enumerate(agent.args):
templates.append((f"agent '{agent.name}' args[{i}]", arg))
input_mapping: dict[str, str] | None = getattr(agent, "input_mapping", None)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dead code.

AgentDef has no input_mapping field — confirmed by grep across the entire repo (no occurrences in src/, tests/, or examples/). Pydantic v2 defaults to extra='ignore', so getattr(agent, 'input_mapping', None) always returns None and this whole branch is unreachable.

The PR description still claims:

Stale references in script args, input_mapping, system_prompt: All template-bearing fields are scanned

Either remove this block or, if forward-looking, gate it behind an actual schema field added in this PR.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right on both counts — the field doesn't exist on AgentDef and the branch is unreachable. Removed the dead block in 278b389.

Will update the PR description to drop the input_mapping claim. The forward-looking version belongs with #101 when that lands, not here.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correcting myself — #101 actually closed via #109 on May 1, which added input_mapping to AgentDef. So the field DOES exist on main, the validator block in main collects from it, and dropping it from this PR would have been a regression once it merges back.

Restored the collection in 8cad8e3, kept the getattr shim so the code works on this branch (which is behind main and doesn't have the field yet) and on main (which does). Added TestInputMappingTemplateCollection exercising the path via a duck-typed agent — three tests covering the present/absent paths and stale-ref detection inside an input_mapping expression.

PR description updated to put input_mapping back in the list of scanned fields.

Comment thread src/conductor/config/validator.py Outdated
Comment on lines +638 to +647
def _resolve_prompt_file(agent_name: str, prompt: str, workflow_path: Path | None) -> str | None:
"""If a prompt looks like it came from a !file tag, try to load the file content.

The !file tag is already resolved during YAML loading, so the prompt field
contains the file content. This function is for scanning prompts that may
have been loaded from files for additional template references.

Returns the prompt as-is (it's already resolved by the loader).
"""
return prompt if prompt else None
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dead code — please remove.

_resolve_prompt_file is never called anywhere (verified via grep). The body is a no-op (return prompt if prompt else None) and the docstring explicitly says "the prompt is already resolved by the loader." Either delete this entire function, or replace it with the real !file resolution it implies (and call it).

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deleted in 278b389. No callers, no behavior — confirmed via grep. If we want real !file resolution at validate time it's a separate concern; the loader already handles it for run.

return prompt if prompt else None


def _validate_template_references(
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: use Jinja2's own parser instead of regex.

Jinja2 ships with jinja2.Environment().parse(source) and jinja2.meta.find_undeclared_variables(ast) — these give you string-aware, comment-aware, and scope-aware (recognizing {% for x in y %}, {% set x = ... %}, macro params, etc.) variable tracking. This eliminates both classes of false positives flagged on _TEMPLATE_REF_PATTERN with no ongoing regex maintenance burden, and naturally handles cases like {{ workflow.input.x | filter('foo.output') }}.

Rough sketch:

from jinja2 import Environment, meta

env = Environment()
ast = env.parse(template)
undeclared = meta.find_undeclared_variables(ast)  # set of top-level names
# Then resolve each name to either: builtin, agent, parallel/foreach group, workflow input, loop var

Also: find_referenced_templates(ast) for {% include %}/{% extends %} if those become relevant.

If this is too much for this PR, please at least downgrade missing-reference detection from errors to warnings so false positives don't block valid workflows.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done — switched to Environment().parse(...) + meta.find_undeclared_variables + a nodes.Getattr walk. See _extract_template_refs in 278b389. Both false-positive classes from the regex are now structurally impossible (loop vars are bound and so excluded from find_undeclared_variables; string literals are nodes.Const and never enter the walk).

One Jinja2 quirk worth flagging for future maintainers: meta.find_undeclared_variables actually runs the code generator over the AST, so it raises TemplateAssertionError for unknown filters/tests at find time, not just at render time. Conductor registers | json and friends on a different env at render time, which would have made every meta.find_undeclared_variables call blow up on real workflows. Worked around with a _TolerantNameMap(dict) installed onto _JINJA_ENV.filters and .tests that returns an identity function for any unknown name. Covered in TestExtractTemplateRefs.test_unknown_filter_does_not_raise and test_unknown_test_does_not_raise.

output_console.print(f" [yellow]⚠[/yellow] {warning}")
except ConductorError as e:
display_validation_error(e, workflow_path, output_console)
return False, None
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing tests for the new validation behavior.

This PR adds ~200 lines of nontrivial regex/AST-style validation logic (in validator.py) and wires it into the CLI here, but adds zero new tests. Codecov reports 16 patch lines uncovered.

At minimum, please add:

  • Positive regression tests: every workflow under examples/ should still validate successfully (this would catch issues Bump cryptography from 46.0.4 to 46.0.5 #1 today).
  • Negative tests for each new error path: stale agent ref, stale workflow input ref, references in system_prompt/command/args/working_dir.
  • Explicit-mode warning tests: undeclared agent ref + undeclared workflow.input.X ref in explicit mode.
  • For-each tests: inline-agent template scanning, for_each_names accepted in _validate_input_references.
  • Pattern-extension tests: new INPUT_REF_PATTERN accepts .errors and bare {group}.outputs.
  • CLI integration: this branch — verify warnings render and that errors return (False, None).

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a substantial test suite in 278b389:

In tests/test_config/test_validator.py:

  • TestExtractTemplateRefs — 12 unit tests on the new extractor (loop vars, string literals, {% set %}, macros, builtins, malformed templates, unknown filters/tests).
  • TestInputRefPatternExtensions — parametrized regex shape tests for the new .errors / bare .outputs forms (and a negative test for shapes that should still be rejected).
  • TestTemplateReferenceValidation — end-to-end stale-ref detection in prompt, system_prompt, and parallel-group inputs, plus regression tests for both false-positive classes.
  • TestExplicitModeWarnings — warnings vs no-warning paths for context.mode: explicit.
  • TestOutputTemplateValidation — workflow output: template stale-ref detection.
  • TestExamplesRegression — loops over examples/*.yaml to prove no example regresses (your suggested positive regression test).

In tests/test_cli/test_validate.py:

  • TestSemanticValidationIntegration — 5 CLI-level tests covering exit codes, warning rendering, and the false-positive case being non-blocking.

Total: ~600 net lines of test coverage. Locally the new tests pull the patch coverage well above the 80% bar; will see what codecov reports on the next run.

Daniel Green and others added 3 commits May 4, 2026 13:12
… tests

Address review feedback on PR microsoft#125 from @jrob5756.

Replace regex-based template scanning with Jinja2's parser + AST walk.
The previous `_TEMPLATE_REF_PATTERN` matched any `ident.attr.attr`
chain in the raw template source, producing two classes of false
positives the reviewer flagged:

  - Loop variables: `{% for r in pg.outputs %}{{ r.output.text }}{% endfor %}`
    triggered "stale agent reference: r" because the regex doesn't
    track Jinja2 scopes.
  - String literals: `{{ "agent.output.text" }}` triggered the same
    error because the regex doesn't distinguish strings from code.

The new `_extract_template_refs` parses the template, calls
`meta.find_undeclared_variables` to get only the truly free names,
then walks `Getattr` chains rooted at those names. Loop variables,
`{% set %}` bindings, and macro params are excluded automatically
because they're declared inside the template.

Also remove dead code:
  - The `input_mapping` collection block in `_collect_template_strings`
    referenced an `AgentDef` field that doesn't exist (issue microsoft#101 hasn't
    landed). `getattr` always returned `None`.
  - `_resolve_prompt_file` had no callers.
  - The vestigial `has_full_workflow_input` flag — bare `workflow.input`
    is no longer a valid input declaration after the INPUT_REF_PATTERN
    tightening.

Add comprehensive tests:
  - `TestExtractTemplateRefs`: 12 unit tests covering loop vars, string
    literals, `{% set %}`, macros, builtins, malformed templates, and
    unknown filters/tests (the AST walk uses a tolerant filter map).
  - `TestInputRefPatternExtensions`: parametrized tests for `.errors`
    and bare `.outputs` that the PR added support for.
  - `TestTemplateReferenceValidation`: end-to-end stale-ref detection
    plus regression tests for both false-positive classes.
  - `TestExplicitModeWarnings`: warning emission for missing inputs
    in `context.mode: explicit`.
  - `TestOutputTemplateValidation`: workflow `output:` template checks.
  - `TestExamplesRegression`: loops over `examples/*.yaml` to prove
    no example breaks.
  - `TestSemanticValidationIntegration` in test_validate.py: 5 CLI-level
    tests covering exit codes, warning rendering, and false-positive
    non-blocking.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
PR microsoft#109 (closing microsoft#101) merged input_mapping onto AgentDef on main. The
previous commit dropped input_mapping handling on the assumption that
the field was nonexistent — true at the time of the PR's original
review, but no longer.

Restore the collection block (using getattr for forward-compat with
branches that haven't merged microsoft#109 yet), and add tests via a duck-typed
agent so coverage works regardless of whether the schema field is
present on this branch.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copy link
Copy Markdown
Collaborator

@jrob5756 jrob5756 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — all 6 review comments addressed substantively. Switch to Jinja2 AST is well-implemented, regression tests cover both false-positive classes, and example workflows still validate.

@jrob5756 jrob5756 merged commit af2bbec into microsoft:main May 4, 2026
7 checks passed
@PolyphonyRequiem PolyphonyRequiem deleted the feat/enhanced-validate branch May 4, 2026 22:10
jrob5756 added a commit that referenced this pull request May 5, 2026
…, #121-#123, #125, #129, #130, #131, #139, #141-#144, #146)

CHANGELOG: add 6 newer PRs (#119, #121, #122, #123, #125, #113, #130, #131, #141, #146) to [Unreleased] alongside the previously documented batch.

docs/workflow-syntax.md:
  - Add metadata + instructions fields to the workflow configuration block.
  - Add input_mapping and max_depth to Sub-Workflow Steps; correct stale claims that circular references are rejected and that workflow steps cannot be used in for_each groups.
  - Add 'Sub-workflows in for_each groups' subsection with example.
  - Add JSON stdout auto-parsing note + example to Script Steps output section.
  - Add type-appropriate zero values table to Workflow Inputs.
  - Add 'Workflow Metadata Variables' subsection covering workflow.dir, workflow.file, workflow.name.
  - Update on_start hook context list to include the new workflow.dir/file vars.

docs/cli-reference.md:
  - Document --metadata/-m, --workspace-instructions, and --instructions flags on conductor run.
  - Add 'Metadata and Instructions' examples block.
  - Update conductor validate to describe the new template-reference error/warning checks added in #125.

docs/providers/claude.md, docs/providers/comparison.md:
  - Replace stale 'All models support a 200K token context window' / '200K (all models)' claims with notes that the dashboard now sources context_window_max from each provider's SDK at runtime (#144).

README.md:
  - Refresh the Features list to mention sub-workflow composition, dialog mode, workspace instructions, breadcrumb navigation, and the enhanced validate behavior.
  - Add --metadata, --workspace-instructions, --instructions to the conductor run options table.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
jrob5756 added a commit that referenced this pull request May 5, 2026
* docs: changelog + doc updates for unreleased PRs (#100, #109-#111, #119, #121-#123, #125, #129, #130, #131, #139, #141-#144, #146)

CHANGELOG: add 6 newer PRs (#119, #121, #122, #123, #125, #113, #130, #131, #141, #146) to [Unreleased] alongside the previously documented batch.

docs/workflow-syntax.md:
  - Add metadata + instructions fields to the workflow configuration block.
  - Add input_mapping and max_depth to Sub-Workflow Steps; correct stale claims that circular references are rejected and that workflow steps cannot be used in for_each groups.
  - Add 'Sub-workflows in for_each groups' subsection with example.
  - Add JSON stdout auto-parsing note + example to Script Steps output section.
  - Add type-appropriate zero values table to Workflow Inputs.
  - Add 'Workflow Metadata Variables' subsection covering workflow.dir, workflow.file, workflow.name.
  - Update on_start hook context list to include the new workflow.dir/file vars.

docs/cli-reference.md:
  - Document --metadata/-m, --workspace-instructions, and --instructions flags on conductor run.
  - Add 'Metadata and Instructions' examples block.
  - Update conductor validate to describe the new template-reference error/warning checks added in #125.

docs/providers/claude.md, docs/providers/comparison.md:
  - Replace stale 'All models support a 200K token context window' / '200K (all models)' claims with notes that the dashboard now sources context_window_max from each provider's SDK at runtime (#144).

README.md:
  - Refresh the Features list to mention sub-workflow composition, dialog mode, workspace instructions, breadcrumb navigation, and the enhanced validate behavior.
  - Add --metadata, --workspace-instructions, --instructions to the conductor run options table.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore: bump version to 0.1.11 and changelog #148

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants