dd6c20df5d
CI / dead_code (pull_request) Successful in 43s
CI / typecheck (pull_request) Successful in 1m13s
CI / unit_tests (pull_request) Successful in 1m11s
CI / lint (pull_request) Successful in 1m16s
CI / security (pull_request) Successful in 1m15s
CI / coverage (pull_request) Successful in 1m16s
CI / build (pull_request) Successful in 26s
CI / typecheck (push) Successful in 1m3s
CI / unit_tests (push) Successful in 1m2s
CI / lint (push) Successful in 1m6s
CI / dead_code (push) Successful in 27s
CI / security (push) Successful in 57s
CI / coverage (push) Successful in 59s
CI / build (push) Successful in 37s
actor/compiler.py:_map_node() already threaded provider and model from the
actor-level config into each AGENT node's merged_meta via setdefault, but
system_prompt was never added to the same pattern.
Three targeted additions across two files:
1. _map_node() in actor/compiler.py gains an actor_system_prompt parameter
and applies merged_meta.setdefault("system_prompt", actor_system_prompt)
inside the AGENT branch, directly after the existing provider/model calls.
setdefault semantics ensure per-node config.system_prompt overrides take
precedence, exactly matching the existing provider/model behaviour.
2. compile_actor() now passes actor_system_prompt=config.system_prompt to
_map_node() so the actor-level field reaches every AGENT node.
3. Node._execute_agent() in langgraph/nodes.py injects the node's
metadata["system_prompt"] into the context dict (before state.metadata
is merged) so host agents can read context.get("system_prompt") without
needing a direct reference to the raw ActorConfigSchema.
Seven BDD scenarios added in features/compiler_system_prompt.feature:
- Actor-level system_prompt is threaded into each AGENT node metadata.
- Per-node system_prompt takes precedence via setdefault semantics.
- process_message() receives system_prompt in the context dict.
- state.metadata["system_prompt"] overrides compiled default at runtime.
- Non-AGENT nodes (TOOL) do not receive system_prompt in metadata.
- Actor without system_prompt compiles metadata as None.
- Absent system_prompt is excluded from runtime context dict.
Bug fix: changed truthiness check from `if node_system_prompt:` to
`if node_system_prompt is not None:` in _execute_agent() to faithfully
pass empty-string system prompts into the context dict. Added explicit
`str | None` type annotation for node_system_prompt.
docs/reference/actor_compiler.md updated to document system_prompt
threading alongside provider and model in the Node Binding table.
Quality gates: lint, typecheck, unit_tests (14/14), coverage_report,
security_scan, dead_code, complexity all pass.
ISSUES CLOSED: #6