Draft release notes and an LLM go/no-go readiness advisory with four Agent SDK subagents
Failure modes
| Symptom | Cause | Fix | Severity |
|---|---|---|---|
RuntimeWarning: coroutine 'ReleasePreparationWorkflow.execute' was never awaited |
execute called without await |
It is a coroutine — await it or use asyncio.run |
high |
WorkflowResult.success is False, error is "path argument is required" |
execute called with an empty or missing path |
Pass a non-empty path |
high |
error reads "Agent SDK unavailable: ..." |
claude_agent_sdk is not importable |
Install the Agent SDK dependency for the environment | high |
error reads "Agent SDK connection failed: ..." |
A ConnectionError / TimeoutError reaching the SDK |
Check connectivity and retry | medium |
| Advisory stops early / partial report | The depth's agent-turn or budget cap was reached | Use a shallower depth, or raise the cap with ATTUNE_MAX_BUDGET_USD |
medium |
| The release shipped despite a "no-go" | Release-notes is advisory — it never blocks | Use release-prep (attune workflow run release-gate) for an enforced gate |
medium |
Risk areas
- The async call is easy to get wrong.
executeis the main public method and it is a coroutine. Forgetting toawaitit is the single most common mistake. - Advisory ≠ gate. The go/no-go is a recommendation from an LLM
assessor, not a measured pass/fail. Don't wire it into CI as a
blocking check — use
release-prepfor that. - Pass
path.executereadspath(anddepth); the CLI and Python API supplypathcorrectly.
Diagnosis order
- Confirm you are awaiting:
result = await workflow.execute( path=".")inside anasync deforasyncio.run. - Check
result.success; ifFalse, readresult.error. - If
erroris "path argument is required", confirm you passedpath=. - On an SDK error, inspect
result.metadatafor the capturedsdk_stderr/ SDK error kind. - Confirm the scope:
result.metadataechoes thepath,depth, andmax_turns.