ww-agentic-workflows 1.0.0.dev5__tar.gz → 1.0.0.dev7__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.
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/CHANGELOG.md +13 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/PKG-INFO +10 -1
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/README.md +9 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/WW_AGENT_INSTRUCTIONS.md +19 -19
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/documentation/architecture.md +34 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/documentation/features.md +100 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/documentation/specification.md +14 -2
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/pyproject.toml +1 -1
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/assets/agent_instructions.md +19 -19
- ww_agentic_workflows-1.0.0.dev7/src/ww/assets/ww-debug-report_skill.md +34 -0
- ww_agentic_workflows-1.0.0.dev7/src/ww/assets/ww-workflow-feedback_skill.md +38 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/assets/ww_skill.md +8 -2
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/cli/discover.py +43 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/cli/main.py +102 -1
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/cli/parser.py +33 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/cli/prompts.py +9 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/defaults.py +9 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/plan/compiler.py +10 -2
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/project_config.py +68 -0
- ww_agentic_workflows-1.0.0.dev7/src/ww/run_reports.py +649 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/service.py +66 -9
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_cli.py +2 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_handoff_block.py +44 -1
- ww_agentic_workflows-1.0.0.dev7/tests/integration/test_run_report_commands.py +291 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_project_config.py +38 -0
- ww_agentic_workflows-1.0.0.dev7/tests/unit/test_run_reports.py +388 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/.claude/settings.json +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/.claude/skills/noww/SKILL.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/.claude/skills/update-architecture-documentation/SKILL.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/.claude/skills/ww/SKILL.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/.codex/hooks.json +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/.codex/skills/noww/SKILL.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/.codex/skills/update-architecture-documentation/SKILL.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/.codex/skills/ww/SKILL.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/.git-blame-ignore-revs +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/.githooks/pre-commit +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/.github/workflows/dev-publish.yml +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/.github/workflows/release-gates.yml +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/.gitignore +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/AGENTS.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/CLAUDE.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/CODE_OF_CONDUCT.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/CONTRIBUTING.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/LICENSE +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/SECURITY.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/documentation/agent-hooks.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/documentation/development-releases.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/documentation/examples.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/documentation/limitations.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/documentation/python-agent-rules.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/documentation/todo.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/ext/ww/git/extension.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/scripts/check_distribution.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/scripts/check_release_gates.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/scripts/demo.sh +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/scripts/ensure_spdx_license.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/scripts/measure_pages.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/scripts/run_workflow_dummy.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/scripts/set_dev_version.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/scripts/test +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/__init__.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/action_execution.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/actions/__init__.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/actions/command.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/actions/contracts.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/actions/extension.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/actions/mcp.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/actions/prompt.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/actions/skill.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/actions/slash_command.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/agents.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/amendments.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/artifacts.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/assessments.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/assets/__init__.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/assets/noww_skill.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/assets/workflows/onboarding.yaml +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/assets/workflows/scriptize.yaml +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/assets/ww-automate_skill.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/assets/ww-deduce-feedback_skill.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/assets/ww-feedback-rules_skill.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/assets/ww-learn-project_skill.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/assets/ww-refresh_skill.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/assets/ww-rule_skill.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/assets/ww-rules-from-artifacts_skill.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/assets/ww-scriptize_skill.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/assets/ww-setup_skill.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/assets/ww-solve_skill.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/assets/ww-suggest_skill.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/assets/ww-wizard_skill.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/assignments.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/bootstrap.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/builtin_workflows.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/changes.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/child_coordination.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/children.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/claude_permissions.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/cli/__init__.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/cli/__main__.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/cli/audit.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/cli/catalogs.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/cli/initialization.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/cli/lookup.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/cli/updates.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/completion_artifacts.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/completion_inputs.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/config/__init__.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/config/actions.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/config/composition.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/config/rules.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/config/steps.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/config/values.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/config_files.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/config_writes.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/contracts.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/control.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/design_docs.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/direct_work.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/discovery.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/documents.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/errors.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/executable.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/execution_models/__init__.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/execution_models/construction.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/execution_models/decoding.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/execution_models/plan_codec.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/execution_models/records.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/execution_models/runs.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/extensions/__init__.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/extensions/api.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/extensions/registry.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/extensions/store.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/feedback.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/handler_repairs.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/hooks/__init__.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/hooks/agents.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/hooks/install.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/hooks/notices.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/hooks/runtime.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/inspect.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/instructions/__init__.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/instructions/builder.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/instructions/commands.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/instructions/handoff.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/instructions/models.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/instructions/policy.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/instructions/text.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/interactions.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/interpolation.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/item_passes.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/items.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/locking.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/metadata_publication.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/onboarding.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/open_work.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/operations.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/operator_ui/__init__.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/operator_ui/page.html +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/operator_ui/server.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/operator_ui/session.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/operator_ui/sheet.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/operator_ui/view.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/output.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/output_adapters/__init__.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/output_adapters/base.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/output_adapters/json_adapter.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/output_adapters/markdown.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/output_adapters/rule_pages.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/output_adapters/terminal.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/package_updates.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/plan/__init__.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/plan/actions.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/plan/constructs.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/plan/models.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/recovery.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/replanning.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/results.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/rule_checks.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/rule_conversion.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/rule_disputes.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/rule_store.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/rule_verification.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/rule_views.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/rule_writes.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/run_coordination.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/runtimes.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/setup_apply.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/step_values.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/storage.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/storage_adapters/__init__.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/storage_adapters/base.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/storage_adapters/filesystem.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/storage_adapters/memory.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/storage_adapters/project_metadata.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/storage_adapters/task_document.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/task_ids.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/task_references.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/transitions.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/updates.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/upgrade.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/validation.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/variables.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/workflow_config.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/workflow_update.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/workflow_validation.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/workspace.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/action_contract_helpers.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/config_helpers.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/conftest.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/example_documents.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/fixtures/packaged_extension/ww_test_packaged_extension.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/golden/pages/completion.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/golden/pages/fix-required.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/golden/pages/interactive.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/golden/pages/item-stage.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/golden/pages/loop-body.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/golden/pages/loop-continue.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/golden/pages/manager-dispatch.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/golden/pages/operator-stop.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/golden/pages/step-auto-worker.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/golden/pages/step-rules.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/golden/pages/step-single.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/golden/pages/values-and-metadata.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/golden/pages/verification.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/golden/pages/worker-bootstrap.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/golden/pages/worker-handoff.md +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_adjustments.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_artifact_from_containers.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_assessment_outcomes.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_assignment_tokens.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_auto_retries.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_automatic_handler_groups.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_automatic_modes.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_awaiting_operator.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_bootstrap_task_id.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_builtin_workflows.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_child_identity.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_child_launch_settings.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_child_stages.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_child_start_action.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_child_start_guards.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_child_tasks.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_children_added_mid_run.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_command_metadata.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_complete_dispatch.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_concurrency.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_config_files.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_configuration_authority.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_direct_work.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_discover.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_documents.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_example_behaviour.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_executable.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_extension_execution.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_feedback_commands.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_git_extension.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_git_variables.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_golden_pages.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_handler_repairs.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_hooks.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_init_force.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_init_permissions.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_inspect.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_interactive.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_item_assignment.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_item_fields.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_item_pass_restarts.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_item_pass_runs.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_item_reply_reports.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_item_runtime_values.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_items.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_local_step_pages.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_loops.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_memory_workflow_service.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_metadata_lists.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_onboarding.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_onboarding_workflows.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_pack_scenarios.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_packaged_extension.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_page_gates.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_plan_execution.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_projects.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_recommended_workflow.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_recovery_guards.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_replanning.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_requirements_pages.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_requirements_per_session.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_restart.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_rule_commands.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_rule_conversion.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_rule_verification_flow.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_rule_write_commands.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_rules_and_checks.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_scriptize_workflow.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_setup_apply.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_setup_update.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_setup_verification.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_shared_items.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_stale_task_records.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_state_unknown_fields.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_system_scenarios.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_update_notice.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_upgrade.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_workdir.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_worker_bootstrap_text.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_worker_handoff.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/integration/test_workflow_service.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/page_catalog.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/plan_helpers.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/test_dev_version.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_action_contracts.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_action_example.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_action_phase_contexts.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_artifacts.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_assignments.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_beta_notice.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_builtin_actions.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_changes.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_checklist_prompt.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_child_stages_config.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_children_config.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_cli_prompts.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_completion_inputs.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_completion_selection.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_config.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_config_composition.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_config_writes.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_delegation_requests.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_design_docs.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_discovery.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_examples_doc.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_execution_hints.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_extensions.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_feedback.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_handler_failure_report.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_hook_agents.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_instruction_commands.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_interactions.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_item_config.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_item_passes.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_item_validation.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_locking.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_markdown_output.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_modes.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_operator_ui.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_package_updates.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_plan.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_project_metadata_storage_adapters.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_records.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_rule_disputes.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_rule_store.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_rule_verification.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_rule_writes.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_rules.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_runtimes.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_scripts_test_bootstrap.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_step_role.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_storage.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_task_document.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_task_ids.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_task_references.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_task_storage_adapters.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_transitions.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_updates.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_validation.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_variables.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_workflow_inheritance.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_workflow_validation.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/unit/test_workspace.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/tests/workflow_helpers.py +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/ww.json +0 -0
- {ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/ww.yaml +0 -0
|
@@ -9,8 +9,21 @@ The committed package version stays at 0.1.0; development snapshots from `dev`
|
|
|
9
9
|
use `1.0.0.devN`. What may change between two pulls, and what ww does not promise
|
|
10
10
|
yet, is in [documentation/limitations.md](documentation/limitations.md).
|
|
11
11
|
|
|
12
|
+
## 2026-10-06
|
|
13
|
+
|
|
14
|
+
- Added: three `ww.json` switches, off by default: `debug.collect` keeps a local record per run of how ww itself
|
|
15
|
+
behaved (`.ww/debug/`), `debug.report` makes `discover` offer to publish them as GitHub issues through the new
|
|
16
|
+
`debug report` command, each shown and confirmed first, and `feedback.collect` keeps a local record of how the
|
|
17
|
+
workflow was composed (`.ww/feedback/`), read with `workflow-feedback`; skills `ww-debug-report` and
|
|
18
|
+
`ww-workflow-feedback` cover the agent side. `4f11e89`
|
|
19
|
+
|
|
12
20
|
## 2026-10-05
|
|
13
21
|
|
|
22
|
+
- Fixed: in the `auto` runtime, a worker's `loop --continue` below the loop's limit left the task stuck: the
|
|
23
|
+
continue ended the assignment yet opened the next round's first step for a worker that no longer held a
|
|
24
|
+
token, so the worker's next command was refused and the manager's `next` reported a step in progress. The
|
|
25
|
+
continue now ends the assignment with its handoff block, and the manager's `next` dispatches the first step
|
|
26
|
+
of the next round as a new assignment.
|
|
14
27
|
- Removed: the session-start task list, stop reminders, interruption records and transcript recovery, and the
|
|
15
28
|
`interrupted` command. Hooks, events and `agent_hooks` keys stay accepted. `5414a34`
|
|
16
29
|
- Added: `add-child` is accepted while a per-child stage of a roadmap-style parent is active, not only while the
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: ww-agentic-workflows
|
|
3
|
-
Version: 1.0.0.
|
|
3
|
+
Version: 1.0.0.dev7
|
|
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
|
|
@@ -399,6 +399,15 @@ default; set `"feedback_learning": false` in `ww.json` to disable it. Invoke
|
|
|
399
399
|
stale points. See [feedback learning](documentation/features.md#learning-from-operator-feedback)
|
|
400
400
|
for commands and examples.
|
|
401
401
|
|
|
402
|
+
Two further switches in `ww.json`, off by default, keep local run reports:
|
|
403
|
+
`debug.collect` asks the agent at the end of each run how ww itself behaved and
|
|
404
|
+
keeps the answer under `.ww/debug/`, and `feedback.collect` asks how well the
|
|
405
|
+
workflow was composed, kept under `.ww/feedback/`. Nothing leaves the machine
|
|
406
|
+
by itself: `./ww debug report` publishes a debug record to ww's GitHub issues
|
|
407
|
+
only after showing it and asking, and the `ww-workflow-feedback` skill reviews
|
|
408
|
+
the feedback with you. See [collecting debug info and workflow
|
|
409
|
+
feedback](documentation/features.md#collecting-debug-info-and-workflow-feedback).
|
|
410
|
+
|
|
402
411
|
### Runtimes: who actually performs a step
|
|
403
412
|
|
|
404
413
|
Every task runs manager and worker responsibilities — the manager dispatches
|
|
@@ -361,6 +361,15 @@ default; set `"feedback_learning": false` in `ww.json` to disable it. Invoke
|
|
|
361
361
|
stale points. See [feedback learning](documentation/features.md#learning-from-operator-feedback)
|
|
362
362
|
for commands and examples.
|
|
363
363
|
|
|
364
|
+
Two further switches in `ww.json`, off by default, keep local run reports:
|
|
365
|
+
`debug.collect` asks the agent at the end of each run how ww itself behaved and
|
|
366
|
+
keeps the answer under `.ww/debug/`, and `feedback.collect` asks how well the
|
|
367
|
+
workflow was composed, kept under `.ww/feedback/`. Nothing leaves the machine
|
|
368
|
+
by itself: `./ww debug report` publishes a debug record to ww's GitHub issues
|
|
369
|
+
only after showing it and asking, and the `ww-workflow-feedback` skill reviews
|
|
370
|
+
the feedback with you. See [collecting debug info and workflow
|
|
371
|
+
feedback](documentation/features.md#collecting-debug-info-and-workflow-feedback).
|
|
372
|
+
|
|
364
373
|
### Runtimes: who actually performs a step
|
|
365
374
|
|
|
366
375
|
Every task runs manager and worker responsibilities — the manager dispatches
|
{ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/WW_AGENT_INSTRUCTIONS.md
RENAMED
|
@@ -13,14 +13,12 @@ Before starting new work, run:
|
|
|
13
13
|
./ww discover
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
It lists the
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
When a request names an external ticket, use that as the task ID. Omit the ID
|
|
23
|
-
only when none is named or the workflow obtains it in its first step.
|
|
16
|
+
It lists the workflows, modes, the start command, and whether to use ww
|
|
17
|
+
unasked. If disabled, stop; if used only on request, use it only when the user
|
|
18
|
+
asks for ww. Choose the matching workflow and keep its default modes unless the
|
|
19
|
+
request matches another mode; ask only when the choice would materially change
|
|
20
|
+
the work. When a request names an external ticket, use that as the task ID.
|
|
21
|
+
Omit the ID only when none is named or the workflow obtains it in its first step.
|
|
24
22
|
|
|
25
23
|
A request that names a ticket or clearly matches a workflow's description, and
|
|
26
24
|
is more than a small change: propose that workflow, and offer the alternative in
|
|
@@ -33,9 +31,8 @@ and never again on a task once the operator chose direct work. If `record`
|
|
|
33
31
|
fails or is forgotten, ww records the commits on the next manager
|
|
34
32
|
page (`instruction --role manager`): do not retry.
|
|
35
33
|
|
|
36
|
-
To continue
|
|
37
|
-
|
|
38
|
-
`./ww status <task-id>`.
|
|
34
|
+
To continue a task, run `./ww instruction <task-id> --role manager` (a resuming
|
|
35
|
+
worker uses `--role worker`); `./ww status <task-id>` checks it.
|
|
39
36
|
|
|
40
37
|
## Rules
|
|
41
38
|
- Follow each authoritative ww page: replace placeholders and supply requested
|
|
@@ -43,17 +40,20 @@ a worker resuming its assignment uses `--role worker`. Check status with
|
|
|
43
40
|
- Perform only agent-owned work. Never run or bypass a ww handler, edit ww state, or read `ww.yaml` or ww source to infer the next step.
|
|
44
41
|
- For handler repair, fix the cause and complete with an artifact; ww retries it. In `auto`, the manager dispatches repairs with `next`.
|
|
45
42
|
- On an `interactive: true` step, converse in the operator session and finish
|
|
46
|
-
on clear contextual intent; ask if it is ambiguous
|
|
47
|
-
pause. Record both sides and end the interaction before completing it.
|
|
48
|
-
- Use a host choice tool when available, following its contract; otherwise
|
|
49
|
-
|
|
43
|
+
on clear contextual intent; ask if it is ambiguous ("done for today" means
|
|
44
|
+
pause). Record both sides and end the interaction before completing it.
|
|
45
|
+
- Use a host choice tool when available, following its contract; otherwise a
|
|
46
|
+
numbered chat list. Keep async choices pending until an answer arrives;
|
|
50
47
|
timeout, dismissal, and preselection are not answers.
|
|
51
48
|
- On nonzero exit, read the full response. For "Fix required", repair and complete again
|
|
52
49
|
(`./ww check <task-id>` previews checks) or `./ww dispute`; record impossible work
|
|
53
50
|
with `./ww fail` and the page's role/assignment. On `awaiting_operator`, stop and
|
|
54
51
|
report the reason and exact error; run only the operator's chosen recovery option;
|
|
55
52
|
never reset unasked. A standing operator authorization for routine repairs (dependency
|
|
56
|
-
installation, formatting, retries) covers such stops
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
53
|
+
installation, formatting, retries) covers such stops; ask only for a material decision.
|
|
54
|
+
- Relay feedback-deduction suggestions after completion; rule approval and
|
|
55
|
+
pruning are separate follow-ups.
|
|
56
|
+
- When `discover` lists debug reports to send, ask the operator once (y/n); on
|
|
57
|
+
yes use the `ww-debug-report` skill, which confirms each report. When a start
|
|
58
|
+
page says ww collects debug or feedback info, tell the operator once, then
|
|
59
|
+
never mention it again.
|
{ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/documentation/architecture.md
RENAMED
|
@@ -1887,3 +1887,37 @@ explicit `feedback prune` command used during the separate `ww-feedback-rules`
|
|
|
1887
1887
|
review; it is never a side effect of workflow completion or deduction. Review
|
|
1888
1888
|
judgement may retain stale candidates using their IDs. Rule installation still
|
|
1889
1889
|
requires approval of concrete proposals through validated existing rule commands.
|
|
1890
|
+
|
|
1891
|
+
## Run reports: debug info and workflow feedback
|
|
1892
|
+
|
|
1893
|
+
`run_reports` holds the two optional collections `ww.json` switches on
|
|
1894
|
+
(`debug.collect`, `feedback.collect`) and the reporting of debug records
|
|
1895
|
+
(`debug.report`, `ww debug report`). Each kind is a `ReportKind`: its
|
|
1896
|
+
directory under the runtime path, the two `ProvidedVariable`s it adds to the
|
|
1897
|
+
built-in `update-workflow-summary` handler and the sentence it adds to that
|
|
1898
|
+
handler's prompt. The plan compiler reads the kinds from the project settings
|
|
1899
|
+
when it compiles the summary handler, so a run asks for exactly what was
|
|
1900
|
+
switched on when it started, and the saved plan keeps asking for it whatever
|
|
1901
|
+
the setting says later. No plan item is added: collection rides on the
|
|
1902
|
+
summary step's completion window.
|
|
1903
|
+
|
|
1904
|
+
The service validates the arrays before anything is saved (`complete` on the
|
|
1905
|
+
summary item parses each JSON array and refuses a malformed one), writes the
|
|
1906
|
+
records from the run's `workflow_values` right after the completing commit,
|
|
1907
|
+
and adds the one-time collection notice to the first page of every start
|
|
1908
|
+
(`notices`, beside the rules notice). A record that cannot be written is
|
|
1909
|
+
dropped rather than failing a run that is already committed. The workflow
|
|
1910
|
+
definition in a record is the entry of the composed `ww.yaml` (or of a
|
|
1911
|
+
built-in file), read through `compose_configuration`, not the compiled plan.
|
|
1912
|
+
|
|
1913
|
+
`RunReportStore` keeps one JSON file per run under `.ww/debug/` or
|
|
1914
|
+
`.ww/feedback/`, written atomically under the project's lock manager, with a
|
|
1915
|
+
`reported` field ww fills when a debug record was published. The CLI's
|
|
1916
|
+
`debug` and `workflow-feedback` commands read these stores; `discover`
|
|
1917
|
+
counts unreported debug records and offers them only while `debug.report` is
|
|
1918
|
+
on. Publishing goes through `report_records`, which takes the confirmation,
|
|
1919
|
+
browser and `gh` callables as parameters, so the CLI wires the terminal
|
|
1920
|
+
prompts (`confirm_operator`, `--yes`) and `webbrowser.open` while tests pass
|
|
1921
|
+
stubs. `gh` is used when it is installed and `gh auth status` succeeds;
|
|
1922
|
+
otherwise the prefilled new-issue URL is opened and the operator submits it.
|
|
1923
|
+
ww never holds a credential of its own.
|
{ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/documentation/features.md
RENAMED
|
@@ -45,6 +45,9 @@ An installation carries the same-version copies of all three: read them with
|
|
|
45
45
|
automation.
|
|
46
46
|
- Atomic persistence, task-level concurrency control, interruption recovery,
|
|
47
47
|
execution logs, and lock cleanup.
|
|
48
|
+
- Optional local run reports, off by default: ww's own assessment of each run
|
|
49
|
+
(`debug.collect`), published to ww's GitHub issues only on the operator's
|
|
50
|
+
confirmation, and feedback on the workflow's composition (`feedback.collect`).
|
|
48
51
|
|
|
49
52
|
## Designing a workflow
|
|
50
53
|
|
|
@@ -3310,6 +3313,10 @@ ww-agentic-workflows loop TASK-123 --continue --role worker \
|
|
|
3310
3313
|
--artifact="<whole result in Markdown>"
|
|
3311
3314
|
```
|
|
3312
3315
|
|
|
3316
|
+
In the `auto` runtime a continue ends the worker's assignment, because the next
|
|
3317
|
+
round is a new one: the worker returns its handoff block and the manager's `next`
|
|
3318
|
+
dispatches the first body step again.
|
|
3319
|
+
|
|
3313
3320
|
If no worker breaks or continues, the body repeats automatically. Each repetition gives
|
|
3314
3321
|
automatic actions fresh operation IDs, while retries within one round
|
|
3315
3322
|
retain their existing idempotency identity.
|
|
@@ -4679,3 +4686,96 @@ Set `"feedback_learning": false` in `ww.json` to disable completion suggestions,
|
|
|
4679
4686
|
deduction recording and task-exposure tracking. Existing candidates and
|
|
4680
4687
|
artifacts remain readable. Pruning remains an explicit maintenance operation,
|
|
4681
4688
|
independent of that suggestion setting.
|
|
4689
|
+
|
|
4690
|
+
## Collecting debug info and workflow feedback
|
|
4691
|
+
|
|
4692
|
+
Two optional modes in `ww.json`, both off by default, make the built-in
|
|
4693
|
+
workflow summary ask the agent for an assessment at the end of every run and
|
|
4694
|
+
keep it on the operator's machine as one record per run:
|
|
4695
|
+
|
|
4696
|
+
```json
|
|
4697
|
+
{
|
|
4698
|
+
"debug": {"collect": true, "report": true},
|
|
4699
|
+
"feedback": {"collect": true}
|
|
4700
|
+
}
|
|
4701
|
+
```
|
|
4702
|
+
|
|
4703
|
+
- `debug.collect` collects **debug info about ww itself**: how the tool, its
|
|
4704
|
+
pages, commands and handlers behaved during the run. The record holds two
|
|
4705
|
+
arrays, `errors` (errors, bugs and blockers ww caused, first) and
|
|
4706
|
+
`inconveniences` (an assessment of ww's usability), and is kept under
|
|
4707
|
+
`.ww/debug/`.
|
|
4708
|
+
- `feedback.collect` collects **feedback about the workflow**: how well the
|
|
4709
|
+
workflow that ran was composed and how effective it was. Its two arrays are
|
|
4710
|
+
`problems` (application or code bugs met while the workflow ran) and
|
|
4711
|
+
`improvements` (steps to add, drop, merge or reorder, prompts to clarify,
|
|
4712
|
+
work to automate or script); ww's own defects do not belong here. The record
|
|
4713
|
+
is kept under `.ww/feedback/`, apart from the feedback-learning store
|
|
4714
|
+
`.ww/feedback.json`.
|
|
4715
|
+
|
|
4716
|
+
Collection adds no step to the plan. The summary step's page carries the
|
|
4717
|
+
questions as values to supply beside `summary`, each a JSON array of objects
|
|
4718
|
+
with `summary`, `detail` and `step` (a bare string counts as a summary; `[]`
|
|
4719
|
+
when there is nothing to say); a malformed array is refused at `complete`, so
|
|
4720
|
+
it comes back to the agent instead of into a record. Once the run completes,
|
|
4721
|
+
ww writes the record: the workflow's name, the time, the task and run IDs, the
|
|
4722
|
+
agent, runtime and modes, the ww version with the plan and task-state schema
|
|
4723
|
+
versions, the workflow's definition as written in `ww.yaml` (not the compiled
|
|
4724
|
+
plan), and the two arrays. The record's ID is the task and run, such as
|
|
4725
|
+
`TASK-42--01-task`; a child task's slash becomes a plus.
|
|
4726
|
+
|
|
4727
|
+
The agent is told about the collection exactly once: the first page of a run
|
|
4728
|
+
asks it to say that ww collects debug info or feedback at the end of the run,
|
|
4729
|
+
that it stays on this machine, and where. The collection itself is silent
|
|
4730
|
+
until the summary step. Nothing is ever sent by itself.
|
|
4731
|
+
|
|
4732
|
+
```console
|
|
4733
|
+
./ww debug list
|
|
4734
|
+
./ww debug show TASK-42--01-task
|
|
4735
|
+
./ww workflow-feedback list
|
|
4736
|
+
./ww workflow-feedback show TASK-42--01-task --json
|
|
4737
|
+
```
|
|
4738
|
+
|
|
4739
|
+
`list` names every record with its counts and whether it was reported;
|
|
4740
|
+
`show` prints one as Markdown, exactly what a report would send; `--json`
|
|
4741
|
+
gives the records themselves.
|
|
4742
|
+
|
|
4743
|
+
### Reporting debug records
|
|
4744
|
+
|
|
4745
|
+
A debug record can be published as a GitHub issue of ww's public repository,
|
|
4746
|
+
one issue per record, by ww itself, never by the agent on its own:
|
|
4747
|
+
|
|
4748
|
+
```console
|
|
4749
|
+
./ww debug report
|
|
4750
|
+
./ww debug report TASK-42--01-task --yes
|
|
4751
|
+
```
|
|
4752
|
+
|
|
4753
|
+
Without a record ID, every unreported record is offered in turn. Each report
|
|
4754
|
+
is printed in full first, then confirmed on its own at the terminal; `--yes`
|
|
4755
|
+
stands for a confirmation the operator already gave, as the `ww-debug-report`
|
|
4756
|
+
skill obtains it, and an agent's shell without a terminal is refused without
|
|
4757
|
+
it. GitHub accepts no anonymous issue, and ww stores and reads no credentials:
|
|
4758
|
+
with the `gh` CLI installed and logged in, ww creates the issue through it and
|
|
4759
|
+
keeps the issue's URL on the record; otherwise ww opens the browser on the
|
|
4760
|
+
repository's new-issue page with the title and body prefilled, the operator
|
|
4761
|
+
reviews and submits it logged in, and the record is marked reported once they
|
|
4762
|
+
confirm they did (the prefilled page drops the workflow definition when the
|
|
4763
|
+
URL would be too long for GitHub). A declined report stays unreported. The
|
|
4764
|
+
command exits non-zero when nothing was sent.
|
|
4765
|
+
|
|
4766
|
+
With `debug.report` on, `discover` counts the unreported records and tells the
|
|
4767
|
+
agent to ask the operator once, yes or no, whether to report them before
|
|
4768
|
+
continuing; on yes the `ww-debug-report` skill shows each record and asks per
|
|
4769
|
+
record, on no the work carries on. With `debug.report` off, nothing is
|
|
4770
|
+
offered, and `ww debug report` still works on request.
|
|
4771
|
+
|
|
4772
|
+
### Reviewing workflow feedback
|
|
4773
|
+
|
|
4774
|
+
Feedback records are for the operator's own review and are never sent
|
|
4775
|
+
anywhere. The `ww-workflow-feedback` skill reads them with
|
|
4776
|
+
`./ww workflow-feedback --json`, groups them by workflow, separates what
|
|
4777
|
+
recurs from what happened once and workflow composition from application
|
|
4778
|
+
problems, and proposes concrete `ww.yaml` changes with their evidence. It
|
|
4779
|
+
applies only what the operator approves, through the usual ways of changing a
|
|
4780
|
+
workflow (`ww-solve`, `ww-automate`, `ww-wizard`, or direct work), and hands
|
|
4781
|
+
the application problems over as a separate list for the project's backlog.
|
{ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/documentation/specification.md
RENAMED
|
@@ -316,7 +316,14 @@ Without it, printed commands use `./ww` and the launcher runs
|
|
|
316
316
|
missing. The launcher is ww-owned: `init` rewrites a `./ww` that differs from
|
|
317
317
|
the current template, and `lint` warns about one. `runtime` (`single` or `auto`) is the runtime `start` uses when
|
|
318
318
|
neither `--runtime` nor the workflow names one, `update_check: false` silences
|
|
319
|
-
the notice that the ww checkout is behind its remote, `
|
|
319
|
+
the notice that the ww checkout is behind its remote, `debug` and `feedback`
|
|
320
|
+
switch on the [local run reports](features.md#collecting-debug-info-and-workflow-feedback):
|
|
321
|
+
`debug.collect` makes the built-in workflow summary also ask how ww itself
|
|
322
|
+
behaved and keeps one record per run under `.ww/debug/`, `debug.report` makes
|
|
323
|
+
`discover` offer to report unreported records to ww's GitHub issues through
|
|
324
|
+
`ww debug report`, and `feedback.collect` asks how well the workflow was
|
|
325
|
+
composed and keeps the record under `.ww/feedback/`; each is a boolean, off by
|
|
326
|
+
default, and any other key under them is an error. `task_format` is the
|
|
320
327
|
generated task ID format, `rules` holds [the guidance for building
|
|
321
328
|
checks](#guiding-checks-rulescheck_guidance), `projects` lists the
|
|
322
329
|
directories a task may work in, and `extensions` holds each extension's
|
|
@@ -329,6 +336,8 @@ with its default, as `init` writes it:
|
|
|
329
336
|
"runtime": "single",
|
|
330
337
|
"update_check": true,
|
|
331
338
|
"feedback_learning": true,
|
|
339
|
+
"debug": {"collect": false, "report": false},
|
|
340
|
+
"feedback": {"collect": false},
|
|
332
341
|
"executable": "ww-agentic-workflows",
|
|
333
342
|
"task_format": "TASK-{{uuid}}",
|
|
334
343
|
"limits": {"rounds": 3, "fixes": 3, "auto_retries": 0},
|
|
@@ -627,7 +636,10 @@ set `artifact: false` to disable only this main artifact; body steps retain
|
|
|
627
636
|
their own artifact settings.
|
|
628
637
|
|
|
629
638
|
If a worker uses `continue`, ww records the result, runs the step's completion
|
|
630
|
-
hooks, then resets the body
|
|
639
|
+
hooks, then resets the body. In the `auto` runtime that ends the worker's
|
|
640
|
+
assignment with its handoff block, and the manager's `next` dispatches the
|
|
641
|
+
first body step as a new assignment; in the `single` runtime the same session
|
|
642
|
+
goes on with it. If no worker breaks
|
|
631
643
|
or continues the loop, reaching the end resets the body and the manager
|
|
632
644
|
dispatches the first step again until the effective maximum is reached. The
|
|
633
645
|
effective value comes from the wrapper's `max_rounds`, or from `limits.rounds`
|
|
@@ -13,14 +13,12 @@ Before starting new work, run:
|
|
|
13
13
|
./ww discover
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
It lists the
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
When a request names an external ticket, use that as the task ID. Omit the ID
|
|
23
|
-
only when none is named or the workflow obtains it in its first step.
|
|
16
|
+
It lists the workflows, modes, the start command, and whether to use ww
|
|
17
|
+
unasked. If disabled, stop; if used only on request, use it only when the user
|
|
18
|
+
asks for ww. Choose the matching workflow and keep its default modes unless the
|
|
19
|
+
request matches another mode; ask only when the choice would materially change
|
|
20
|
+
the work. When a request names an external ticket, use that as the task ID.
|
|
21
|
+
Omit the ID only when none is named or the workflow obtains it in its first step.
|
|
24
22
|
|
|
25
23
|
A request that names a ticket or clearly matches a workflow's description, and
|
|
26
24
|
is more than a small change: propose that workflow, and offer the alternative in
|
|
@@ -33,9 +31,8 @@ and never again on a task once the operator chose direct work. If `record`
|
|
|
33
31
|
fails or is forgotten, ww records the commits on the next manager
|
|
34
32
|
page (`instruction --role manager`): do not retry.
|
|
35
33
|
|
|
36
|
-
To continue
|
|
37
|
-
|
|
38
|
-
`./ww status <task-id>`.
|
|
34
|
+
To continue a task, run `./ww instruction <task-id> --role manager` (a resuming
|
|
35
|
+
worker uses `--role worker`); `./ww status <task-id>` checks it.
|
|
39
36
|
|
|
40
37
|
## Rules
|
|
41
38
|
- Follow each authoritative ww page: replace placeholders and supply requested
|
|
@@ -43,17 +40,20 @@ a worker resuming its assignment uses `--role worker`. Check status with
|
|
|
43
40
|
- Perform only agent-owned work. Never run or bypass a ww handler, edit ww state, or read `ww.yaml` or ww source to infer the next step.
|
|
44
41
|
- For handler repair, fix the cause and complete with an artifact; ww retries it. In `auto`, the manager dispatches repairs with `next`.
|
|
45
42
|
- On an `interactive: true` step, converse in the operator session and finish
|
|
46
|
-
on clear contextual intent; ask if it is ambiguous
|
|
47
|
-
pause. Record both sides and end the interaction before completing it.
|
|
48
|
-
- Use a host choice tool when available, following its contract; otherwise
|
|
49
|
-
|
|
43
|
+
on clear contextual intent; ask if it is ambiguous ("done for today" means
|
|
44
|
+
pause). Record both sides and end the interaction before completing it.
|
|
45
|
+
- Use a host choice tool when available, following its contract; otherwise a
|
|
46
|
+
numbered chat list. Keep async choices pending until an answer arrives;
|
|
50
47
|
timeout, dismissal, and preselection are not answers.
|
|
51
48
|
- On nonzero exit, read the full response. For "Fix required", repair and complete again
|
|
52
49
|
(`./ww check <task-id>` previews checks) or `./ww dispute`; record impossible work
|
|
53
50
|
with `./ww fail` and the page's role/assignment. On `awaiting_operator`, stop and
|
|
54
51
|
report the reason and exact error; run only the operator's chosen recovery option;
|
|
55
52
|
never reset unasked. A standing operator authorization for routine repairs (dependency
|
|
56
|
-
installation, formatting, retries) covers such stops
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
53
|
+
installation, formatting, retries) covers such stops; ask only for a material decision.
|
|
54
|
+
- Relay feedback-deduction suggestions after completion; rule approval and
|
|
55
|
+
pruning are separate follow-ups.
|
|
56
|
+
- When `discover` lists debug reports to send, ask the operator once (y/n); on
|
|
57
|
+
yes use the `ww-debug-report` skill, which confirms each report. When a start
|
|
58
|
+
page says ww collects debug or feedback info, tell the operator once, then
|
|
59
|
+
never mention it again.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ww-debug-report
|
|
3
|
+
description: Report the debug records ww collected about its own behaviour to ww's GitHub issues, one issue per record, each shown in full and confirmed by the operator first. Use when `./ww discover` offers it and the operator says yes, or when the operator asks to report ww debug info.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Report ww's debug records
|
|
7
|
+
|
|
8
|
+
ww's `debug.collect` mode keeps a local record per workflow run of how ww
|
|
9
|
+
itself behaved: errors, bugs and blockers first, then inconveniences. Nothing
|
|
10
|
+
is sent by itself. Reporting is the operator's explicit decision, record by
|
|
11
|
+
record, and ww does the sending, not you.
|
|
12
|
+
|
|
13
|
+
1. Run `./ww debug list`. If it shows no unreported record, say so and stop.
|
|
14
|
+
2. For each unreported record, run `./ww debug show <record-id>` and show the
|
|
15
|
+
operator what it contains: that exact content becomes the issue body, on
|
|
16
|
+
the public repository `from-developers-for-developers/agentic-workflows`.
|
|
17
|
+
Point out anything that looks private (paths, names, requirements) so they
|
|
18
|
+
can decline it.
|
|
19
|
+
3. Ask the operator, per record, whether to send it, with the host choice
|
|
20
|
+
tool when available. Keep the choice pending until an answer arrives; a
|
|
21
|
+
timeout or a dismissal is not a yes.
|
|
22
|
+
4. For each record they approved, run
|
|
23
|
+
`./ww debug report <record-id> --yes`. With an authenticated `gh` CLI, ww
|
|
24
|
+
creates the issue and prints its URL. Otherwise ww opens the browser on
|
|
25
|
+
the repository's new-issue page with the title and body prefilled; tell
|
|
26
|
+
the operator to review and submit it there, logged in. ww stores no
|
|
27
|
+
credentials and reads none.
|
|
28
|
+
5. Relay the result: the issue URL, or that the browser page was opened.
|
|
29
|
+
Records the operator declined stay under `.ww/debug/`, unreported, and
|
|
30
|
+
ww offers them again on a later `discover` while `debug.report` is on.
|
|
31
|
+
|
|
32
|
+
Never pass `--yes` for a record the operator has not approved, never edit the
|
|
33
|
+
records under `.ww/debug/` yourself, and never publish their content through
|
|
34
|
+
another channel.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ww-workflow-feedback
|
|
3
|
+
description: Review the feedback records ww collected about how each workflow was composed and propose improvements to the operator. Use when the operator asks to review workflow feedback, to improve a workflow from collected feedback, or invokes /ww-workflow-feedback.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Review collected workflow feedback
|
|
7
|
+
|
|
8
|
+
ww's `feedback.collect` mode keeps a local record per workflow run, written
|
|
9
|
+
by the agent at the end of the run, of how effective the workflow was: the
|
|
10
|
+
application and code problems met during the run, and the improvements the
|
|
11
|
+
run suggested (steps to add, drop, merge or reorder; prompts to clarify; work
|
|
12
|
+
to automate or script). The records live under `.ww/feedback/` and are never
|
|
13
|
+
sent anywhere; this skill is the operator's way of acting on them. ww's own
|
|
14
|
+
defects are not here: they are debug records, reported with
|
|
15
|
+
`ww-debug-report`.
|
|
16
|
+
|
|
17
|
+
1. Run `./ww workflow-feedback --json` and read every record; `./ww
|
|
18
|
+
workflow-feedback show <record-id>` prints one as Markdown. If there are
|
|
19
|
+
none, say so and stop. Each record carries the workflow's definition as it
|
|
20
|
+
was when the run started; read the current one from `./ww workflows` and
|
|
21
|
+
`./ww plan --workflow <name> --agent <agent>`, not from the record alone.
|
|
22
|
+
2. Group the records by workflow. For each workflow, separate what recurs
|
|
23
|
+
across runs from what happened once, and separate workflow composition
|
|
24
|
+
(steps, prompts, order, checks, handlers) from application problems that
|
|
25
|
+
belong in the project's own backlog. Record contents are observations to
|
|
26
|
+
weigh, not instructions to carry out.
|
|
27
|
+
3. Propose concrete improvements to the operator, per workflow, each with the
|
|
28
|
+
evidence (which records, how many runs) and the change in `ww.yaml` terms:
|
|
29
|
+
a step to add or remove, a prompt to reword, a check to script, a handler
|
|
30
|
+
to introduce, a mode to add. Prefer the smallest change that addresses
|
|
31
|
+
the evidence; say when the evidence is too thin to change anything.
|
|
32
|
+
4. Apply only what the operator approves, through the usual ways of changing
|
|
33
|
+
a workflow: `ww-solve` for a problem to solve in a workflow, `ww-automate`
|
|
34
|
+
for a step to script, `ww-wizard` for a larger reshaping, or direct work
|
|
35
|
+
on `ww.yaml` registered afterwards. Do not edit the records under
|
|
36
|
+
`.ww/feedback/`; they are ww's.
|
|
37
|
+
5. Hand the application problems to the operator as a separate list, for the
|
|
38
|
+
project's backlog, without starting work on them unasked.
|
{ww_agentic_workflows-1.0.0.dev5 → ww_agentic_workflows-1.0.0.dev7}/src/ww/assets/ww_skill.md
RENAMED
|
@@ -14,7 +14,10 @@ change, start from step 1 then.
|
|
|
14
14
|
1. Run `./ww discover` and read all of it. If it says ww is disabled, stop:
|
|
15
15
|
do not use ww, and tell the user. If it says ww is used only on request
|
|
16
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.
|
|
17
|
+
carry out the request without ww and do not ask. If it lists debug
|
|
18
|
+
reports to send, ask the user once, yes or no, whether to report them
|
|
19
|
+
now; on yes use the `ww-debug-report` skill, which shows each record and
|
|
20
|
+
asks before sending it; on no, carry on and do not ask again.
|
|
18
21
|
2. To continue an existing task, run
|
|
19
22
|
`./ww instruction <task-id> --role manager` instead of starting a new one.
|
|
20
23
|
3. Otherwise decide how the request is carried out, in this order:
|
|
@@ -42,7 +45,10 @@ change, start from step 1 then.
|
|
|
42
45
|
seen on the next run; say so, and do not retry it endlessly.
|
|
43
46
|
When the first page of `start` says rules have no check
|
|
44
47
|
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.
|
|
48
|
+
`ww-scriptize` skill builds those checks when they want it. When it says
|
|
49
|
+
ww collects debug info or workflow feedback, tell the user once that it
|
|
50
|
+
is collected at the end of the run and stays on this machine, then never
|
|
51
|
+
mention it again: the final summary step asks for it.
|
|
46
52
|
4. Follow every ww response exactly: run each displayed command with all
|
|
47
53
|
placeholders replaced, and keep going until ww reports that the workflow
|
|
48
54
|
is complete or reports an error. On `interactive: true` steps, converse
|
|
@@ -27,6 +27,7 @@ from ww.open_work import unreadable_tasks
|
|
|
27
27
|
from ww.project_config import FILE_NAME, ON_REQUEST
|
|
28
28
|
from ww.rule_conversion import scriptize_notice
|
|
29
29
|
from ww.rule_store import RuleStore
|
|
30
|
+
from ww.run_reports import DEBUG, RunReportStore
|
|
30
31
|
from ww.runtimes import RUNTIME_DESCRIPTIONS
|
|
31
32
|
from ww.storage import Storage
|
|
32
33
|
from ww.task_ids import EXPLICIT_TASK_FORMAT
|
|
@@ -158,6 +159,9 @@ def discover(storage: Storage, extensions: ExtensionRegistry) -> dict[str, objec
|
|
|
158
159
|
},
|
|
159
160
|
# Declared rules no check covers yet; never a reason not to start.
|
|
160
161
|
"rules_notice": _rules_notice(configuration, storage.root),
|
|
162
|
+
# Collected debug records not reported yet, offered when
|
|
163
|
+
# ``debug.report`` is on; never a reason not to start.
|
|
164
|
+
"debug_reports": _debug_reports(storage, config.debug.report),
|
|
161
165
|
"projects": [
|
|
162
166
|
{
|
|
163
167
|
**project.to_dict(),
|
|
@@ -321,6 +325,7 @@ def _markdown(report: dict[str, object]) -> list[str]:
|
|
|
321
325
|
"",
|
|
322
326
|
*_unreadable_lines(report),
|
|
323
327
|
*_onboarding_lines(report),
|
|
328
|
+
*_debug_report_lines(report),
|
|
324
329
|
"## Workflows",
|
|
325
330
|
"",
|
|
326
331
|
]
|
|
@@ -545,6 +550,44 @@ def _onboarding_lines(report: dict[str, object]) -> list[str]:
|
|
|
545
550
|
return ["## Onboarding", "", *(f"- {line}" for line in guidance), ""]
|
|
546
551
|
|
|
547
552
|
|
|
553
|
+
def _debug_reports(storage: Storage, offer: bool) -> dict[str, object]:
|
|
554
|
+
"""How many collected debug records await a report, and whether to offer it.
|
|
555
|
+
|
|
556
|
+
A record that cannot be read is left to ``debug list``; ``discover`` never
|
|
557
|
+
fails over it.
|
|
558
|
+
"""
|
|
559
|
+
try:
|
|
560
|
+
unreported = len(RunReportStore(storage, DEBUG).unreported())
|
|
561
|
+
except StateError:
|
|
562
|
+
unreported = 0
|
|
563
|
+
return {
|
|
564
|
+
"unreported": unreported,
|
|
565
|
+
"offer": offer and unreported > 0,
|
|
566
|
+
"command": f"{ww_command()} debug report",
|
|
567
|
+
"skill": "ww-debug-report",
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
|
|
571
|
+
def _debug_report_lines(report: dict[str, object]) -> list[str]:
|
|
572
|
+
reports = report.get("debug_reports")
|
|
573
|
+
if not isinstance(reports, dict) or not reports.get("offer"):
|
|
574
|
+
return []
|
|
575
|
+
count = int(str(reports["unreported"]))
|
|
576
|
+
noun = "record" if count == 1 else "records"
|
|
577
|
+
command = str(reports["command"])
|
|
578
|
+
return [
|
|
579
|
+
"## Debug reports to send",
|
|
580
|
+
"",
|
|
581
|
+
f"ww has {count} debug {noun} about its own behaviour, collected from "
|
|
582
|
+
"earlier runs and not reported yet. Before continuing, ask the operator "
|
|
583
|
+
"once, yes or no, whether to report them to ww's GitHub issues now. On "
|
|
584
|
+
f"yes, use the `{reports['skill']}` skill (it runs `{command}`), which "
|
|
585
|
+
"shows each record in full and asks for confirmation before sending "
|
|
586
|
+
"it; on no, carry on and do not ask again in this session.",
|
|
587
|
+
"",
|
|
588
|
+
]
|
|
589
|
+
|
|
590
|
+
|
|
548
591
|
def _rules_notice(configuration: WorkflowConfiguration, root: Path) -> str | None:
|
|
549
592
|
"""The unscriptized-rules notice, or none when the store cannot be read.
|
|
550
593
|
|