ww-agentic-workflows 1.0.0.dev3__tar.gz → 1.0.0.dev5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (385) hide show
  1. ww_agentic_workflows-1.0.0.dev5/.claude/skills/noww/SKILL.md +12 -0
  2. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.claude/skills/ww/SKILL.md +23 -11
  3. ww_agentic_workflows-1.0.0.dev5/.codex/skills/noww/SKILL.md +12 -0
  4. ww_agentic_workflows-1.0.0.dev5/.codex/skills/ww/SKILL.md +71 -0
  5. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/CHANGELOG.md +54 -0
  6. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/PKG-INFO +10 -10
  7. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/README.md +9 -9
  8. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/WW_AGENT_INSTRUCTIONS.md +13 -3
  9. ww_agentic_workflows-1.0.0.dev5/documentation/agent-hooks.md +135 -0
  10. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/documentation/architecture.md +55 -60
  11. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/documentation/features.md +164 -122
  12. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/documentation/limitations.md +5 -10
  13. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/documentation/specification.md +152 -33
  14. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/documentation/todo.md +3 -5
  15. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/ext/ww/git/extension.py +23 -2
  16. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/pyproject.toml +1 -1
  17. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/agent_instructions.md +13 -3
  18. ww_agentic_workflows-1.0.0.dev5/src/ww/assets/noww_skill.md +12 -0
  19. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/workflows/onboarding.yaml +1 -1
  20. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/ww-deduce-feedback_skill.md +6 -0
  21. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/ww-wizard_skill.md +1 -1
  22. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/ww_skill.md +23 -11
  23. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/builtin_workflows.py +0 -6
  24. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/changes.py +44 -11
  25. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/claude_permissions.py +1 -0
  26. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/cli/catalogs.py +1 -0
  27. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/cli/discover.py +53 -102
  28. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/cli/initialization.py +3 -5
  29. ww_agentic_workflows-1.0.0.dev5/src/ww/cli/lookup.py +266 -0
  30. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/cli/main.py +89 -86
  31. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/cli/parser.py +53 -17
  32. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/config/__init__.py +7 -0
  33. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/config/rules.py +26 -1
  34. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/defaults.py +0 -2
  35. ww_agentic_workflows-1.0.0.dev5/src/ww/direct_work.py +275 -0
  36. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/execution_models/decoding.py +12 -0
  37. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/execution_models/plan_codec.py +2 -0
  38. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/execution_models/records.py +28 -1
  39. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/feedback.py +6 -2
  40. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/hooks/__init__.py +2 -5
  41. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/hooks/agents.py +7 -82
  42. ww_agentic_workflows-1.0.0.dev5/src/ww/hooks/notices.py +32 -0
  43. ww_agentic_workflows-1.0.0.dev5/src/ww/hooks/runtime.py +75 -0
  44. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/instructions/builder.py +12 -1
  45. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/instructions/commands.py +13 -0
  46. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/instructions/handoff.py +16 -4
  47. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/instructions/models.py +13 -0
  48. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/interactions.py +4 -7
  49. ww_agentic_workflows-1.0.0.dev5/src/ww/open_work.py +42 -0
  50. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/output.py +11 -4
  51. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/output_adapters/markdown.py +56 -11
  52. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/output_adapters/rule_pages.py +7 -1
  53. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/plan/compiler.py +2 -0
  54. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/plan/models.py +4 -0
  55. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/project_config.py +24 -18
  56. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/results.py +18 -3
  57. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/rule_checks.py +2 -2
  58. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/rule_verification.py +9 -3
  59. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/rule_views.py +7 -0
  60. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/rule_writes.py +36 -4
  61. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/runtimes.py +12 -2
  62. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/service.py +364 -38
  63. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/storage_adapters/base.py +21 -0
  64. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/storage_adapters/filesystem.py +32 -5
  65. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/storage_adapters/memory.py +17 -2
  66. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/transitions.py +50 -0
  67. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/workflow_config.py +4 -0
  68. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/conftest.py +6 -6
  69. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/fix-required.md +1 -1
  70. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/interactive.md +1 -1
  71. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/item-stage.md +1 -1
  72. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/loop-body.md +1 -1
  73. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/loop-continue.md +1 -1
  74. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/manager-dispatch.md +1 -1
  75. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/step-auto-worker.md +1 -1
  76. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/step-rules.md +1 -1
  77. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/step-single.md +1 -1
  78. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/values-and-metadata.md +1 -1
  79. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/worker-handoff.md +2 -0
  80. ww_agentic_workflows-1.0.0.dev5/tests/integration/test_adjustments.py +227 -0
  81. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_builtin_workflows.py +7 -26
  82. ww_agentic_workflows-1.0.0.dev5/tests/integration/test_children_added_mid_run.py +227 -0
  83. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_cli.py +5 -7
  84. ww_agentic_workflows-1.0.0.dev5/tests/integration/test_direct_work.py +582 -0
  85. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_discover.py +57 -81
  86. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_git_extension.py +38 -0
  87. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_handler_repairs.py +11 -0
  88. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_handoff_block.py +182 -0
  89. ww_agentic_workflows-1.0.0.dev5/tests/integration/test_hooks.py +536 -0
  90. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_interactive.py +2 -2
  91. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_onboarding_workflows.py +2 -1
  92. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_page_gates.py +1 -0
  93. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_plan_execution.py +90 -0
  94. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_rule_write_commands.py +61 -1
  95. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_rules_and_checks.py +94 -0
  96. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_worker_handoff.py +70 -0
  97. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_workflow_service.py +3 -3
  98. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_changes.py +52 -0
  99. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_config.py +3 -3
  100. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_config_composition.py +2 -14
  101. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_execution_hints.py +4 -3
  102. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_hook_agents.py +12 -94
  103. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_plan.py +1 -1
  104. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_project_config.py +29 -8
  105. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_rule_verification.py +30 -0
  106. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_rules.py +16 -0
  107. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_task_storage_adapters.py +59 -0
  108. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_variables.py +1 -1
  109. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_workflow_inheritance.py +24 -0
  110. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_workflow_validation.py +18 -11
  111. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/ww.yaml +3 -1
  112. ww_agentic_workflows-1.0.0.dev3/.claude/skills/noww/SKILL.md +0 -11
  113. ww_agentic_workflows-1.0.0.dev3/.codex/skills/noww/SKILL.md +0 -11
  114. ww_agentic_workflows-1.0.0.dev3/.codex/skills/ww/SKILL.md +0 -34
  115. ww_agentic_workflows-1.0.0.dev3/documentation/agent-hooks.md +0 -270
  116. ww_agentic_workflows-1.0.0.dev3/src/ww/assets/noww_skill.md +0 -11
  117. ww_agentic_workflows-1.0.0.dev3/src/ww/assets/workflows/catchall.yaml +0 -26
  118. ww_agentic_workflows-1.0.0.dev3/src/ww/cli/lookup.py +0 -287
  119. ww_agentic_workflows-1.0.0.dev3/src/ww/hooks/notices.py +0 -206
  120. ww_agentic_workflows-1.0.0.dev3/src/ww/hooks/records.py +0 -209
  121. ww_agentic_workflows-1.0.0.dev3/src/ww/hooks/runtime.py +0 -266
  122. ww_agentic_workflows-1.0.0.dev3/src/ww/hooks/transcripts.py +0 -183
  123. ww_agentic_workflows-1.0.0.dev3/src/ww/open_work.py +0 -236
  124. ww_agentic_workflows-1.0.0.dev3/tests/integration/test_catchall.py +0 -212
  125. ww_agentic_workflows-1.0.0.dev3/tests/integration/test_hooks.py +0 -1324
  126. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.claude/settings.json +0 -0
  127. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.claude/skills/update-architecture-documentation/SKILL.md +0 -0
  128. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.codex/hooks.json +0 -0
  129. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.codex/skills/update-architecture-documentation/SKILL.md +0 -0
  130. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.git-blame-ignore-revs +0 -0
  131. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.githooks/pre-commit +0 -0
  132. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  133. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  134. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  135. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  136. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.github/workflows/dev-publish.yml +0 -0
  137. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.github/workflows/release-gates.yml +0 -0
  138. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.gitignore +0 -0
  139. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/AGENTS.md +0 -0
  140. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/CLAUDE.md +0 -0
  141. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/CODE_OF_CONDUCT.md +0 -0
  142. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/CONTRIBUTING.md +0 -0
  143. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/LICENSE +0 -0
  144. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/SECURITY.md +0 -0
  145. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/documentation/development-releases.md +0 -0
  146. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/documentation/examples.md +0 -0
  147. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/documentation/python-agent-rules.md +0 -0
  148. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/scripts/check_distribution.py +0 -0
  149. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/scripts/check_release_gates.py +0 -0
  150. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/scripts/demo.sh +0 -0
  151. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/scripts/ensure_spdx_license.py +0 -0
  152. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/scripts/measure_pages.py +0 -0
  153. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/scripts/run_workflow_dummy.py +0 -0
  154. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/scripts/set_dev_version.py +0 -0
  155. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/scripts/test +0 -0
  156. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/__init__.py +0 -0
  157. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/action_execution.py +0 -0
  158. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/actions/__init__.py +0 -0
  159. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/actions/command.py +0 -0
  160. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/actions/contracts.py +0 -0
  161. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/actions/extension.py +0 -0
  162. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/actions/mcp.py +0 -0
  163. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/actions/prompt.py +0 -0
  164. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/actions/skill.py +0 -0
  165. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/actions/slash_command.py +0 -0
  166. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/agents.py +0 -0
  167. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/amendments.py +0 -0
  168. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/artifacts.py +0 -0
  169. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assessments.py +0 -0
  170. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/__init__.py +0 -0
  171. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/workflows/scriptize.yaml +0 -0
  172. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/ww-automate_skill.md +0 -0
  173. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/ww-feedback-rules_skill.md +0 -0
  174. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/ww-learn-project_skill.md +0 -0
  175. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/ww-refresh_skill.md +0 -0
  176. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/ww-rule_skill.md +0 -0
  177. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/ww-rules-from-artifacts_skill.md +0 -0
  178. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/ww-scriptize_skill.md +0 -0
  179. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/ww-setup_skill.md +0 -0
  180. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/ww-solve_skill.md +0 -0
  181. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/ww-suggest_skill.md +0 -0
  182. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assignments.py +0 -0
  183. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/bootstrap.py +0 -0
  184. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/child_coordination.py +0 -0
  185. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/children.py +0 -0
  186. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/cli/__init__.py +0 -0
  187. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/cli/__main__.py +0 -0
  188. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/cli/audit.py +0 -0
  189. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/cli/prompts.py +0 -0
  190. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/cli/updates.py +0 -0
  191. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/completion_artifacts.py +0 -0
  192. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/completion_inputs.py +0 -0
  193. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/config/actions.py +0 -0
  194. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/config/composition.py +0 -0
  195. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/config/steps.py +0 -0
  196. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/config/values.py +0 -0
  197. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/config_files.py +0 -0
  198. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/config_writes.py +0 -0
  199. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/contracts.py +0 -0
  200. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/control.py +0 -0
  201. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/design_docs.py +0 -0
  202. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/discovery.py +0 -0
  203. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/documents.py +0 -0
  204. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/errors.py +0 -0
  205. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/executable.py +0 -0
  206. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/execution_models/__init__.py +0 -0
  207. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/execution_models/construction.py +0 -0
  208. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/execution_models/runs.py +0 -0
  209. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/extensions/__init__.py +0 -0
  210. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/extensions/api.py +0 -0
  211. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/extensions/registry.py +0 -0
  212. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/extensions/store.py +0 -0
  213. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/handler_repairs.py +0 -0
  214. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/hooks/install.py +0 -0
  215. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/inspect.py +0 -0
  216. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/instructions/__init__.py +0 -0
  217. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/instructions/policy.py +0 -0
  218. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/instructions/text.py +0 -0
  219. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/interpolation.py +0 -0
  220. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/item_passes.py +0 -0
  221. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/items.py +0 -0
  222. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/locking.py +0 -0
  223. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/metadata_publication.py +0 -0
  224. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/onboarding.py +0 -0
  225. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/operations.py +0 -0
  226. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/operator_ui/__init__.py +0 -0
  227. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/operator_ui/page.html +0 -0
  228. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/operator_ui/server.py +0 -0
  229. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/operator_ui/session.py +0 -0
  230. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/operator_ui/sheet.py +0 -0
  231. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/operator_ui/view.py +0 -0
  232. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/output_adapters/__init__.py +0 -0
  233. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/output_adapters/base.py +0 -0
  234. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/output_adapters/json_adapter.py +0 -0
  235. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/output_adapters/terminal.py +0 -0
  236. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/package_updates.py +0 -0
  237. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/plan/__init__.py +0 -0
  238. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/plan/actions.py +0 -0
  239. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/plan/constructs.py +0 -0
  240. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/recovery.py +0 -0
  241. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/replanning.py +0 -0
  242. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/rule_conversion.py +0 -0
  243. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/rule_disputes.py +0 -0
  244. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/rule_store.py +0 -0
  245. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/run_coordination.py +0 -0
  246. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/setup_apply.py +0 -0
  247. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/step_values.py +0 -0
  248. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/storage.py +0 -0
  249. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/storage_adapters/__init__.py +0 -0
  250. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/storage_adapters/project_metadata.py +0 -0
  251. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/storage_adapters/task_document.py +0 -0
  252. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/task_ids.py +0 -0
  253. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/task_references.py +0 -0
  254. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/updates.py +0 -0
  255. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/upgrade.py +0 -0
  256. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/validation.py +0 -0
  257. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/variables.py +0 -0
  258. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/workflow_update.py +0 -0
  259. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/workflow_validation.py +0 -0
  260. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/workspace.py +0 -0
  261. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/action_contract_helpers.py +0 -0
  262. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/config_helpers.py +0 -0
  263. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/example_documents.py +0 -0
  264. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/fixtures/packaged_extension/ww_test_packaged_extension.py +0 -0
  265. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/completion.md +0 -0
  266. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/operator-stop.md +0 -0
  267. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/verification.md +0 -0
  268. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/worker-bootstrap.md +0 -0
  269. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_artifact_from_containers.py +0 -0
  270. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_assessment_outcomes.py +0 -0
  271. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_assignment_tokens.py +0 -0
  272. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_auto_retries.py +0 -0
  273. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_automatic_handler_groups.py +0 -0
  274. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_automatic_modes.py +0 -0
  275. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_awaiting_operator.py +0 -0
  276. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_bootstrap_task_id.py +0 -0
  277. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_child_identity.py +0 -0
  278. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_child_launch_settings.py +0 -0
  279. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_child_stages.py +0 -0
  280. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_child_start_action.py +0 -0
  281. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_child_start_guards.py +0 -0
  282. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_child_tasks.py +0 -0
  283. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_command_metadata.py +0 -0
  284. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_complete_dispatch.py +0 -0
  285. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_concurrency.py +0 -0
  286. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_config_files.py +0 -0
  287. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_configuration_authority.py +0 -0
  288. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_documents.py +0 -0
  289. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_example_behaviour.py +0 -0
  290. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_executable.py +0 -0
  291. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_extension_execution.py +0 -0
  292. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_feedback_commands.py +0 -0
  293. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_git_variables.py +0 -0
  294. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_golden_pages.py +0 -0
  295. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_init_force.py +0 -0
  296. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_init_permissions.py +0 -0
  297. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_inspect.py +0 -0
  298. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_item_assignment.py +0 -0
  299. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_item_fields.py +0 -0
  300. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_item_pass_restarts.py +0 -0
  301. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_item_pass_runs.py +0 -0
  302. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_item_reply_reports.py +0 -0
  303. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_item_runtime_values.py +0 -0
  304. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_items.py +0 -0
  305. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_local_step_pages.py +0 -0
  306. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_loops.py +0 -0
  307. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_memory_workflow_service.py +0 -0
  308. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_metadata_lists.py +0 -0
  309. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_onboarding.py +0 -0
  310. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_pack_scenarios.py +0 -0
  311. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_packaged_extension.py +0 -0
  312. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_projects.py +0 -0
  313. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_recommended_workflow.py +0 -0
  314. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_recovery_guards.py +0 -0
  315. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_replanning.py +0 -0
  316. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_requirements_pages.py +0 -0
  317. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_requirements_per_session.py +0 -0
  318. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_restart.py +0 -0
  319. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_rule_commands.py +0 -0
  320. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_rule_conversion.py +0 -0
  321. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_rule_verification_flow.py +0 -0
  322. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_scriptize_workflow.py +0 -0
  323. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_setup_apply.py +0 -0
  324. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_setup_update.py +0 -0
  325. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_setup_verification.py +0 -0
  326. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_shared_items.py +0 -0
  327. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_stale_task_records.py +0 -0
  328. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_state_unknown_fields.py +0 -0
  329. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_system_scenarios.py +0 -0
  330. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_update_notice.py +0 -0
  331. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_upgrade.py +0 -0
  332. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_workdir.py +0 -0
  333. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_worker_bootstrap_text.py +0 -0
  334. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/page_catalog.py +0 -0
  335. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/plan_helpers.py +0 -0
  336. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/test_dev_version.py +0 -0
  337. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_action_contracts.py +0 -0
  338. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_action_example.py +0 -0
  339. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_action_phase_contexts.py +0 -0
  340. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_artifacts.py +0 -0
  341. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_assignments.py +0 -0
  342. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_beta_notice.py +0 -0
  343. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_builtin_actions.py +0 -0
  344. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_checklist_prompt.py +0 -0
  345. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_child_stages_config.py +0 -0
  346. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_children_config.py +0 -0
  347. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_cli_prompts.py +0 -0
  348. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_completion_inputs.py +0 -0
  349. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_completion_selection.py +0 -0
  350. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_config_writes.py +0 -0
  351. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_delegation_requests.py +0 -0
  352. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_design_docs.py +0 -0
  353. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_discovery.py +0 -0
  354. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_examples_doc.py +0 -0
  355. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_extensions.py +0 -0
  356. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_feedback.py +0 -0
  357. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_handler_failure_report.py +0 -0
  358. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_instruction_commands.py +0 -0
  359. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_interactions.py +0 -0
  360. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_item_config.py +0 -0
  361. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_item_passes.py +0 -0
  362. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_item_validation.py +0 -0
  363. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_locking.py +0 -0
  364. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_markdown_output.py +0 -0
  365. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_modes.py +0 -0
  366. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_operator_ui.py +0 -0
  367. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_package_updates.py +0 -0
  368. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_project_metadata_storage_adapters.py +0 -0
  369. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_records.py +0 -0
  370. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_rule_disputes.py +0 -0
  371. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_rule_store.py +0 -0
  372. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_rule_writes.py +0 -0
  373. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_runtimes.py +0 -0
  374. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_scripts_test_bootstrap.py +0 -0
  375. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_step_role.py +0 -0
  376. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_storage.py +0 -0
  377. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_task_document.py +0 -0
  378. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_task_ids.py +0 -0
  379. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_task_references.py +0 -0
  380. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_transitions.py +0 -0
  381. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_updates.py +0 -0
  382. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_validation.py +0 -0
  383. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_workspace.py +0 -0
  384. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/workflow_helpers.py +0 -0
  385. {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/ww.json +0 -0
@@ -0,0 +1,12 @@
1
+ ---
2
+ name: noww
3
+ description: Work without ww. Use only when the user invokes /noww or asks not to use ww.
4
+ ---
5
+
6
+ # Work without ww
7
+
8
+ Do not use ww for the rest of this conversation, unless the user asks for it
9
+ again: do not run `./ww discover`, `./ww lookup` or `./ww record`, and do not
10
+ start, continue, or complete a ww task. Carry out requests directly, as in a
11
+ project without ww. A ww task already in progress stays as it is; do not reset
12
+ or fail it.
@@ -17,17 +17,29 @@ change, start from step 1 then.
17
17
  carry out the request without ww and do not ask.
18
18
  2. To continue an existing task, run
19
19
  `./ww instruction <task-id> --role manager` instead of starting a new one.
20
- 3. Otherwise choose the workflow that matches the request, keep its default
21
- modes unless the user's wording matches another mode, and start the task
22
- with the start command `discover` shows. Pass the user's requirements,
23
- normalized, as `--requirements`. When the request names an external
24
- ticket, such as a Jira key, use that key as the task ID; omit the ID only
25
- when there is none or the workflow obtains its own.
26
- When no workflow fits and you are about to change files, do not start
27
- `catchall` directly: run `./ww lookup [<task>] --agent <agent>` with the
28
- task the conversation works on or the request names, as written, and
29
- follow its answer, then do the work as you would without ww. Read-only work
30
- needs no task.
20
+ 3. Otherwise decide how the request is carried out, in this order:
21
+ a. It names a ticket or clearly matches a configured workflow's
22
+ description, and is more than a small change: propose that workflow, and
23
+ offer the alternative in the same choice, "run `<workflow>`" / "just do
24
+ it, register afterwards". A workflow the user named is started without
25
+ asking. When one is chosen, keep its default
26
+ modes unless the user's wording matches another mode, and start the task
27
+ with the start command `discover` shows. Pass the user's requirements,
28
+ normalized, as `--requirements`. When the request names an external
29
+ ticket, such as a Jira key, use that key as the task ID; omit the ID
30
+ only when there is none or the workflow obtains its own.
31
+ b. Otherwise it is direct work: do it as you would in a plain conversation,
32
+ with no question asked, then run
33
+ `./ww record <task> --summary "..."`. `./ww lookup [<task>] --agent
34
+ <agent>` names the task and the command; pass the task the conversation
35
+ works on or the request names, as written. Read-only work needs no task.
36
+ c. Judge each prompt on its own. A series of small requests stays a series
37
+ of direct-work entries; never promote them into a workflow because they
38
+ add up.
39
+ d. Ask only when it is genuinely ambiguous, and never again on the same
40
+ task once the operator chose direct work.
41
+ e. If `record` fails or is forgotten, ww records the commits it had not
42
+ seen on the next run; say so, and do not retry it endlessly.
31
43
  When the first page of `start` says rules have no check
32
44
  yet, tell the user once and carry on: it never blocks the task, and the
33
45
  `ww-scriptize` skill builds those checks when they want it.
@@ -0,0 +1,12 @@
1
+ ---
2
+ name: noww
3
+ description: Work without ww. Use only when the user invokes /noww or asks not to use ww.
4
+ ---
5
+
6
+ # Work without ww
7
+
8
+ Do not use ww for the rest of this conversation, unless the user asks for it
9
+ again: do not run `./ww discover`, `./ww lookup` or `./ww record`, and do not
10
+ start, continue, or complete a ww task. Carry out requests directly, as in a
11
+ project without ww. A ww task already in progress stays as it is; do not reset
12
+ or fail it.
@@ -0,0 +1,71 @@
1
+ ---
2
+ name: ww
3
+ description: Carry out a development request through ww, this project's workflow tool. Use only when the request changes something (implement, fix, refactor, merge, edit documentation) or the user explicitly asks to work via ww, to start or continue a ww task, or to run a ww workflow; where `./ww discover` says ww is used by default, use it before changing files for any request, since every change then goes through ww. Never use it for reviews, questions, explanations, investigations, status checks or other read-only work, even when they concern ww or a ww task.
4
+ ---
5
+
6
+ # Work through ww
7
+
8
+ ww is for development: requests that change files. A review, question,
9
+ explanation, investigation, status check or other read-only request never
10
+ goes through ww; answer it directly, without these steps and without a task,
11
+ even where ww is used by default. When a read-only conversation turns into a
12
+ change, start from step 1 then.
13
+
14
+ 1. Run `./ww discover` and read all of it. If it says ww is disabled, stop:
15
+ do not use ww, and tell the user. If it says ww is used only on request
16
+ and the user did not explicitly ask for ww (invoking this skill counts),
17
+ carry out the request without ww and do not ask.
18
+ 2. To continue an existing task, run
19
+ `./ww instruction <task-id> --role manager` instead of starting a new one.
20
+ 3. Otherwise decide how the request is carried out, in this order:
21
+ a. It names a ticket or clearly matches a configured workflow's
22
+ description, and is more than a small change: propose that workflow, and
23
+ offer the alternative in the same choice, "run `<workflow>`" / "just do
24
+ it, register afterwards". A workflow the user named is started without
25
+ asking. When one is chosen, keep its default
26
+ modes unless the user's wording matches another mode, and start the task
27
+ with the start command `discover` shows. Pass the user's requirements,
28
+ normalized, as `--requirements`. When the request names an external
29
+ ticket, such as a Jira key, use that key as the task ID; omit the ID
30
+ only when there is none or the workflow obtains its own.
31
+ b. Otherwise it is direct work: do it as you would in a plain conversation,
32
+ with no question asked, then run
33
+ `./ww record <task> --summary "..."`. `./ww lookup [<task>] --agent
34
+ <agent>` names the task and the command; pass the task the conversation
35
+ works on or the request names, as written. Read-only work needs no task.
36
+ c. Judge each prompt on its own. A series of small requests stays a series
37
+ of direct-work entries; never promote them into a workflow because they
38
+ add up.
39
+ d. Ask only when it is genuinely ambiguous, and never again on the same
40
+ task once the operator chose direct work.
41
+ e. If `record` fails or is forgotten, ww records the commits it had not
42
+ seen on the next run; say so, and do not retry it endlessly.
43
+ When the first page of `start` says rules have no check
44
+ yet, tell the user once and carry on: it never blocks the task, and the
45
+ `ww-scriptize` skill builds those checks when they want it.
46
+ 4. Follow every ww response exactly: run each displayed command with all
47
+ placeholders replaced, and keep going until ww reports that the workflow
48
+ is complete or reports an error. On `interactive: true` steps, converse
49
+ naturally until intent to finish is clear, ask if ambiguous, and treat
50
+ "done for today" as a pause. Record and end the interaction before
51
+ completing it. Use the host choice tool when available; keep asynchronous
52
+ choices pending until an answer arrives, and do not treat timeouts or
53
+ preselection as answers. After completion, relay any optional
54
+ `ww-deduce-feedback` suggestion; do not insert learning into the plan.
55
+ Deduction uses ww commands and explicit existing point IDs; rule review
56
+ and pruning are separate, and rules require operator approval.
57
+ 5. Never run a ww-owned handler yourself, edit ww state, or read
58
+ `ww.yaml` or ww's source to work out what to do next. For a handler repair
59
+ assignment, fix the cause and complete with an artifact; ww retries the
60
+ command. In `auto`, the manager dispatches the repair with `next`. When
61
+ ww reports `awaiting_operator` (a failed handler or work, an interrupted
62
+ command, a loop at its iteration limit, a changed workflow), stop and report the task, its
63
+ `operator_reason` and the exact error to the user (unless they gave a
64
+ standing authorization for routine repairs such as dependency installation,
65
+ formatting or retries: apply it to a stop of that kind without asking again,
66
+ and ask only for a material decision or an action outside it); when they
67
+ decide, run the recovery command ww showed, `./ww next <task-id> --retry` to run the
68
+ handler again, `--force --reason` to skip it or leave the loop, or
69
+ `--replan` / `--keep-plan` for a changed workflow. A `pass_incomplete`
70
+ stop is cleared by recording what it names with `./ww update-item`, then
71
+ `./ww next <task-id> --retry`; `--force` is refused there.
@@ -11,6 +11,60 @@ yet, is in [documentation/limitations.md](documentation/limitations.md).
11
11
 
12
12
  ## 2026-10-05
13
13
 
14
+ - Removed: the session-start task list, stop reminders, interruption records and transcript recovery, and the
15
+ `interrupted` command. Hooks, events and `agent_hooks` keys stay accepted. `5414a34`
16
+ - Added: `add-child` is accepted while a per-child stage of a roadmap-style parent is active, not only while the
17
+ collecting step is. The new child is appended after the last planned child with its own expanded lifecycle;
18
+ once the last child's stages have finished the command is refused. `00338d9`
19
+ - Added: `ww handoff <task> [--run ID] [--assignment TOKEN] [--json]` prints the handoff block of an ended assignment
20
+ again, for a worker whose output was cut short; the completion page and the `auto` runtime instruction name it.
21
+ The change set is reproduced only while the assignment is the latest one, otherwise the block says so. `aae3ed2`
22
+ - Fixed: when a child task's run has completed, its handoff block names the parent task's `next` command
23
+ ("Manager: continue with the parent task: ...") instead of a command that fails because the child is completed;
24
+ a child partway through its run keeps its own. The handoff JSON carries `continuation_task_id`. `6b6669c`
25
+ - Fixed: a child task's `ww/git` worktree is named like its branch, the parent's rendered `worktree_name_format`
26
+ plus `-<child id>` (`ww-worktrees/TASK-51-A`), so it no longer lands inside the parent's checkout as untracked
27
+ content; any other rendered name holding a `/` has each one replaced with `-`. Worktrees already created inside
28
+ a parent's are not migrated. `6b6669c`
29
+ - Fixed: the continuation line of a requested-worker page names the flags (`--selected-agent`, `--model`,
30
+ `--reasoning`) whose values follow the request. `6b6669c`
31
+ - Changed: ww's own roadmap workflow's `fix` step tells the worker to prefix its commits with the child ID, as the
32
+ child's own commits are. `6b6669c`
33
+
34
+ - Added: direct work replaces the `catchall` workflow. A change no workflow fits is made as in a plain
35
+ conversation and registered afterwards with `record <task> --summary "<text>"`, which appends an entry to
36
+ the task's `direct-work.json` with the commits ww finds itself (the task's recorded branch since its base,
37
+ minus the commits ww already knows; without a recorded branch, the current branch's commits that name the task
38
+ ID). A task needs no run, and `lookup` no longer asks before a task ww has not seen. When the manager asks for
39
+ a task's page with `instruction --role manager`, ww records any commits it had not seen as a `reconciled` entry
40
+ and prints one line at the top of the page, so a forgotten or failed `record` is made up for. `status` lists the
41
+ entries and short SHAs. The agent instructions, the `ww` and `noww` skills and `discover` now say: propose a
42
+ matching workflow with "just do it, register afterwards" as the alternative, otherwise work directly and ask
43
+ nothing, judge each prompt on its own, and never ask again on a task once direct work was chosen. Existing
44
+ projects keep their installed skills; `init --force` or copying the bundled ones picks up the new wording.
45
+ - Removed: the `catchall` workflow, its `discover` section (`catchall` is gone from the JSON, `direct_work`
46
+ replaces it) and the `lookup` menu. A `catchall` entry under `workflows` in `ww.json` is ignored and `lint`
47
+ warns about it, instead of failing.
48
+ - The repair page for a failed automatic handler now says what to do when the cause is the environment rather than
49
+ the work (a sandbox or permission denial, a network or package-install error, a held lock): change no project
50
+ files, fix the environment or ask the operator, and say in the completion that the cause was environmental.
51
+ - A rule file can narrow a rule to files by content with `contains`, a list of plain, case-sensitive strings (no
52
+ regular expressions) in its frontmatter: a file must match a `paths` glob, if any, and contain one of the
53
+ strings. A check whose strings are in no changed file is not applicable, a converted check covering several
54
+ rules takes the union of their strings, and the step page prints the strings beside the globs. `rules add` and
55
+ `rules edit` take `--contains <text>...` and report how many project files hold each string. Rules written in a
56
+ step's own `rules` list still take no `paths` or `contains`.
57
+ - `complete` and `loop` take `--adjustments "<text>"` for the changes the operator asked for during a step. ww
58
+ stores it on the step record, shows it in `status`, beside the summary on the next step's page and on the
59
+ verifier's page, and hands it to feedback deduction as a labelled `adjustments` field; a repair completion
60
+ refuses it. Every worker step page now asks the worker to record such requests in the artifact and in the flag.
61
+ - A workflow can set `manual: true`: `discover` and `lookup` leave it out, `start` still accepts it, and `inherit`
62
+ does not copy the setting. A workflow named `manual` in the `- name: description` shorthand must now use the
63
+ `name:` key.
64
+ - A handoff now gives the new run the target workflow's declared `runtime`, and replaces the run-level `model` and
65
+ `reasoning` with the target's declared values, keeping the source run's values for what the target does not
66
+ declare.
67
+ - The specification and features now describe how a child gets its external ID.
14
68
  - The `ww` skill and agent instructions now say ww is only for development: reviews, questions, investigations,
15
69
  status checks and other read-only requests never invoke the skill or start a task. Existing projects keep their
16
70
  installed skill; `init --force` or copying the bundled one picks up the new wording.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: ww-agentic-workflows
3
- Version: 1.0.0.dev3
3
+ Version: 1.0.0.dev5
4
4
  Summary: A local-first, resumable workflow CLI for people and AI agents.
5
5
  Project-URL: Homepage, https://agenticworkflows.dev
6
6
  Project-URL: Documentation, https://github.com/from-developers-for-developers/agentic-workflows/tree/main/documentation
@@ -323,14 +323,14 @@ one:
323
323
  - `--role manager` is the role driving the task; a worker performing a single
324
324
  assignment uses `--role worker`.
325
325
 
326
- A request no workflow fits still goes through ww once it changes files. The
327
- agent records it with `catchall`, a one-step workflow ww provides to every
328
- project, and otherwise works exactly as it would without ww. Questions and
329
- other read-only work never start a task. The agent first runs `./ww lookup`
330
- with the task you named, however you wrote it (`12345` finds `FOOBAR-12345`),
331
- and a task ww has never seen is only created after you confirm it in the
332
- agent's choice menu. Say `/noww` when you want the
333
- agent to leave ww out.
326
+ A request no workflow fits is direct work: the agent does it exactly as it
327
+ would without ww, then registers it with `./ww record <task> --summary "..."`,
328
+ and ww keeps the summary and the commits it finds for it. Questions and other
329
+ read-only work never start a task. The agent first runs `./ww lookup` with the
330
+ task you named, however you wrote it (`12345` finds `FOOBAR-12345`), and asks
331
+ you nothing unless the request clearly matches a workflow, in which case it
332
+ offers that workflow or "just do it, register afterwards". Say `/noww` when
333
+ you want the agent to leave ww out.
334
334
 
335
335
  If you would rather open the task yourself — to pin an external ticket key, or
336
336
  to hand a prepared task to an agent — the same command works typed in.
@@ -649,7 +649,7 @@ ww-agentic-workflows complete TASK-123 --role worker \
649
649
  - [architecture.md](documentation/architecture.md) describes internals, boundaries, state, and
650
650
  design decisions.
651
651
  - [agent-hooks.md](documentation/agent-hooks.md) covers the agent's own hooks
652
- (session-start, stop, interrupt): what they do, per-agent support, and
652
+ (the session-start line): what it does, per-agent support, and
653
653
  install/uninstall/show.
654
654
  - [examples.md](documentation/examples.md) is a set of complete, tested
655
655
  `ww.yaml` examples, one per control or behaviour.
@@ -285,14 +285,14 @@ one:
285
285
  - `--role manager` is the role driving the task; a worker performing a single
286
286
  assignment uses `--role worker`.
287
287
 
288
- A request no workflow fits still goes through ww once it changes files. The
289
- agent records it with `catchall`, a one-step workflow ww provides to every
290
- project, and otherwise works exactly as it would without ww. Questions and
291
- other read-only work never start a task. The agent first runs `./ww lookup`
292
- with the task you named, however you wrote it (`12345` finds `FOOBAR-12345`),
293
- and a task ww has never seen is only created after you confirm it in the
294
- agent's choice menu. Say `/noww` when you want the
295
- agent to leave ww out.
288
+ A request no workflow fits is direct work: the agent does it exactly as it
289
+ would without ww, then registers it with `./ww record <task> --summary "..."`,
290
+ and ww keeps the summary and the commits it finds for it. Questions and other
291
+ read-only work never start a task. The agent first runs `./ww lookup` with the
292
+ task you named, however you wrote it (`12345` finds `FOOBAR-12345`), and asks
293
+ you nothing unless the request clearly matches a workflow, in which case it
294
+ offers that workflow or "just do it, register afterwards". Say `/noww` when
295
+ you want the agent to leave ww out.
296
296
 
297
297
  If you would rather open the task yourself — to pin an external ticket key, or
298
298
  to hand a prepared task to an agent — the same command works typed in.
@@ -611,7 +611,7 @@ ww-agentic-workflows complete TASK-123 --role worker \
611
611
  - [architecture.md](documentation/architecture.md) describes internals, boundaries, state, and
612
612
  design decisions.
613
613
  - [agent-hooks.md](documentation/agent-hooks.md) covers the agent's own hooks
614
- (session-start, stop, interrupt): what they do, per-agent support, and
614
+ (the session-start line): what it does, per-agent support, and
615
615
  install/uninstall/show.
616
616
  - [examples.md](documentation/examples.md) is a set of complete, tested
617
617
  `ww.yaml` examples, one per control or behaviour.
@@ -3,8 +3,7 @@
3
3
  ww saves progress, runs handlers, and names the next role; it is only for
4
4
  development. Where ww is used by default, every file change goes through ww
5
5
  unless the user asks you not to. Reviews, questions, investigations and other
6
- read-only work never use ww, its skill or a task. When no workflow fits a change, run
7
- `./ww lookup [<task>] --agent <agent>` and follow it; it never creates a task without operator confirmation.
6
+ read-only work never use ww, its skill or a task.
8
7
 
9
8
  ## Start here
10
9
 
@@ -14,7 +13,7 @@ Before starting new work, run:
14
13
  ./ww discover
15
14
  ```
16
15
 
17
- It lists the project's workflows, modes, the start command, resume commands, and
16
+ It lists the project's workflows, modes, the start command, and
18
17
  whether to use ww unasked. If disabled, stop; if used only on request, use it only when
19
18
  the user asks for ww. Choose the matching workflow and keep its default modes
20
19
  unless the request matches another mode; ask only when the choice would
@@ -23,6 +22,17 @@ materially change the work.
23
22
  When a request names an external ticket, use that as the task ID. Omit the ID
24
23
  only when none is named or the workflow obtains it in its first step.
25
24
 
25
+ A request that names a ticket or clearly matches a workflow's description, and
26
+ is more than a small change: propose that workflow, and offer the alternative in
27
+ the same choice, "run `<workflow>`" / "just do it, register afterwards". Any
28
+ other request is direct work: do it as in a plain conversation, ask nothing,
29
+ then run `./ww record <task> --summary "..."` (`./ww lookup [<task>] --agent
30
+ <agent>` names the task). Judge each prompt on its own; a series of small
31
+ requests stays direct work, never a workflow. Ask only when genuinely ambiguous,
32
+ and never again on a task once the operator chose direct work. If `record`
33
+ fails or is forgotten, ww records the commits on the next manager
34
+ page (`instruction --role manager`): do not retry.
35
+
26
36
  To continue an existing task, run `./ww instruction <task-id> --role manager`;
27
37
  a worker resuming its assignment uses `--role worker`. Check status with
28
38
  `./ww status <task-id>`.
@@ -0,0 +1,135 @@
1
+ # Agent hooks
2
+
3
+ ww's instructions to agents are static, so a session needs one pointer to
4
+ find ww at all. Agent hooks are the agent's own hooks, installed with `ww hook`
5
+ — not the workflow hooks of `ww.yaml` (see
6
+ [Workflow hooks, variables, and transitions](features.md#workflow-hooks-variables-and-transitions)
7
+ in the feature reference), which run as part of a plan and can run
8
+ handlers, gate completion, or trigger a check. Agent hooks are gentle by
9
+ design: they add one line of context, and nothing they do ever blocks the
10
+ agent.
11
+
12
+ ww registers one hook, `session-start`, which runs when a session starts,
13
+ resumes, or is compacted. It prints a reminder that ww coordinates work here
14
+ (under `"enabled": "on_request"`: that ww is used only when the user asks for
15
+ it) and how to list its workflows. It lists no task: `discover` lists the
16
+ project's workflows, and the operator names the task to continue.
17
+
18
+ There is no pre-spawn hook yet: ww does not intercept an agent's own
19
+ subagent calls. `subagents: false` is enforced only through the step's
20
+ page today; see [Agent limitations](limitations.md#agent-limitations).
21
+
22
+ ## What `session-start` prints
23
+
24
+ What `session-start` prints stays in the agent's context for the whole
25
+ session, so it is one line:
26
+
27
+ ```text
28
+ This project coordinates work through ww: `./ww discover` lists its workflows.
29
+ ```
30
+
31
+ After a compaction it starts with a line before that one: "Context was
32
+ compacted; ww's task state is authoritative." Only the main session gets this
33
+ context: no hook is registered for a subagent's start, since a worker receives
34
+ its bootstrap command from the manager.
35
+
36
+ ## `stop` and `interrupt` are retired
37
+
38
+ Earlier versions of ww also registered `stop` and `interrupt` hooks, which
39
+ listed unfinished tasks, reminded an agent to close a step, and recorded
40
+ interrupted sessions. They are gone: a reminder written for one session
41
+ confused another, and nothing in them was needed to continue a task.
42
+
43
+ The events stay accepted so a hooks file written by an older ww keeps
44
+ working. `ww hook stop` and `ww hook interrupt` exit 0 with no output and
45
+ record nothing; the audit log notes the call. The `agent_hooks` keys
46
+ `check_unfinished` and `recent_days` in `ww.json` are still validated and
47
+ still accepted, and have no effect. Running `hook install` again replaces an
48
+ older registration with the one `session-start` entry, and `hook uninstall`
49
+ removes every ww entry, whichever events it registered.
50
+
51
+ ## Agents and their files
52
+
53
+ | Agent | Project file | Native event | Local file |
54
+ | --- | --- | --- | --- |
55
+ | Claude Code | `.claude/settings.json` | `SessionStart` | `.claude/settings.local.json` |
56
+ | Codex | `.codex/hooks.json` | `SessionStart` | none; user file `~/.codex/hooks.json` |
57
+ | Cursor | `.cursor/hooks.json` | `sessionStart` | none; user file `~/.cursor/hooks.json` |
58
+ | Antigravity | `.agents/hooks.json`, group `ww` | `PreInvocation` | none; user file `~/.gemini/config/hooks.json` |
59
+
60
+ Claude Code's `SessionStart` has no matcher, so it fires for every source,
61
+ compaction included. Antigravity has no session-start event, so ww answers
62
+ only its first pre-invocation of a conversation, as an ephemeral message that
63
+ never accumulates. Codex loads project hooks only once the project's `.codex/`
64
+ layer is trusted: review them with `/hooks` in Codex.
65
+
66
+ These per-agent gaps (no session-start event, a trust gate) are permanent
67
+ differences between agents, not bugs; see
68
+ [Agent limitations](limitations.md#agent-limitations) for the summary.
69
+
70
+ ## Install, remove, and show
71
+
72
+ ```console
73
+ ww-agentic-workflows hook install --agent claudecode
74
+ ww-agentic-workflows hook uninstall --agent codex
75
+ ww-agentic-workflows hook show --agent cursor
76
+ ww-agentic-workflows hook install --agent claudecode --local
77
+ ```
78
+
79
+ `install` merges ww's entry into whatever the file already holds and leaves
80
+ every other entry alone. ww recognises its own entries by their command, so a
81
+ second `install` changes nothing and `uninstall` removes exactly what ww added,
82
+ including the `stop` and `interrupt` entries an older ww registered. `show`
83
+ prints the file and the exact snippet, that is, what ww registers, for a
84
+ machine or an agent where `install` cannot run. A file that is not valid JSON,
85
+ or cannot be written, makes `install` fail with the path and the full snippet
86
+ to add by hand.
87
+
88
+ `--local` writes the agent's project file kept out of version control, so the
89
+ hooks stay one person's choice. Only Claude Code has one,
90
+ `.claude/settings.local.json`; for the other agents `--local` fails and names
91
+ their user-level file, which applies to every project on the machine. Without
92
+ `--local` the hooks go into the shared project file, which is usually committed,
93
+ so everyone who clones the project gets them. When ww's hooks sit in both of
94
+ Claude Code's files every hook would run twice, so `install` and `show` print a
95
+ notice with the command that removes one copy.
96
+
97
+ The registered command calls the project's tracked `./ww` launcher: through
98
+ `"$CLAUDE_PROJECT_DIR"` for Claude Code, from the project root for Cursor, and
99
+ from the repository's top level (`git rev-parse --show-toplevel`) for Codex and
100
+ Antigravity. The launcher resolves the durable root through the shared Git
101
+ directory, so a session in a task worktree reaches the same state; the launcher
102
+ must therefore be tracked for worktree sessions.
103
+
104
+ The runtime form, `ww hook session-start|stop|interrupt --agent <agent>`, is
105
+ what the agents call; it reads the agent's JSON payload on stdin.
106
+
107
+ ## When a hook fails or runs too often
108
+
109
+ A hook never breaks the agent. On any error, a bad argument, or outside a ww
110
+ root, it exits 0 with no output: some agents read exit code 2 as "continue", and
111
+ an unexpected message would enter the agent's context. The worst outcome is a
112
+ lost hint. When the command cannot start at all, for example a missing
113
+ launcher or an untrusted Codex hook, the agent shows its own non-blocking hook
114
+ error. A hook that times out is killed by the agent, which carries on.
115
+
116
+ Running more often than needed is harmless. Antigravity calls its
117
+ pre-invocation hook before every model call; only the first one returns
118
+ context.
119
+
120
+ Every hook call is written to the audit log, `.ww/executions.jsonl`, with the
121
+ event, the agent, and ww's decision, so a session can be followed there:
122
+
123
+ ```json
124
+ {"command": "hook", "hook_event": "session-start", "hook_agent": "claudecode", "hook_decision": "context", "outcome": "ok"}
125
+ ```
126
+
127
+ A failure is logged with `outcome: error` and the exception type. The agent's
128
+ payload is never logged.
129
+
130
+ ## See also
131
+
132
+ - [Agent limitations](limitations.md#agent-limitations): per-agent hook
133
+ gaps, nested subagents, and why a worker cannot talk to the operator.
134
+ - [architecture.md](architecture.md#agent-hooks) for how the hook answers
135
+ are computed internally.
@@ -29,7 +29,7 @@ produce those definitions directly through the same loader contract. Shared
29
29
  cross-definition rules live in `../src/ww/workflow_validation.py`, so notation
30
30
  parsers do not acquire different workflow semantics. Validation is also where
31
31
  the built-in workflows join the configured ones: `../src/ww/builtin_workflows.py`
32
- parses the YAML files shipped in `../src/ww/assets/workflows/` (`catchall`, `scriptize.yaml` with `ww-scriptize-rules`, and
32
+ parses the YAML files shipped in `../src/ww/assets/workflows/` (`scriptize.yaml` with `ww-scriptize-rules`, and
33
33
  `onboarding.yaml` with ww's learning and setup workflows) with the same frontend, once per process, and adds each workflow the
34
34
  configuration does not define itself and `../ww.json` does not
35
35
  switch off, with the documents and modes its file declares, dropping a
@@ -43,11 +43,17 @@ it. The scriptizing workflow declares its own Git lifecycle hooks to isolate
43
43
  tool installs and configuration changes from the operator's current branch.
44
44
  `ww/git` always branches it from the required default base and follows its
45
45
  worktree settings; built-in composition needs no project lane setting.
46
- `lookup` (`../src/ww/cli/lookup.py`) is the catch-all's entry
47
- point: `../src/ww/task_references.py` maps what the operator called a task onto
48
- the task format and the IDs the storage port lists, and the command answers
49
- with one next step, asking the operator through the agent's choice menu
50
- (`../src/ww/agents.py`) before a new task is created. `inherit` is resolved by
46
+ `lookup` (`../src/ww/cli/lookup.py`) is the entry point of direct work:
47
+ `../src/ww/task_references.py` maps what the operator called a task onto the
48
+ task format and the IDs the storage port lists, and the command answers with
49
+ one next step, continuing an open run or naming the `record` command, and
50
+ asking the operator through the agent's choice menu (`../src/ww/agents.py`)
51
+ only when the reference matches several tasks. `../src/ww/direct_work.py` holds
52
+ the direct-work entries kept in each task's `direct-work.json` (a
53
+ `TaskDirectWorkStorage` port of the storage adapters) and finds the commits for
54
+ them from the ww/git records and `git log`; `WorkflowService.record_direct_work`
55
+ backs `record`, and `reconcile_direct_work` runs before a manager's
56
+ `instruction` page. `inherit` is resolved by
51
57
  the YAML frontend itself, once every workflow is parsed: the heir becomes a
52
58
  complete copy with its own settings on top, and global hooks filtered to a
53
59
  workflow are extended to its heirs, so validation, the compiler, `plan`, and
@@ -954,7 +960,8 @@ builds from the saved state (`instructions/handoff.py`): the items performed
954
960
  with their outcomes, artifacts, checks, fix rounds and change set, plus the
955
961
  worker's capped `--summary`. The service takes the open
956
962
  assignment's items before a worker command runs, so the block can still name
957
- them after the command closed the assignment. A worker's `complete` or `loop`
963
+ them after the command closed the assignment. `WorkflowService` builds the block in one method, used by both the completion
964
+ path and `ww handoff`, which reprints it for an ended assignment from the saved records. A worker's `complete` or `loop`
958
965
  on a `role: manager` item is refused; the manager completes it with `--role
959
966
  manager`.
960
967
  A step's `role` says who performs it, and it is resolved along the same chain
@@ -1371,9 +1378,7 @@ waiting while the child it could not launch has no run.
1371
1378
  `complete --role manager` is composed in the CLI: the policy (`manager_continues_itself`)
1372
1379
  reads the page the completion returned and, when the next step is the manager's own,
1373
1380
  the command calls `next` as the manager would; the service's `complete` never
1374
- dispatches, so every other caller keeps its single-step contract. The stop hook
1375
- treats a task with an open child below it, or a delegated step in progress, as a
1376
- manager that is waiting (`OpenTask.waiting_on_another`). `init`'s opt-in Claude Code
1381
+ dispatches, so every other caller keeps its single-step contract. `init`'s opt-in Claude Code
1377
1382
  permission rules live in `ww.claude_permissions` (merge, never clobber, keep ignored).
1378
1383
 
1379
1384
  Amendments to a task's requirements live behind their own storage port
@@ -1410,6 +1415,15 @@ extension namespace values, for agent pages, automatic handlers, and the
1410
1415
  reuses the loop exit: `finish_loop_exit` skips the remaining per-child items
1411
1416
  and the drain marks the children that never started `skipped`.
1412
1417
 
1418
+ `add-child` is also accepted while a per-child stage is the active item. The
1419
+ guard in `WorkflowService.add_child` refuses once the cursor has left the
1420
+ per-child items. Otherwise the new child is appended and
1421
+ `append_child_lifecycle` (in `../src/ww/transitions.py`) expands one more
1422
+ lifecycle from `snapshot.template_plan` through `_expand_templates`, with no
1423
+ replaced items and placed after the last planned child's last item. The child
1424
+ record and the grown plan are committed in the same task lock, so a child is
1425
+ never recorded without its stages.
1426
+
1413
1427
  The scope is deliberately one level: a child workflow cannot itself declare
1414
1428
  `children`. When the last child completes, ww completes
1415
1429
  the parent coordinator and resumes the parent's ordinary completion lifecycle,
@@ -1604,13 +1618,9 @@ completion is refused until it was ended. How the operator is asked is the
1604
1618
  agent's business; the choice mechanisms table in `agents.py` is core knowledge
1605
1619
  of what each integration offers, not an extension point.
1606
1620
 
1607
- The `interrupt` hook is the record's safety net. For a step still in
1608
- conversation, `hooks/transcripts.py` reads the session's own transcript
1609
- (Claude Code's session JSONL, Codex's rollout JSONL), keeps the two sides'
1610
- messages since the attempt started, and the hook appends them through
1611
- `InteractionLog` under speakers marked `(recovered)`. It writes no task state
1612
- and takes no task lock: the session that held the conversation is the one
1613
- ending, and the step record's entry count stays the agent's.
1621
+ A session that ends mid-conversation loses what was not yet recorded; ww does
1622
+ not recover it from the agent's transcript, and the next session asks the
1623
+ operator where they were.
1614
1624
 
1615
1625
  The operator page is an extra on top of that, not part of it. The core knows
1616
1626
  it by one flag, `interactive: page` on a per-item stage (`ui` on the
@@ -1642,24 +1652,32 @@ the operator left, and only the operator's own words lift it.
1642
1652
  ## Agent hooks
1643
1653
 
1644
1654
  See [documentation/agent-hooks.md](agent-hooks.md) for the user-facing
1645
- behaviour (events, per-agent table, install/uninstall/show, interrupted
1646
- tasks); this section is the internal design behind it.
1647
-
1648
- Agent hooks exist to carry state the static instructions cannot: which task
1649
- is unfinished when a session starts or compacts, and whether it is ending with
1650
- an agent-owned step still open. Every decision lives in ww. `ww.open_work`
1651
- answers from the persisted runs alone which tasks are open and whether an
1652
- agent step is dispatched and in progress, reusing the control policy's
1653
- `operator_reason` so a task waiting for input or the operator never counts; it
1654
- renders nothing, compiles nothing, and loads no extension, which keeps a hook
1655
- fast. It returns `OpenWork`: the open tasks and, as `UnreadableTask`, every
1656
- task whose record raised `StateError` (both storage adapters wrap a bad record
1657
- that way), so one broken task never hides the others. The interruption scan in
1658
- `ww.hooks.records` skips such a task, and `discover` lists what `open_work`
1659
- reports; only commands addressing such a task still fail. `ww.hooks.runtime` turns that into the three answers, and the adapters in
1660
- `ww.hooks.agents` only translate: each reads its agent's payload into one
1661
- neutral record and renders ww's answer in the agent's reply shape. A new agent
1662
- is one more adapter.
1655
+ behaviour (the session-start line, per-agent table, install/uninstall/show);
1656
+ this section is the internal design behind it.
1657
+
1658
+ The hooks stay small on purpose. ww once listed unfinished tasks at session
1659
+ start, reminded an agent to close a step when it stopped, recorded interrupted
1660
+ sessions, and recovered conversations from transcripts. The result confused
1661
+ sessions that had nothing to do with the task, so only the one line a session
1662
+ needs to find ww remains. `ww.hooks.runtime` answers it: `session-start`
1663
+ prints `session_context` from `ww.hooks.notices`, and every other event
1664
+ answers nothing. The adapters in `ww.hooks.agents` only translate: each reads
1665
+ its agent's payload into one neutral record and renders ww's answer in the
1666
+ agent's reply shape. A new agent is one more adapter. The three events, the
1667
+ payload fields (including the ones nothing reads now) and the `agent_hooks`
1668
+ keys stay accepted, so a hooks file or `ww.json` written by an older ww keeps
1669
+ working; `stop` and `interrupt` calls from an older installation exit 0 with no
1670
+ output and write no state. ww keeps no hook record per task: `reset` only
1671
+ removes the `interrupted.json` and `stop-reminders.json` an older version
1672
+ may have left, so they cannot keep the task directory alive.
1673
+
1674
+ `ww.open_work` is reduced to what the operator surface `discover` needs: it
1675
+ reads every task's record and returns, as `UnreadableTask`, the ones that
1676
+ raised `StateError` (both storage adapters wrap a bad record that way), so a
1677
+ broken task is named instead of hidden; only commands addressing such a task
1678
+ still fail. It is not used by the hooks, and no command lists unfinished tasks:
1679
+ the operator names the task, and `lookup`'s "continue" outcome and
1680
+ `instruction` find the open run.
1663
1681
 
1664
1682
  The runtime form is intercepted before normal command parsing. It always
1665
1683
  exits 0 without stderr, because exit code 2 means "continue" to some agents'
@@ -1667,32 +1685,9 @@ stop hooks and stray text would enter the agent's context, and it skips the
1667
1685
  update notice. It still writes one audit record per call with ww's decision,
1668
1686
  never the payload, so a session can be followed without the agent's text.
1669
1687
 
1670
- The stop hook is a one-time reminder rather than a block. A reminder is
1671
- recorded per task, run, item, and attempt in `stop-reminders.json` beside the
1672
- interaction log, and the check and the record happen under a lock of their own:
1673
- agents run matching hooks in parallel, and the task lock would stall behind a
1674
- long-running command. An agent's own loop guard is honoured as well.
1675
-
1676
- Stop and interrupt pick the tasks a session concerns in one function,
1677
- `ww.open_work.tasks_for_session`. A workspace selects a task only when it is not
1678
- the root: the root holds every task's state, and a worktree-less task works
1679
- there, so matching it would tie every root session to every such task.
1680
- Otherwise the run's recorded agent must be the hook's agent, because a session
1681
- has no business closing another integration's step. The stop hook further
1682
- separates a manager from its workers: `OpenTask.delegated` marks a step an
1683
- `auto` run hands to a worker, and only a stop the adapter reports as a
1684
- worker's (`HookPayload.from_worker`) reminds about it. Messages name work
1685
- through `OpenTask.label`, which names a hook item by itself and its step,
1686
- since a hook records the step it is attached to. The
1687
- interruption record, `interrupted.json`, is cleared lazily in the one place
1688
- that reads it, once that attempt completed, failed, or was superseded, never
1689
- because a notice showed it, so compaction between reading and acting cannot
1690
- lose it. Listing interruptions scans the markers instead of keeping an index
1691
- that could drift. Both records belong to the task, and `reset` removes them
1692
- before the storage adapter removes the task directory.
1693
-
1694
1688
  Installation writes only the agent's project file, or with `--local` the one it
1695
- keeps out of version control, merging ww's entries and recognising them by
1689
+ keeps out of version control, merging ww's one `session-start` entry and
1690
+ recognising ww's entries, including older `stop` and `interrupt` ones, by
1696
1691
  their command. `init` offers it per agent and treats a failure as a manual
1697
1692
  action, never as an init failure.
1698
1693