tcw-cli 3.0.0__tar.gz → 3.0.1__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 (178) hide show
  1. {tcw_cli-3.0.0/tcw_cli.egg-info → tcw_cli-3.0.1}/PKG-INFO +3 -2
  2. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/README.md +2 -1
  3. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/pyproject.toml +1 -1
  4. tcw_cli-3.0.1/tcw/__init__.py +1 -0
  5. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/procedures/unattended-work.md +1 -1
  6. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/prompts/qa.md +10 -6
  7. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/prompts/request.md +11 -2
  8. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/resolve.py +8 -2
  9. {tcw_cli-3.0.0 → tcw_cli-3.0.1/tcw_cli.egg-info}/PKG-INFO +3 -2
  10. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_shipped_prompts.py +20 -0
  11. tcw_cli-3.0.0/tcw/__init__.py +0 -1
  12. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/LICENSE +0 -0
  13. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/setup.cfg +0 -0
  14. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/capabilities/__init__.py +0 -0
  15. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/capabilities/cli.py +0 -0
  16. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/cli.py +0 -0
  17. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/cli_help.py +0 -0
  18. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/cli_suggest.py +0 -0
  19. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/config.py +0 -0
  20. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/config_cli.py +0 -0
  21. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/errors.py +0 -0
  22. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/exit.py +0 -0
  23. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/findings.py +0 -0
  24. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/output.py +0 -0
  25. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/projects_cli.py +0 -0
  26. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/refs.py +0 -0
  27. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/serve/__init__.py +0 -0
  28. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/serve/dist/client/assets/index-BGwvKkRc.js +0 -0
  29. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/serve/dist/client/assets/index-DkarCRfj.css +0 -0
  30. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/serve/dist/client/index.html +0 -0
  31. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/serve/dist/client/theme-init.js +0 -0
  32. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/serve/files.py +0 -0
  33. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/serve/records.py +0 -0
  34. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/serve/server.py +0 -0
  35. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/serve/services.py +0 -0
  36. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/serve/work.py +0 -0
  37. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/stdin.py +0 -0
  38. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/store/__init__.py +0 -0
  39. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/store/base.py +0 -0
  40. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/store/checkouts.py +0 -0
  41. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/store/config_edit.py +0 -0
  42. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/store/fs.py +0 -0
  43. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/store/project.py +0 -0
  44. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/store/yaml_source.py +0 -0
  45. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/taxonomy/__init__.py +0 -0
  46. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/taxonomy/cli.py +0 -0
  47. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/validate.py +0 -0
  48. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/__init__.py +0 -0
  49. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/advance.py +0 -0
  50. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/backend.py +0 -0
  51. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/cli.py +0 -0
  52. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/config.py +0 -0
  53. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/fs_backend.py +0 -0
  54. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/gates.py +0 -0
  55. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/generate.py +0 -0
  56. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/hooks.py +0 -0
  57. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/jira/__init__.py +0 -0
  58. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/jira/backend.py +0 -0
  59. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/jira/client.py +0 -0
  60. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/jira/config.py +0 -0
  61. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/jira/jql.py +0 -0
  62. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/jira/mapping.py +0 -0
  63. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/jira/remote.py +0 -0
  64. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/jira/tickets.py +0 -0
  65. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/layout.py +0 -0
  66. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/model.py +0 -0
  67. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/open.py +0 -0
  68. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/passages.py +0 -0
  69. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/procedures/audit-backlog.md +0 -0
  70. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/procedures/create-work.md +0 -0
  71. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/procedures/documentation-sync.md +0 -0
  72. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/procedures/pause-work.md +0 -0
  73. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/procedures/search.md +0 -0
  74. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/procedures/triage-issues.md +0 -0
  75. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/prompts/implement.md +0 -0
  76. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/prompts/inbox.md +0 -0
  77. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/prompts/plan.md +0 -0
  78. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/prompts/postmortem.md +0 -0
  79. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/prompts/review.md +0 -0
  80. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/prompts/spec.md +0 -0
  81. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/record.py +0 -0
  82. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw/work/references.py +0 -0
  83. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw_cli.egg-info/SOURCES.txt +0 -0
  84. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw_cli.egg-info/dependency_links.txt +0 -0
  85. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw_cli.egg-info/entry_points.txt +0 -0
  86. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw_cli.egg-info/requires.txt +0 -0
  87. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tcw_cli.egg-info/top_level.txt +0 -0
  88. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_capabilities.py +0 -0
  89. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_capabilities_cli_contract.py +0 -0
  90. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_capabilities_federation.py +0 -0
  91. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_capabilities_reset.py +0 -0
  92. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_capabilities_rm.py +0 -0
  93. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_capability_ref_wording.py +0 -0
  94. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_check_versions.py +0 -0
  95. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_cli_contract.py +0 -0
  96. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_cli_guide.py +0 -0
  97. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_cli_handler.py +0 -0
  98. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_cli_help_standard.py +0 -0
  99. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_command_suggestions.py +0 -0
  100. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_committed_paths.py +0 -0
  101. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_config_edit.py +0 -0
  102. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_config_edit_writers.py +0 -0
  103. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_configuration_text_home.py +0 -0
  104. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_cut_version.py +0 -0
  105. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_doc_vocabulary.py +0 -0
  106. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_docs_describe_3_0.py +0 -0
  107. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_documentation_config.py +0 -0
  108. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_documentation_prompt.py +0 -0
  109. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_documentation_sync_wiring.py +0 -0
  110. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_documented_cli_surface.py +0 -0
  111. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_dynamic_skill_marker.py +0 -0
  112. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_environment_hardness.py +0 -0
  113. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_eval_coverage.py +0 -0
  114. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_eval_files_changed.py +0 -0
  115. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_eval_fixture.py +0 -0
  116. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_eval_grading.py +0 -0
  117. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_eval_runner.py +0 -0
  118. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_falsification_rule.py +0 -0
  119. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_findings_type.py +0 -0
  120. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_generate_hook.py +0 -0
  121. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_git_example.py +0 -0
  122. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_init_configured_tree_path.py +0 -0
  123. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_init_provision_contract.py +0 -0
  124. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_item_tags_read.py +0 -0
  125. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_ledger_3_0.py +0 -0
  126. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_legacy_store_config.py +0 -0
  127. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_lifecycle_config_tags.py +0 -0
  128. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_literal_store_names.py +0 -0
  129. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_migration_guide.py +0 -0
  130. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_multiproject.py +0 -0
  131. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_no_node.py +0 -0
  132. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_override_in_linked_worktree.py +0 -0
  133. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_override_letter_case.py +0 -0
  134. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_override_references.py +0 -0
  135. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_partial_removal.py +0 -0
  136. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_plugin_manifests.py +0 -0
  137. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_procedure_config.py +0 -0
  138. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_procedure_verb.py +0 -0
  139. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_project_graph_paths.py +0 -0
  140. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_project_overrides.py +0 -0
  141. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_project_registry.py +0 -0
  142. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_projects_list.py +0 -0
  143. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_prompt_fallback.py +0 -0
  144. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_refs.py +0 -0
  145. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_remote_session_setup.py +0 -0
  146. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_repo_lifecycle.py +0 -0
  147. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_require_artifact.py +0 -0
  148. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_routing_nodes.py +0 -0
  149. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_session_bootstrap.py +0 -0
  150. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_shipped_procedures.py +0 -0
  151. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_shipped_text.py +0 -0
  152. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_skill_flow.py +0 -0
  153. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_skill_path_pointers.py +0 -0
  154. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_smoke.py +0 -0
  155. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_stage_verb.py +0 -0
  156. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_static_guards.py +0 -0
  157. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_stdin.py +0 -0
  158. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_stdin_cli.py +0 -0
  159. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_store_bounds.py +0 -0
  160. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_store_editor.py +0 -0
  161. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_store_nodes.py +0 -0
  162. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_store_provisioning.py +0 -0
  163. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_subprocess_stdin.py +0 -0
  164. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_suite_runs_its_own_tcw.py +0 -0
  165. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_taxonomy.py +0 -0
  166. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_taxonomy_cli_contract.py +0 -0
  167. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_taxonomy_rm_gaps.py +0 -0
  168. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_tree_store_files_only.py +0 -0
  169. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_tree_store_raises.py +0 -0
  170. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_unattended_work_skill.py +0 -0
  171. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_unpushed_version_script.py +0 -0
  172. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_upcoming_entries.py +0 -0
  173. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_upstream_projects.py +0 -0
  174. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_validate.py +0 -0
  175. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_validate_command.py +0 -0
  176. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_validate_moved_stores.py +0 -0
  177. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_validate_target.py +0 -0
  178. {tcw_cli-3.0.0 → tcw_cli-3.0.1}/tests/test_worktree_sibling_nodes.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tcw-cli
3
- Version: 3.0.0
3
+ Version: 3.0.1
4
4
  Summary: Taxonomy · Capabilities · Work — a storage-abstracted framework for describing and evolving a software project.
5
5
  License: Apache License
6
6
  Version 2.0, January 2004
@@ -724,7 +724,8 @@ A change to the product is followed from the first request to the records:
724
724
  In filesystem mode, the agent working `qa` may record the verdict itself, unless
725
725
  the project's own instructions for `qa` ask for a person to decide. When they
726
726
  do, the agent still writes the round, recording the person's decision. In Jira
727
- mode, a person accepts or rejects on the ticket.
727
+ mode, a person accepts or rejects: on the ticket, or by telling the agent,
728
+ which then moves the ticket and records who decided.
728
729
 
729
730
  Work reaches taxonomy through those capabilities: a new capability names the
730
731
  vocabulary and feature it involves, and those entries must exist first.
@@ -508,7 +508,8 @@ A change to the product is followed from the first request to the records:
508
508
  In filesystem mode, the agent working `qa` may record the verdict itself, unless
509
509
  the project's own instructions for `qa` ask for a person to decide. When they
510
510
  do, the agent still writes the round, recording the person's decision. In Jira
511
- mode, a person accepts or rejects on the ticket.
511
+ mode, a person accepts or rejects: on the ticket, or by telling the agent,
512
+ which then moves the ticket and records who decided.
512
513
 
513
514
  Work reaches taxonomy through those capabilities: a new capability names the
514
515
  vocabulary and feature it involves, and those entries must exist first.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "tcw-cli"
7
- version = "3.0.0"
7
+ version = "3.0.1"
8
8
  description = "Taxonomy · Capabilities · Work — a storage-abstracted framework for describing and evolving a software project."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -0,0 +1 @@
1
+ __version__ = "3.0.1"
@@ -29,7 +29,7 @@ advisor alone.
29
29
 
30
30
  | The stage asks for | Do this instead |
31
31
  | --------------------------- | --------------- |
32
- | What the requester wants, at request | Do not ask the advisors: what the requester wants is not theirs to know. Write the request from the evidence available, marking each assumption, as the request prompt says when there is no user to ask. Where the backend keeps the request, as Jira does, post your questions with `tcw work comment <slug>` instead and leave its text alone. Then continue. |
32
+ | What the requester wants, at request | Do not ask the advisors: what the requester wants is not theirs to know. Write the request from the evidence available, marking each assumption, as the request prompt says when there is no user to ask. Where the backend keeps the request, as Jira does, post your questions with `tcw work comment <slug>` instead and leave its text alone, and leave the item at request unless the user's own instruction for this run explicitly said to move it out of request. Then move on to other work. |
33
33
  | One agent or several | Decide yourself. One, unless the parts are truly independent. |
34
34
  | An open question in a spec or plan | Ask the advisors, then write the answer into the document with the assumption stated in the text. |
35
35
  | Review | Run the review stage as its prompt says: a read-only reviewer, never the agent that implemented. Apply what you agree with; write down what you reject and why. |
@@ -52,7 +52,7 @@ QA plan scenario as passed, failed or not run, with the evidence for each.
52
52
  <!-- /backend -->
53
53
  <!-- backend: jira -->
54
54
  **Produce** findings, not a verdict. In Jira, qa happens on the ticket, and the
55
- ticket's status, which people move, is the verdict. You may run the scenarios
55
+ ticket's status, which a person decides, is the verdict. You may run the scenarios
56
56
  and post what you found with `tcw work comment <slug>`.
57
57
 
58
58
  ## Steps
@@ -60,11 +60,15 @@ and post what you found with `tcw work comment <slug>`.
60
60
  1. Run each scenario in the QA plan, in the environment it names.
61
61
  2. Post one comment listing each scenario as passed, failed or not run, with
62
62
  evidence. **No claim without output or an observation from just now.**
63
- 3. Leave the decision to a person. Tell them how to record it: accept by
64
- moving the ticket on in Jira, or with
65
- `tcw work advance <slug> --to completed --reason "<why>"`; reject with
66
- `tcw work advance <slug> --to implement --reason "<what to fix>"`, whose
67
- reason becomes the comment implement reads.
63
+ 3. A person decides the verdict, never you. Ask them for it. When the person
64
+ who decides gives you the verdict in this conversation, record it: accepted
65
+ with `tcw work advance <slug> --to completed --reason "accepted by <name>:
66
+ <why>"`, rejected with `tcw work advance <slug> --to implement --reason
67
+ "rejected by <name>: <what to fix>"`, whose reason becomes the comment
68
+ implement reads. A verdict comes after they have seen your findings: an
69
+ instruction given before that, such as "accept it if it passes", is not
70
+ one. They may instead move the ticket in Jira themselves. If they give no
71
+ verdict, stop at qa and say the item waits for them.
68
72
  <!-- /backend -->
69
73
 
70
74
  ## Exit badly
@@ -32,10 +32,19 @@ Write it to `tcw work path <slug> request`. Keep any dated `## Added`
32
32
  sections already there: they are amendments made after it was written.
33
33
  <!-- /backend -->
34
34
  <!-- backend: jira -->
35
- The request is the ticket's description, and Jira owns it: never rewrite it.
36
- When a section is missing or unclear, post a comment with
35
+ The request is the ticket's description, and Jira owns it: never rewrite it on
36
+ your own judgment. When a section is missing or unclear, post a comment with
37
37
  `tcw work comment <slug>` listing what is missing and proposing wording, for
38
38
  the requester to adopt.
39
+
40
+ The requester decides when the request is ready. When they tell you to move
41
+ the item on, in this conversation, do it. If they adopted changed wording,
42
+ first put it into the ticket's description: write it yourself if your harness
43
+ can edit Jira tickets, or ask them to paste it in. Then read it back and
44
+ confirm the description now says what they adopted. Then run
45
+ `tcw work advance <slug> --reason "<who told you to move it>"`. A question,
46
+ such as whether accepting the wording moves the item, is not an instruction to
47
+ move it.
39
48
  <!-- /backend -->
40
49
 
41
50
  ## Steps
@@ -450,8 +450,14 @@ def stage_footer(row, external, target: str) -> str | None:
450
450
  if row.artifact == NO_ARTIFACT:
451
451
  return None # how an arrival becomes work differs by backend
452
452
  if row.name in external:
453
- text = ("> **When this stage's work is done, a person moves the item on "
454
- "in the backend.** Do not move it yourself.")
453
+ # A person decides; the agent carries out the move once told (TCW-100).
454
+ move = (f"`tcw work advance {target} --to <stage> --reason \"<who decided, "
455
+ f"and why>\"`" if row.verdict else
456
+ f"`tcw work advance {target} --reason \"<who told you>\"`")
457
+ text = ("> **When this stage's work is done, a person decides whether the "
458
+ "item moves on.** Move it only when that person tells you to, in "
459
+ "this conversation; a question or an implied yes is not that. "
460
+ f"Then run {move}.")
455
461
  if row.verdict:
456
462
  text += " The verdict is that move."
457
463
  return text
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tcw-cli
3
- Version: 3.0.0
3
+ Version: 3.0.1
4
4
  Summary: Taxonomy · Capabilities · Work — a storage-abstracted framework for describing and evolving a software project.
5
5
  License: Apache License
6
6
  Version 2.0, January 2004
@@ -724,7 +724,8 @@ A change to the product is followed from the first request to the records:
724
724
  In filesystem mode, the agent working `qa` may record the verdict itself, unless
725
725
  the project's own instructions for `qa` ask for a person to decide. When they
726
726
  do, the agent still writes the round, recording the person's decision. In Jira
727
- mode, a person accepts or rejects on the ticket.
727
+ mode, a person accepts or rejects: on the ticket, or by telling the agent,
728
+ which then moves the ticket and records who decided.
728
729
 
729
730
  Work reaches taxonomy through those capabilities: a new capability names the
730
731
  vocabulary and feature it involves, and those entries must exist first.
@@ -267,6 +267,26 @@ def test_jira_qa_records_no_verdict():
267
267
  assert "tcw work path <slug> qa" not in text and "verdict:" not in text
268
268
 
269
269
 
270
+ def test_jira_qa_moves_the_ticket_when_the_person_gives_the_verdict():
271
+ """TCW-100: the person decides; once they give the verdict in the
272
+ conversation, the agent records it with `advance`, and otherwise stops."""
273
+ paragraph = _paragraph_with(prompt("qa", "jira"), "gives you the verdict")
274
+ assert "--to completed --reason" in paragraph
275
+ assert "--to implement --reason" in paragraph
276
+ assert "after they have seen your findings" in paragraph
277
+ assert "stop at qa" in paragraph
278
+
279
+
280
+ def test_jira_request_writes_adopted_wording_before_moving():
281
+ """TCW-100: adopted wording goes into the description, is read back, and
282
+ only then is the item moved, with a reason naming who said to move it."""
283
+ paragraph = _paragraph_with(prompt("request", "jira"), "tell you to move")
284
+ for words in ("description", "paste", "read it back",
285
+ "tcw work advance <slug> --reason"):
286
+ assert words in paragraph, words
287
+ assert paragraph.index("read it back") < paragraph.index("tcw work advance")
288
+
289
+
270
290
  @pytest.mark.parametrize("sid", sorted(SHIPPED))
271
291
  def test_no_prompt_tells_the_agent_to_ask_what_it_is_reading(sid):
272
292
  """`tcw work lifecycle --stage <id>` inside the text that command reports
@@ -1 +0,0 @@
1
- __version__ = "3.0.0"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes