taskledger 0.6.6__tar.gz → 0.6.7__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 (601) hide show
  1. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/events/events.jsonl +6 -0
  2. taskledger-0.6.7/.ledger/releaseledger/data/ledgers/main/releases/v0.6.7/audit/commit-audit.yaml +87 -0
  3. taskledger-0.6.7/.ledger/releaseledger/data/ledgers/main/releases/v0.6.7/entries/entry-0001.md +53 -0
  4. taskledger-0.6.7/.ledger/releaseledger/data/ledgers/main/releases/v0.6.7/release.md +27 -0
  5. {taskledger-0.6.6/taskledger.egg-info → taskledger-0.6.7}/PKG-INFO +7 -1
  6. {taskledger-0.6.6 → taskledger-0.6.7}/README.md +6 -0
  7. {taskledger-0.6.6 → taskledger-0.6.7}/docs/changelog.md +8 -0
  8. {taskledger-0.6.6 → taskledger-0.6.7}/docs/command_contract.md +1 -0
  9. {taskledger-0.6.6 → taskledger-0.6.7}/docs/sync.md +4 -0
  10. {taskledger-0.6.6 → taskledger-0.6.7}/docs/transfer.md +6 -0
  11. {taskledger-0.6.6 → taskledger-0.6.7}/docs/usage.md +3 -0
  12. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/_version.py +3 -3
  13. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/config.py +12 -0
  14. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/exchange.py +59 -8
  15. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/agent_logging.py +14 -9
  16. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/change_tracking.py +16 -3
  17. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/doctor.py +26 -0
  18. taskledger-0.6.7/taskledger/services/doctor_checks/artifact_checks.py +83 -0
  19. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/git_sync.py +28 -0
  20. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/implementation_flow.py +16 -3
  21. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/tasks.py +30 -4
  22. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/validation_flow.py +16 -3
  23. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/agent_logs.py +6 -1
  24. taskledger-0.6.7/taskledger/storage/artifact_policy.py +106 -0
  25. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/project_config.py +29 -2
  26. {taskledger-0.6.6 → taskledger-0.6.7/taskledger.egg-info}/PKG-INFO +7 -1
  27. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger.egg-info/SOURCES.txt +6 -0
  28. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger.egg-info/scm_file_list.json +6 -0
  29. taskledger-0.6.7/taskledger.egg-info/scm_version.json +8 -0
  30. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_agent_command_logging.py +12 -0
  31. taskledger-0.6.7/tests/test_artifact_policy.py +63 -0
  32. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_config_cli.py +25 -2
  33. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_doctor.py +31 -0
  34. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_project_root_config.py +19 -0
  35. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_sync_git.py +36 -0
  36. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_taskledger_v2_exchange.py +14 -0
  37. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_validation_command.py +45 -0
  38. taskledger-0.6.6/taskledger.egg-info/scm_version.json +0 -8
  39. {taskledger-0.6.6 → taskledger-0.6.7}/.codecrate.toml +0 -0
  40. {taskledger-0.6.6 → taskledger-0.6.7}/.github/workflows/codecov.yml +0 -0
  41. {taskledger-0.6.6 → taskledger-0.6.7}/.github/workflows/pre-commit.yml +0 -0
  42. {taskledger-0.6.6 → taskledger-0.6.7}/.github/workflows/python-publish.yml +0 -0
  43. {taskledger-0.6.6 → taskledger-0.6.7}/.github/workflows/tests.yml +0 -0
  44. {taskledger-0.6.6 → taskledger-0.6.7}/.gitignore +0 -0
  45. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/.archledger-migration-20260821T090309Z/config.toml +0 -0
  46. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/.ledger-project.toml +0 -0
  47. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/config.toml +0 -0
  48. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/.ledger-project.toml +0 -0
  49. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/archive/records/building_blocks/block-0083.md +0 -0
  50. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/archive/records/concepts/concept-0081.md +0 -0
  51. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/archive/records/runtime/runtime-0076.md +0 -0
  52. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/archive/records/runtime/runtime-0084.md +0 -0
  53. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/document-state.json +0 -0
  54. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/migrations/20260821T090309Z-ledgercore-0.4-repository-storage.json +0 -0
  55. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/migrations/migration-cbe21be3f9dc3db4b03f6366.json +0 -0
  56. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/profiles/arc42/sections/content-0001.md +0 -0
  57. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/profiles/arc42/sections/content-0002.md +0 -0
  58. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/profiles/arc42/sections/content-0003.md +0 -0
  59. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/profiles/arc42/sections/content-0004.md +0 -0
  60. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/profiles/arc42/sections/content-0005.md +0 -0
  61. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/profiles/arc42/sections/content-0006.md +0 -0
  62. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/profiles/arc42/sections/content-0007.md +0 -0
  63. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/profiles/arc42/sections/content-0008.md +0 -0
  64. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/profiles/arc42/sections/content-0009.md +0 -0
  65. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/profiles/arc42/sections/content-0010.md +0 -0
  66. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/profiles/arc42/sections/content-0011.md +0 -0
  67. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/profiles/arc42/sections/content-0012.md +0 -0
  68. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/building_blocks/block-0029.md +0 -0
  69. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/building_blocks/block-0030.md +0 -0
  70. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/building_blocks/block-0031.md +0 -0
  71. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/building_blocks/block-0032.md +0 -0
  72. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/building_blocks/block-0033.md +0 -0
  73. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/building_blocks/block-0034.md +0 -0
  74. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/concepts/concept-0040.md +0 -0
  75. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/concepts/concept-0041.md +0 -0
  76. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/concepts/concept-0042.md +0 -0
  77. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/concepts/concept-0043.md +0 -0
  78. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/concepts/concept-0044.md +0 -0
  79. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/concepts/concept-0045.md +0 -0
  80. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/concepts/concept-0082.md +0 -0
  81. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/concepts/concept-0085.md +0 -0
  82. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/concepts/concept-0086.md +0 -0
  83. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/constraints/constraint-0016.md +0 -0
  84. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/constraints/constraint-0017.md +0 -0
  85. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/constraints/constraint-0018.md +0 -0
  86. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/constraints/constraint-0019.md +0 -0
  87. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/contexts/context-0020.md +0 -0
  88. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/contexts/context-0021.md +0 -0
  89. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/contexts/context-0022.md +0 -0
  90. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/contexts/context-0023.md +0 -0
  91. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/decisions/adr-0046.md +0 -0
  92. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/decisions/adr-0047.md +0 -0
  93. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/decisions/adr-0048.md +0 -0
  94. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/decisions/adr-0049.md +0 -0
  95. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/decisions/adr-0050.md +0 -0
  96. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/decisions/adr-0051.md +0 -0
  97. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/deployment/deploy-0039.md +0 -0
  98. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/glossary/glossary-0061.md +0 -0
  99. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/glossary/glossary-0062.md +0 -0
  100. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/glossary/glossary-0063.md +0 -0
  101. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/glossary/glossary-0064.md +0 -0
  102. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/glossary/glossary-0065.md +0 -0
  103. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/glossary/glossary-0066.md +0 -0
  104. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/glossary/glossary-0067.md +0 -0
  105. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/glossary/glossary-0068.md +0 -0
  106. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/glossary/glossary-0069.md +0 -0
  107. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/glossary/glossary-0070.md +0 -0
  108. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/glossary/glossary-0071.md +0 -0
  109. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/glossary/glossary-0072.md +0 -0
  110. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/glossary/glossary-0073.md +0 -0
  111. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/quality_requirements/quality-0052.md +0 -0
  112. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/quality_requirements/quality-0053.md +0 -0
  113. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/quality_requirements/quality-0054.md +0 -0
  114. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/quality_requirements/quality-0055.md +0 -0
  115. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/quality_requirements/quality-0056.md +0 -0
  116. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/requirements/content-0013.md +0 -0
  117. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/requirements/content-0014.md +0 -0
  118. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/requirements/content-0015.md +0 -0
  119. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/risks/risk-0057.md +0 -0
  120. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/risks/risk-0058.md +0 -0
  121. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/risks/risk-0059.md +0 -0
  122. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/risks/risk-0060.md +0 -0
  123. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/runtime/runtime-0035.md +0 -0
  124. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/runtime/runtime-0036.md +0 -0
  125. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/runtime/runtime-0037.md +0 -0
  126. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/runtime/runtime-0038.md +0 -0
  127. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/runtime/runtime-0074.md +0 -0
  128. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/runtime/runtime-0075.md +0 -0
  129. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/runtime/runtime-0077.md +0 -0
  130. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/runtime/runtime-0078.md +0 -0
  131. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/runtime/runtime-0087.md +0 -0
  132. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/runtime/runtime-0088.md +0 -0
  133. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/stakeholders/content-0079.md +0 -0
  134. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/stakeholders/content-0080.md +0 -0
  135. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/strategy/strategy-0024.md +0 -0
  136. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/strategy/strategy-0025.md +0 -0
  137. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/strategy/strategy-0026.md +0 -0
  138. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/strategy/strategy-0027.md +0 -0
  139. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/strategy/strategy-0028.md +0 -0
  140. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/source-state.json +0 -0
  141. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/storage.yaml +0 -0
  142. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/migrations/migration-66baa70bad8a0bb5ae852133.json +0 -0
  143. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/.ledger-project.toml +0 -0
  144. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/config.toml +0 -0
  145. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/.ledger-project.toml +0 -0
  146. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/docs/docs-api-md-9eddf4dc.yaml +0 -0
  147. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/docs/docs-architecture-taskledger-split-md-63034c0d.yaml +0 -0
  148. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/docs/docs-command-contract-md-abe6f6d9.yaml +0 -0
  149. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/docs/docs-full-task-cycle-md-721181f0.yaml +0 -0
  150. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/docs/docs-multi-repo-md-929e47a9.yaml +0 -0
  151. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/docs/docs-public-surface-md-c1b8772f.yaml +0 -0
  152. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/docs/docs-service-boundary-whitelist-md-800b76f5.yaml +0 -0
  153. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/docs/docs-sync-md-a29422f3.yaml +0 -0
  154. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/docs/docs-transfer-md-f8532303.yaml +0 -0
  155. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/docs/docs-usage-md-72376d0b.yaml +0 -0
  156. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/scan.yaml +0 -0
  157. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/source-index.json +0 -0
  158. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/storage.yaml +0 -0
  159. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/ledger.toml +0 -0
  160. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/migrations/documentledger-bb67fdd8e51cff33.toml +0 -0
  161. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/.ledger-project.toml +0 -0
  162. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/config.toml +0 -0
  163. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/.ledger-project.toml +0 -0
  164. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0001.md +0 -0
  165. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0002.md +0 -0
  166. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0003.md +0 -0
  167. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0004.md +0 -0
  168. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0005.md +0 -0
  169. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0006.md +0 -0
  170. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0007.md +0 -0
  171. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0008.md +0 -0
  172. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0009.md +0 -0
  173. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0010.md +0 -0
  174. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0011.md +0 -0
  175. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0012.md +0 -0
  176. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0013.md +0 -0
  177. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0014.md +0 -0
  178. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0015.md +0 -0
  179. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0016.md +0 -0
  180. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0017.md +0 -0
  181. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0018.md +0 -0
  182. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0019.md +0 -0
  183. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0020.md +0 -0
  184. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0021.md +0 -0
  185. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0022.md +0 -0
  186. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0023.md +0 -0
  187. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/release.md +0 -0
  188. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.1/entries/entry-0001.md +0 -0
  189. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.1/entries/entry-0002.md +0 -0
  190. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.1/entries/entry-0003.md +0 -0
  191. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.1/entries/entry-0004.md +0 -0
  192. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.1/entries/entry-0005.md +0 -0
  193. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.1/release.md +0 -0
  194. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.2/entries/entry-0001.md +0 -0
  195. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.2/entries/entry-0002.md +0 -0
  196. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.2/entries/entry-0003.md +0 -0
  197. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.2/entries/entry-0004.md +0 -0
  198. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.2/release.md +0 -0
  199. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.3/audit/commit-audit.yaml +0 -0
  200. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.3/entries/entry-0001.md +0 -0
  201. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.3/release.md +0 -0
  202. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.4/audit/commit-audit.yaml +0 -0
  203. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.4/entries/entry-0001.md +0 -0
  204. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.4/entries/entry-0002.md +0 -0
  205. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.4/entries/entry-0003.md +0 -0
  206. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.4/release.md +0 -0
  207. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.5/audit/commit-audit.yaml +0 -0
  208. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.5/entries/entry-0001.md +0 -0
  209. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.5/entries/entry-0002.md +0 -0
  210. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.5/entries/entry-0003.md +0 -0
  211. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.5/release.md +0 -0
  212. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.6/audit/commit-audit.yaml +0 -0
  213. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.6/entries/entry-0001.md +0 -0
  214. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.6/release.md +0 -0
  215. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/write.lock +0 -0
  216. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/task/config.toml +0 -0
  217. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/taskledger/.ledger-project.toml +0 -0
  218. {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/taskledger/config.toml +0 -0
  219. {taskledger-0.6.6 → taskledger-0.6.7}/.planledger.toml +0 -0
  220. {taskledger-0.6.6 → taskledger-0.6.7}/.pre-commit-config.yaml +0 -0
  221. {taskledger-0.6.6 → taskledger-0.6.7}/.readthedocs.yaml +0 -0
  222. {taskledger-0.6.6 → taskledger-0.6.7}/.ruff.toml +0 -0
  223. {taskledger-0.6.6 → taskledger-0.6.7}/AGENTS.md +0 -0
  224. {taskledger-0.6.6 → taskledger-0.6.7}/API.md +0 -0
  225. {taskledger-0.6.6 → taskledger-0.6.7}/LICENSE +0 -0
  226. {taskledger-0.6.6 → taskledger-0.6.7}/Makefile +0 -0
  227. {taskledger-0.6.6 → taskledger-0.6.7}/docs/Makefile +0 -0
  228. {taskledger-0.6.6 → taskledger-0.6.7}/docs/api.md +0 -0
  229. {taskledger-0.6.6 → taskledger-0.6.7}/docs/architecture.md +0 -0
  230. {taskledger-0.6.6 → taskledger-0.6.7}/docs/architecture_taskledger_split.md +0 -0
  231. {taskledger-0.6.6 → taskledger-0.6.7}/docs/build.sh +0 -0
  232. {taskledger-0.6.6 → taskledger-0.6.7}/docs/conf.py +0 -0
  233. {taskledger-0.6.6 → taskledger-0.6.7}/docs/documentation_freshness.md +0 -0
  234. {taskledger-0.6.6 → taskledger-0.6.7}/docs/full_task_cycle.md +0 -0
  235. {taskledger-0.6.6 → taskledger-0.6.7}/docs/index.md +0 -0
  236. {taskledger-0.6.6 → taskledger-0.6.7}/docs/multi_repo.md +0 -0
  237. {taskledger-0.6.6 → taskledger-0.6.7}/docs/public_surface.md +0 -0
  238. {taskledger-0.6.6 → taskledger-0.6.7}/docs/release_checklist.md +0 -0
  239. {taskledger-0.6.6 → taskledger-0.6.7}/docs/requirements.txt +0 -0
  240. {taskledger-0.6.6 → taskledger-0.6.7}/docs/service_boundary_whitelist.md +0 -0
  241. {taskledger-0.6.6 → taskledger-0.6.7}/pyproject.toml +0 -0
  242. {taskledger-0.6.6 → taskledger-0.6.7}/requirements/manifest.json +0 -0
  243. {taskledger-0.6.6 → taskledger-0.6.7}/scripts/find_code_clones.py +0 -0
  244. {taskledger-0.6.6 → taskledger-0.6.7}/setup.cfg +0 -0
  245. {taskledger-0.6.6 → taskledger-0.6.7}/skills/taskledger/SKILL.md +0 -0
  246. {taskledger-0.6.6 → taskledger-0.6.7}/specmason.toml +0 -0
  247. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/README.md +0 -0
  248. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/UNMAPPED_TESTS.md +0 -0
  249. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/evidence/.gitkeep +0 -0
  250. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/evidence/taskledger-test-feature-coverage.json +0 -0
  251. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/.gitkeep +0 -0
  252. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/active_task/active-task.feature +0 -0
  253. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/actor_harness_state/actor-harness-state.feature +0 -0
  254. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/actor_resolution/actor-resolution.feature +0 -0
  255. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/agent_command_logging/agent-command-logging.feature +0 -0
  256. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/agent_session_protocol/agent-session-protocol.feature +0 -0
  257. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/atomic_fast_io/atomic-fast-io.feature +0 -0
  258. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/cli_command_contract/cli-command-contract.feature +0 -0
  259. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/cli_import_resilience/cli-import-resilience.feature +0 -0
  260. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/code_reviews/code-reviews.feature +0 -0
  261. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/command_example_linter/command-example-linter.feature +0 -0
  262. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/command_inventory/command-inventory.feature +0 -0
  263. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/command_runner/command-runner.feature +0 -0
  264. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/compact_mutation_output/compact-mutation-output.feature +0 -0
  265. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/config_cli/config-cli.feature +0 -0
  266. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/delta_remaining_contracts/delta-remaining-contracts.feature +0 -0
  267. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/docs_and_skill/docs-and-skill.feature +0 -0
  268. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/doctor/doctor.feature +0 -0
  269. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/domain_policies/domain-policies.feature +0 -0
  270. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/event_logging_config/event-logging-config.feature +0 -0
  271. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/events/events.feature +0 -0
  272. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/file_link_snapshots/file-link-snapshots.feature +0 -0
  273. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/find_code_clones_script/find-code-clones-script.feature +0 -0
  274. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/handoff_lifecycle/handoff-lifecycle.feature +0 -0
  275. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/help_subprocess/help-subprocess.feature +0 -0
  276. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/implementation_change_scan/implementation-change-scan.feature +0 -0
  277. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/implementation_checks/implementation-checks.feature +0 -0
  278. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/json_contracts/json-contracts.feature +0 -0
  279. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/legacy_cleanup_contracts/legacy-cleanup-contracts.feature +0 -0
  280. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/lifecycle_policies/lifecycle-policies.feature +0 -0
  281. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/lock_diagnostics/lock-diagnostics.feature +0 -0
  282. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/locks_audit/locks-audit.feature +0 -0
  283. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/models_v1_schema/models-v1-schema.feature +0 -0
  284. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/monitor/monitor.feature +0 -0
  285. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/next_action_expired_lock/next-action-expired-lock.feature +0 -0
  286. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/no_log_feature/no-log-feature.feature +0 -0
  287. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/plan_approval_contract/plan-approval-contract.feature +0 -0
  288. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/plan_lint/plan-lint.feature +0 -0
  289. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/plan_review/plan-review.feature +0 -0
  290. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/plan_revision_workflow/plan-revision-workflow.feature +0 -0
  291. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/plan_todo_materialization/plan-todo-materialization.feature +0 -0
  292. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/project_root_config/project-root-config.feature +0 -0
  293. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/question_add_many/question-add-many.feature +0 -0
  294. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/question_filter_answers/question-filter-answers.feature +0 -0
  295. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/question_plan_regeneration/question-plan-regeneration.feature +0 -0
  296. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/ready_work/ready-work.feature +0 -0
  297. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/release_changelog/release-changelog.feature +0 -0
  298. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/search/search.feature +0 -0
  299. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/service_boundaries/service-boundaries.feature +0 -0
  300. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/services_dashboard/services-dashboard.feature +0 -0
  301. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/sidecar_collections/sidecar-collections.feature +0 -0
  302. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/storage_bundle_layout/storage-bundle-layout.feature +0 -0
  303. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/storage_common/storage-common.feature +0 -0
  304. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/storage_init/storage-init.feature +0 -0
  305. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/storage_migration/storage-migration.feature +0 -0
  306. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/storage_repos/storage-repos.feature +0 -0
  307. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/storage_sync/storage-sync.feature +0 -0
  308. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/sync_git/sync-git.feature +0 -0
  309. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/task_archive/archive.feature +0 -0
  310. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/task_events/events.feature +0 -0
  311. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/task_markdown_export/markdown-export.feature +0 -0
  312. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/task_report/report.feature +0 -0
  313. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/taskledger_branch_scoped_ledgers/taskledger-branch-scoped-ledgers.feature +0 -0
  314. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/taskledger_cli_api_parity/taskledger-cli-api-parity.feature +0 -0
  315. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/taskledger_v2_cli/taskledger-v2-cli.feature +0 -0
  316. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/taskledger_v2_exchange/taskledger-v2-exchange.feature +0 -0
  317. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/tasks_service_static/tasks-service-static.feature +0 -0
  318. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/todo_implementation_gate/todo-implementation-gate.feature +0 -0
  319. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/trace/trace.feature +0 -0
  320. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/tree_command/tree-command.feature +0 -0
  321. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/usage_cli/usage-cli.feature +0 -0
  322. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/worker_pipeline_cli/worker-pipeline-cli.feature +0 -0
  323. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/worker_pipeline_config/worker-pipeline-config.feature +0 -0
  324. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/worker_pipeline_context/worker-pipeline-context.feature +0 -0
  325. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/worker_pipeline_handoff/worker-pipeline-handoff.feature +0 -0
  326. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/worker_pipeline_plan_template/worker-pipeline-plan-template.feature +0 -0
  327. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/worker_pipeline_todos/worker-pipeline-todos.feature +0 -0
  328. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/workflow_guidance/workflow-guidance.feature +0 -0
  329. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/manifest.json +0 -0
  330. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/mappings/.gitkeep +0 -0
  331. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/mappings/intentional-unmapped.json +0 -0
  332. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/reports/specmason/.gitkeep +0 -0
  333. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/reports/specmason/coverage.json +0 -0
  334. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/reports/specmason/coverage.md +0 -0
  335. {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/reports/specmason/mappings.json +0 -0
  336. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/__init__.py +0 -0
  337. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/__main__.py +0 -0
  338. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/__init__.py +0 -0
  339. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/handoff.py +0 -0
  340. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/introductions.py +0 -0
  341. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/locks.py +0 -0
  342. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/plans.py +0 -0
  343. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/project.py +0 -0
  344. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/questions.py +0 -0
  345. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/releases.py +0 -0
  346. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/repair.py +0 -0
  347. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/reviews.py +0 -0
  348. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/search.py +0 -0
  349. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/storage.py +0 -0
  350. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/sync.py +0 -0
  351. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/task_runs.py +0 -0
  352. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/tasks.py +0 -0
  353. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli.py +0 -0
  354. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_actor.py +0 -0
  355. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_archive.py +0 -0
  356. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_common.py +0 -0
  357. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_config.py +0 -0
  358. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_help.py +0 -0
  359. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_implement.py +0 -0
  360. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_ledger.py +0 -0
  361. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_migrate.py +0 -0
  362. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_misc.py +0 -0
  363. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_pipeline.py +0 -0
  364. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_plan.py +0 -0
  365. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_question.py +0 -0
  366. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_ref.py +0 -0
  367. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_release.py +0 -0
  368. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_review.py +0 -0
  369. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_runtime.py +0 -0
  370. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_storage.py +0 -0
  371. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_sync.py +0 -0
  372. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_task.py +0 -0
  373. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_trace.py +0 -0
  374. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_validate.py +0 -0
  375. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/command_inventory.py +0 -0
  376. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/compat/__init__.py +0 -0
  377. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/compat/ledgercore.py +0 -0
  378. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/__init__.py +0 -0
  379. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/_model_utils.py +0 -0
  380. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/active_state.py +0 -0
  381. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/actor.py +0 -0
  382. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/change.py +0 -0
  383. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/check.py +0 -0
  384. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/event.py +0 -0
  385. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/handoff.py +0 -0
  386. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/lock.py +0 -0
  387. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/models.py +0 -0
  388. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/plan.py +0 -0
  389. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/policies.py +0 -0
  390. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/question.py +0 -0
  391. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/release.py +0 -0
  392. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/review.py +0 -0
  393. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/run.py +0 -0
  394. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/sidecars.py +0 -0
  395. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/states.py +0 -0
  396. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/task.py +0 -0
  397. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/errors.py +0 -0
  398. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/ids.py +0 -0
  399. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/launcher.py +0 -0
  400. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/migrations/__init__.py +0 -0
  401. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/migrations/hooks.py +0 -0
  402. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/py.typed +0 -0
  403. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/refs.py +0 -0
  404. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/search.py +0 -0
  405. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/__init__.py +0 -0
  406. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/actors.py +0 -0
  407. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/agent_transcripts.py +0 -0
  408. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/check_tracking.py +0 -0
  409. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/code_review.py +0 -0
  410. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/command_runner.py +0 -0
  411. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/dashboard.py +0 -0
  412. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/doctor_checks/migration_checks.py +0 -0
  413. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/doctor_checks/project_scan.py +0 -0
  414. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/doctor_checks/task_checks.py +0 -0
  415. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/event_logging.py +0 -0
  416. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/file_links.py +0 -0
  417. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/git_utils.py +0 -0
  418. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/handoff.py +0 -0
  419. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/handoff_lifecycle.py +0 -0
  420. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/lock_diagnostics.py +0 -0
  421. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/lock_inventory.py +0 -0
  422. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/monitor.py +0 -0
  423. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/navigation.py +0 -0
  424. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/next_action_logic.py +0 -0
  425. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/next_action_model.py +0 -0
  426. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/next_action_payload.py +0 -0
  427. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/phase5_lock_transfer.py +0 -0
  428. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/plan_editing.py +0 -0
  429. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/plan_hash.py +0 -0
  430. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/plan_input.py +0 -0
  431. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/plan_lint.py +0 -0
  432. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/plan_materialization.py +0 -0
  433. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/plan_review.py +0 -0
  434. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/planning_flow.py +0 -0
  435. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/ready_work.py +0 -0
  436. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/releases.py +0 -0
  437. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/run_store.py +0 -0
  438. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/runtime_info.py +0 -0
  439. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/storage_locations.py +0 -0
  440. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/storage_migration.py +0 -0
  441. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/task_archive.py +0 -0
  442. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/task_collections.py +0 -0
  443. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/task_events.py +0 -0
  444. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/task_export.py +0 -0
  445. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/task_lifecycle.py +0 -0
  446. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/task_queries.py +0 -0
  447. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/task_repair.py +0 -0
  448. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/task_reports.py +0 -0
  449. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/trace.py +0 -0
  450. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/tree.py +0 -0
  451. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/usage.py +0 -0
  452. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/validation.py +0 -0
  453. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/worker_context.py +0 -0
  454. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/worker_pipeline.py +0 -0
  455. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/workflow_guidance.py +0 -0
  456. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/workspace_snapshot.py +0 -0
  457. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/__init__.py +0 -0
  458. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/atomic.py +0 -0
  459. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/common.py +0 -0
  460. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/events.py +0 -0
  461. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/frontmatter.py +0 -0
  462. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/index_cache.py +0 -0
  463. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/indexes.py +0 -0
  464. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/init.py +0 -0
  465. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/layout_migration.py +0 -0
  466. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/ledger_config.py +0 -0
  467. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/ledger_local_config.py +0 -0
  468. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/ledger_manifest.py +0 -0
  469. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/ledgercore_backend.py +0 -0
  470. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/locks.py +0 -0
  471. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/meta.py +0 -0
  472. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/migrations.py +0 -0
  473. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/paths.py +0 -0
  474. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/project_binding.py +0 -0
  475. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/project_context.py +0 -0
  476. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/project_identity.py +0 -0
  477. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/repos.py +0 -0
  478. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/sidecar_index.py +0 -0
  479. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/task_ids.py +0 -0
  480. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/task_index.py +0 -0
  481. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/task_store.py +0 -0
  482. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/taskledger_migration.py +0 -0
  483. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/toml_edit.py +0 -0
  484. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/worker_pipeline_config.py +0 -0
  485. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/yaml_store.py +0 -0
  486. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/timeutils.py +0 -0
  487. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger.egg-info/dependency_links.txt +0 -0
  488. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger.egg-info/entry_points.txt +0 -0
  489. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger.egg-info/requires.txt +0 -0
  490. {taskledger-0.6.6 → taskledger-0.6.7}/taskledger.egg-info/top_level.txt +0 -0
  491. {taskledger-0.6.6 → taskledger-0.6.7}/tests/__init__.py +0 -0
  492. {taskledger-0.6.6 → taskledger-0.6.7}/tests/conftest.py +0 -0
  493. {taskledger-0.6.6 → taskledger-0.6.7}/tests/support/__init__.py +0 -0
  494. {taskledger-0.6.6 → taskledger-0.6.7}/tests/support/builders.py +0 -0
  495. {taskledger-0.6.6 → taskledger-0.6.7}/tests/support/fake_command_runner.py +0 -0
  496. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_active_task.py +0 -0
  497. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_actor_harness_state.py +0 -0
  498. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_actor_resolution.py +0 -0
  499. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_agent_session_protocol.py +0 -0
  500. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_atomic_fast_io.py +0 -0
  501. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_canonical_config_split.py +0 -0
  502. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_canonical_layout_migration.py +0 -0
  503. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_canonical_mount_paths.py +0 -0
  504. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_canonical_project_boundary.py +0 -0
  505. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_canonical_project_context.py +0 -0
  506. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_cli_command_contract.py +0 -0
  507. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_cli_import_resilience.py +0 -0
  508. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_cli_runner_compatibility.py +0 -0
  509. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_code_reviews.py +0 -0
  510. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_command_example_linter.py +0 -0
  511. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_command_inventory.py +0 -0
  512. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_command_runner.py +0 -0
  513. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_compact_mutation_output.py +0 -0
  514. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_delta_remaining_contracts.py +0 -0
  515. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_docs_and_skill.py +0 -0
  516. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_domain_policies.py +0 -0
  517. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_error_contracts.py +0 -0
  518. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_event_logging_config.py +0 -0
  519. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_events.py +0 -0
  520. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_file_link_snapshots.py +0 -0
  521. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_find_code_clones_script.py +0 -0
  522. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_handoff_lifecycle.py +0 -0
  523. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_help_subprocess.py +0 -0
  524. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_implementation_change_scan.py +0 -0
  525. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_implementation_checks.py +0 -0
  526. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_import_boundaries.py +0 -0
  527. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_indexes.py +0 -0
  528. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_indexes_cache_recovery.py +0 -0
  529. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_json_contracts.py +0 -0
  530. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_ledger_manifest_mutation.py +0 -0
  531. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_ledgercore_compat.py +0 -0
  532. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_ledgercore_dependency.py +0 -0
  533. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_legacy_cleanup_contracts.py +0 -0
  534. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_lifecycle_policies.py +0 -0
  535. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_lock_diagnostics.py +0 -0
  536. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_lock_inventory.py +0 -0
  537. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_locks_audit.py +0 -0
  538. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_models_v1_schema.py +0 -0
  539. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_monitor.py +0 -0
  540. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_next_action_expired_lock.py +0 -0
  541. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_no_log_feature.py +0 -0
  542. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_performance_caching.py +0 -0
  543. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_plan_approval_contract.py +0 -0
  544. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_plan_input.py +0 -0
  545. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_plan_input_cli.py +0 -0
  546. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_plan_lint.py +0 -0
  547. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_plan_review.py +0 -0
  548. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_plan_revision_workflow.py +0 -0
  549. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_plan_todo_materialization.py +0 -0
  550. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_question_add_many.py +0 -0
  551. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_question_filter_answers.py +0 -0
  552. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_question_plan_regeneration.py +0 -0
  553. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_ready_work.py +0 -0
  554. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_release_changelog.py +0 -0
  555. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_resource_refs.py +0 -0
  556. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_runtime_info.py +0 -0
  557. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_search.py +0 -0
  558. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_service_boundaries.py +0 -0
  559. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_services_dashboard.py +0 -0
  560. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_shared_tool_ledger_storage.py +0 -0
  561. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_sidecar_collections.py +0 -0
  562. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_storage_bundle_layout.py +0 -0
  563. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_storage_common.py +0 -0
  564. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_storage_init.py +0 -0
  565. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_storage_migration.py +0 -0
  566. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_storage_migration_coordinator.py +0 -0
  567. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_storage_repos.py +0 -0
  568. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_storage_sync.py +0 -0
  569. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_storage_where_repair.py +0 -0
  570. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_storage_yaml_store.py +0 -0
  571. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_task_archive.py +0 -0
  572. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_task_events.py +0 -0
  573. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_task_ids.py +0 -0
  574. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_task_markdown_export.py +0 -0
  575. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_task_report.py +0 -0
  576. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_taskledger_branch_scoped_ledgers.py +0 -0
  577. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_taskledger_canonical_sync.py +0 -0
  578. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_taskledger_cli_api_parity.py +0 -0
  579. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_taskledger_ledgercore_050_adapter.py +0 -0
  580. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_taskledger_ledgercore_050_context.py +0 -0
  581. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_taskledger_ledgercore_050_migration_topology.py +0 -0
  582. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_taskledger_ledgercore_050_sync.py +0 -0
  583. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_taskledger_migration_v3.py +0 -0
  584. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_taskledger_sibling_migration.py +0 -0
  585. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_taskledger_sibling_storage.py +0 -0
  586. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_taskledger_storage_commands_v3.py +0 -0
  587. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_taskledger_v2_cli.py +0 -0
  588. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_tasks_service_static.py +0 -0
  589. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_todo_implementation_gate.py +0 -0
  590. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_trace.py +0 -0
  591. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_tree_command.py +0 -0
  592. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_usage_cli.py +0 -0
  593. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_validation_git_snapshot_recovery.py +0 -0
  594. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_worker_pipeline_cli.py +0 -0
  595. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_worker_pipeline_config.py +0 -0
  596. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_worker_pipeline_context.py +0 -0
  597. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_worker_pipeline_handoff.py +0 -0
  598. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_worker_pipeline_plan_template.py +0 -0
  599. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_worker_pipeline_todos.py +0 -0
  600. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_workflow_guidance.py +0 -0
  601. {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_workspace_snapshot.py +0 -0
@@ -44,3 +44,9 @@
44
44
  {"data":{"updated_rows":1},"event":"audit.updated","event_id":"event-0044","record_revisions":{"commit_audit_sheet":2},"release_version":"v0.6.6","schema_version":2}
45
45
  {"data":{"entry_ids":["entry-0001"],"synced_audit_rows":1},"event":"entry.batch_added","event_id":"event-0045","record_revisions":{"commit_audit_sheet":3,"entry:v0.6.6/entry-0001":1,"release:v0.6.6":3},"release_version":"v0.6.6","schema_version":2}
46
46
  {"data":{"released_at":"2026-09-04"},"event":"release.finalized","event_id":"event-0046","record_revisions":{"release:v0.6.6":4},"release_version":"v0.6.6","schema_version":2}
47
+ {"data":{"status":"planned"},"event":"release.created","event_id":"event-0047","record_revisions":{"release:v0.6.7":1},"release_version":"v0.6.7","schema_version":2}
48
+ {"data":{"fields":["git_base_ref","git_base_sha","git_commit_count","git_head_ref","git_head_sha","git_range"]},"event":"release.updated","event_id":"event-0048","record_revisions":{"release:v0.6.7":2},"release_version":"v0.6.7","schema_version":2}
49
+ {"data":{"row_count":1},"event":"audit.created","event_id":"event-0049","record_revisions":{"commit_audit_sheet":1},"release_version":"v0.6.7","schema_version":2}
50
+ {"data":{"updated_rows":1},"event":"audit.updated","event_id":"event-0050","record_revisions":{"commit_audit_sheet":2},"release_version":"v0.6.7","schema_version":2}
51
+ {"data":{"entry_ids":["entry-0001"],"synced_audit_rows":1},"event":"entry.batch_added","event_id":"event-0051","record_revisions":{"commit_audit_sheet":3,"entry:v0.6.7/entry-0001":1,"release:v0.6.7":3},"release_version":"v0.6.7","schema_version":2}
52
+ {"data":{"released_at":"2026-09-09"},"event":"release.finalized","event_id":"event-0052","record_revisions":{"release:v0.6.7":4},"release_version":"v0.6.7","schema_version":2}
@@ -0,0 +1,87 @@
1
+ schema_version: 1
2
+ object_type: commit_audit_sheet
3
+ versioning:
4
+ schema_version: 1
5
+ revision: 3
6
+ release_version: v0.6.7
7
+ git_base_ref: v0.6.6
8
+ git_base_sha: f7c915cf9d515ab1c15bdffeb73162340d7534df
9
+ git_head_ref: HEAD
10
+ git_head_sha: 562fc8796f821e312877f0c5b2aa09f5daddb138
11
+ git_range: f7c915cf9d515ab1c15bdffeb73162340d7534df..562fc8796f821e312877f0c5b2aa09f5daddb138
12
+ commit_count: 1
13
+ rows:
14
+ - sha: 562fc8796f821e312877f0c5b2aa09f5daddb138
15
+ source_ref: git:562fc8796f821e312877f0c5b2aa09f5daddb138
16
+ short_sha: 562fc87
17
+ changed_paths:
18
+ - README.md
19
+ - docs/command_contract.md
20
+ - docs/sync.md
21
+ - docs/transfer.md
22
+ - docs/usage.md
23
+ - taskledger/api/config.py
24
+ - taskledger/exchange.py
25
+ - taskledger/services/agent_logging.py
26
+ - taskledger/services/change_tracking.py
27
+ - taskledger/services/doctor.py
28
+ - taskledger/services/doctor_checks/artifact_checks.py
29
+ - taskledger/services/git_sync.py
30
+ - taskledger/services/implementation_flow.py
31
+ - taskledger/services/tasks.py
32
+ - taskledger/services/validation_flow.py
33
+ - taskledger/storage/agent_logs.py
34
+ - taskledger/storage/artifact_policy.py
35
+ - taskledger/storage/project_config.py
36
+ - tests/test_agent_command_logging.py
37
+ - tests/test_artifact_policy.py
38
+ - tests/test_config_cli.py
39
+ - tests/test_doctor.py
40
+ - tests/test_project_root_config.py
41
+ - tests/test_sync_git.py
42
+ - tests/test_taskledger_v2_exchange.py
43
+ - tests/test_validation_command.py
44
+ stats:
45
+ files_changed: 0
46
+ insertions: 700
47
+ deletions: 33
48
+ inspected: true
49
+ inspected_paths:
50
+ - README.md
51
+ - docs/command_contract.md
52
+ - docs/sync.md
53
+ - docs/transfer.md
54
+ - docs/usage.md
55
+ - taskledger/api/config.py
56
+ - taskledger/exchange.py
57
+ - taskledger/services/agent_logging.py
58
+ - taskledger/services/change_tracking.py
59
+ - taskledger/services/doctor.py
60
+ - taskledger/services/doctor_checks/artifact_checks.py
61
+ - taskledger/services/git_sync.py
62
+ - taskledger/services/implementation_flow.py
63
+ - taskledger/services/tasks.py
64
+ - taskledger/services/validation_flow.py
65
+ - taskledger/storage/agent_logs.py
66
+ - taskledger/storage/artifact_policy.py
67
+ - taskledger/storage/project_config.py
68
+ - tests/test_agent_command_logging.py
69
+ - tests/test_artifact_policy.py
70
+ - tests/test_config_cli.py
71
+ - tests/test_doctor.py
72
+ - tests/test_project_root_config.py
73
+ - tests/test_sync_git.py
74
+ - tests/test_taskledger_v2_exchange.py
75
+ - tests/test_validation_command.py
76
+ observed_behavior:
77
+ Added a shared artifact-size policy that bounds stored command
78
+ output to a configurable limit capped at 20,000,000 bytes, preserves UTF-8-safe
79
+ head/tail excerpts with truncation metadata, rejects oversized existing artifacts
80
+ during doctor, export/import, and managed Git sync, and documents the policy with
81
+ regression coverage.
82
+ public_impact: public
83
+ decision: accepted
84
+ stale: false
85
+ evidence_subject: "feat: limit artifact file size"
86
+ target_entry_id: entry-0001
87
+ notes: ""
@@ -0,0 +1,53 @@
1
+ ---
2
+ schema_version: 2
3
+ object_type: release_entry
4
+ versioning:
5
+ schema_version: 1
6
+ revision: 1
7
+ entry_id: entry-0001
8
+ release_version: v0.6.7
9
+ kind: added
10
+ summary:
11
+ Added configurable artifact limits with UTF-8-safe truncation across command
12
+ evidence, archives, doctor, and Git sync
13
+ status: accepted
14
+ audience: null
15
+ scopes: []
16
+ source_refs:
17
+ - git:562fc8796f821e312877f0c5b2aa09f5daddb138
18
+ paths:
19
+ - README.md
20
+ - docs/command_contract.md
21
+ - docs/sync.md
22
+ - docs/transfer.md
23
+ - docs/usage.md
24
+ - taskledger/api/config.py
25
+ - taskledger/exchange.py
26
+ - taskledger/services/agent_logging.py
27
+ - taskledger/services/change_tracking.py
28
+ - taskledger/services/doctor.py
29
+ - taskledger/services/doctor_checks/artifact_checks.py
30
+ - taskledger/services/git_sync.py
31
+ - taskledger/services/implementation_flow.py
32
+ - taskledger/services/tasks.py
33
+ - taskledger/services/validation_flow.py
34
+ - taskledger/storage/agent_logs.py
35
+ - taskledger/storage/artifact_policy.py
36
+ - taskledger/storage/project_config.py
37
+ - tests/test_agent_command_logging.py
38
+ - tests/test_artifact_policy.py
39
+ - tests/test_config_cli.py
40
+ - tests/test_doctor.py
41
+ - tests/test_project_root_config.py
42
+ - tests/test_sync_git.py
43
+ - tests/test_taskledger_v2_exchange.py
44
+ - tests/test_validation_command.py
45
+ issues: []
46
+ prs: []
47
+ sources:
48
+ - git:562fc8796f821e312877f0c5b2aa09f5daddb138
49
+ contributors: []
50
+ breaking: false
51
+ internal: false
52
+ order: 1
53
+ ---
@@ -0,0 +1,27 @@
1
+ ---
2
+ schema_version: 2
3
+ object_type: release
4
+ versioning:
5
+ schema_version: 1
6
+ revision: 4
7
+ version: v0.6.7
8
+ status: released
9
+ history_state: curated
10
+ title: Release v0.6.7
11
+ released_at: "2026-09-09"
12
+ previous_version: v0.6.6
13
+ cancel_reason: null
14
+ superseded_by: null
15
+ changelog_file: null
16
+ boundary_ref: null
17
+ source_refs: []
18
+ source_count: null
19
+ entry_count: 1
20
+ artifact_count: 0
21
+ git_base_ref: v0.6.6
22
+ git_base_sha: f7c915cf9d515ab1c15bdffeb73162340d7534df
23
+ git_head_ref: HEAD
24
+ git_head_sha: 562fc8796f821e312877f0c5b2aa09f5daddb138
25
+ git_range: f7c915cf9d515ab1c15bdffeb73162340d7534df..562fc8796f821e312877f0c5b2aa09f5daddb138
26
+ git_commit_count: 1
27
+ ---
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taskledger
3
- Version: 0.6.6
3
+ Version: 0.6.7
4
4
  Summary: Durable project-state storage and CLI for coding workflows
5
5
  Author: Taskledger Contributors
6
6
  Maintainer: Holger Nahrstaedt
@@ -837,6 +837,12 @@ Import safety still relies on `project_uuid`, not the name/slug.
837
837
  - `--no-include-bodies` strips record body text (`body` / `context_body`) from exported payloads.
838
838
  - `--include-run-artifacts` embeds task and agent-log artifact files under `artifacts/` in the archive.
839
839
 
840
+ ## Artifact file-size policy
841
+
842
+ Taskledger-owned artifact files are bounded to prevent command output from creating very large ledger blobs. The default and hard ceiling is 20,000,000 bytes per artifact; configure a lower `artifact_max_bytes` value when needed. Oversized command evidence keeps a UTF-8-safe head and tail with an explicit truncation marker, while command execution and exit-code semantics remain unchanged.
843
+
844
+ Archive import/export applies the same policy, and `taskledger doctor` reports legacy oversized artifacts without reading their contents. `taskledger sync git push` performs a preflight before committing or pushing. Taskledger does not use Git LFS or rewrite Git history; repair existing blobs separately.
845
+
840
846
  Cross-machine imports preserve durable task/run data, but imported runtime locks
841
847
  are quarantined by default. After importing an in-progress implementation,
842
848
  run:
@@ -784,6 +784,12 @@ Import safety still relies on `project_uuid`, not the name/slug.
784
784
  - `--no-include-bodies` strips record body text (`body` / `context_body`) from exported payloads.
785
785
  - `--include-run-artifacts` embeds task and agent-log artifact files under `artifacts/` in the archive.
786
786
 
787
+ ## Artifact file-size policy
788
+
789
+ Taskledger-owned artifact files are bounded to prevent command output from creating very large ledger blobs. The default and hard ceiling is 20,000,000 bytes per artifact; configure a lower `artifact_max_bytes` value when needed. Oversized command evidence keeps a UTF-8-safe head and tail with an explicit truncation marker, while command execution and exit-code semantics remain unchanged.
790
+
791
+ Archive import/export applies the same policy, and `taskledger doctor` reports legacy oversized artifacts without reading their contents. `taskledger sync git push` performs a preflight before committing or pushing. Taskledger does not use Git LFS or rewrite Git history; repair existing blobs separately.
792
+
787
793
  Cross-machine imports preserve durable task/run data, but imported runtime locks
788
794
  are quarantined by default. After importing an in-progress implementation,
789
795
  run:
@@ -2,6 +2,14 @@
2
2
 
3
3
  > **Generated by releaseledger.** Manual edits may be overwritten. Update releaseledger entries and rebuild this file instead.
4
4
 
5
+ ## [v0.6.7] - 2026-09-09
6
+
7
+ ### Added
8
+
9
+ - Added configurable artifact limits with UTF-8-safe truncation across command evidence, archives, doctor, and Git sync
10
+
11
+ <!-- generated by releaseledger -->
12
+
5
13
  ## [v0.6.6] - 2026-09-04
6
14
 
7
15
  ### Added
@@ -451,6 +451,7 @@ shell. They execute the child from the CLI invocation directory, or the explicit
451
451
  `--root` directory, even when Taskledger discovers an ancestor workspace root for
452
452
  ledger state, artifacts, and logs.
453
453
 
454
+ Managed command artifacts are bounded by the project `artifact_max_bytes` setting, defaulting to the 20,000,000-byte hard ceiling. Oversized persisted evidence is marked and retains both its beginning and end; only the durable artifact is truncated, not the child command's exit code or CLI stdout/stderr contract.
454
455
  `validate command` uses the same managed execution behavior during an active validation run, but records command evidence only. It never automatically maps a non-zero child exit to a criterion result.
455
456
 
456
457
  Managed commands preserve the caller environment, but resolve child executable lookup
@@ -81,6 +81,10 @@ report project-local vs outside-project dirty paths. `sync git push` commits
81
81
  repository-wide changes by design to match the standard Git workflow. Use
82
82
  `sync git cd` for advanced manual inspection or conflict resolution.
83
83
 
84
+ ## Artifact preflight
85
+
86
+ `taskledger sync git push` checks Taskledger-owned artifact files before staging or committing. It refuses any existing file over the configured `artifact_max_bytes` limit and reports the paths, sizes, limit, and `taskledger doctor` remediation. Plain `git push` remains outside Taskledger's control, and Taskledger does not rewrite history or use Git LFS.
87
+
84
88
  For manual conflict resolution or debugging:
85
89
 
86
90
  ```bash
@@ -13,6 +13,12 @@ machines and harnesses.
13
13
  \- `project.ledger_ref` (exported ledger)
14
14
  - Optional run artifacts under `artifacts/` when `--include-run-artifacts` is set.
15
15
 
16
+ ## Artifact file-size policy
17
+
18
+ Taskledger-owned artifact files default to a 20,000,000-byte hard ceiling. Projects may lower this with `artifact_max_bytes`, but cannot configure an unlimited or larger value. Oversized command output is stored as a UTF-8-safe head/tail excerpt with an explicit byte-count marker; the managed command's output and exit code are unchanged.
19
+
20
+ Import/export enforce the same limit. Run `taskledger doctor` to find existing oversized files; `taskledger sync git push` refuses them before creating a commit. This does not rewrite existing Git history or use Git LFS.
21
+
16
22
  ## Filename policy
17
23
 
18
24
  When no output path is passed to `taskledger export`, taskledger writes into
@@ -762,6 +762,9 @@ Export include flags are content-affecting:
762
762
  - `--no-include-bodies` removes record body fields from the exported payload.
763
763
  - `--include-run-artifacts` embeds artifact files under `artifacts/` in the archive.
764
764
 
765
+ ## Artifact file-size policy
766
+
767
+ Taskledger-owned artifact files are limited to 20,000,000 bytes by default and may only be lowered with `artifact_max_bytes`. Oversized command evidence retains its head and tail and includes a deterministic truncation marker; it does not change command execution or exit-code behavior. Import/export, doctor, and Taskledger-managed Git push enforce the same policy. Existing Git history is not rewritten and Git LFS is not used.
765
768
  Cross-machine imports preserve durable task/run records but quarantine imported
766
769
  runtime locks by default. For an imported in-progress implementation, run:
767
770
 
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.6.6'
22
- __version_tuple__ = version_tuple = (0, 6, 6)
21
+ __version__ = version = '0.6.7'
22
+ __version_tuple__ = version_tuple = (0, 6, 7)
23
23
 
24
- __commit_id__ = commit_id = 'gf7c915cf9'
24
+ __commit_id__ = commit_id = 'gfa5b2b772'
@@ -116,6 +116,13 @@ _CONFIG_KEY_HELP: tuple[ConfigKeyHelp, ...] = (
116
116
  "boolean",
117
117
  default_value=_DEFAULT_CONFIG.default_save_run_reports,
118
118
  ),
119
+ ConfigKeyHelp(
120
+ "artifact_max_bytes",
121
+ "Maximum stored size of a Taskledger-owned artifact file; may only lower "
122
+ "the hard ceiling.",
123
+ "integer",
124
+ default_value=_DEFAULT_CONFIG.artifact_max_bytes,
125
+ ),
119
126
  ConfigKeyHelp(
120
127
  "default_source_max_chars",
121
128
  "Per-source character budget for context composition.",
@@ -601,6 +608,11 @@ def config_set(workspace_root: Path, *, key: str, value_text: str) -> dict[str,
601
608
  target[segment] = table()
602
609
  target = target[segment]
603
610
  target[segments[-1]] = value
611
+ from taskledger.storage.project_config import _validate_project_config_overrides
612
+
613
+ _validate_project_config_overrides(
614
+ tomllib.loads(dumps(document)), context.config_path
615
+ )
604
616
  atomic_write_text(context.config_path, dumps(document))
605
617
  after = config_get(workspace_root, key=key)["value"]
606
618
  else:
@@ -42,11 +42,13 @@ from taskledger.storage.agent_logs import (
42
42
  append_agent_command_log,
43
43
  load_agent_command_logs,
44
44
  )
45
+ from taskledger.storage.artifact_policy import ABSOLUTE_MAX_ARTIFACT_BYTES
45
46
  from taskledger.storage.atomic import atomic_write_text
46
47
  from taskledger.storage.events import append_event, load_events
47
48
  from taskledger.storage.indexes import rebuild_v2_indexes
48
49
  from taskledger.storage.locks import write_lock
49
50
  from taskledger.storage.paths import load_project_locator
51
+ from taskledger.storage.project_context import load_project_context
50
52
  from taskledger.storage.project_identity import (
51
53
  assert_same_project_uuid,
52
54
  load_project_uuid,
@@ -765,7 +767,7 @@ ARTIFACTS_PREFIX = "artifacts/"
765
767
  MAX_ARCHIVE_MEMBERS = 4096
766
768
  MAX_MANIFEST_BYTES = 256_000
767
769
  MAX_PAYLOAD_BYTES = 50_000_000
768
- MAX_ARTIFACT_MEMBER_BYTES = 20_000_000
770
+ MAX_ARTIFACT_MEMBER_BYTES = ABSOLUTE_MAX_ARTIFACT_BYTES
769
771
  MAX_TOTAL_ARTIFACT_BYTES = 100_000_000
770
772
 
771
773
 
@@ -781,6 +783,7 @@ def write_project_archive(
781
783
  """Export current-ledger state into a gzip-compressed tar archive."""
782
784
  paths = require_v2_layout(workspace_root)
783
785
  locator = load_project_locator(workspace_root)
786
+ artifact_limit = load_project_context(workspace_root).config.artifact_max_bytes
784
787
  project_uuid = load_project_uuid(locator.config_path)
785
788
  if project_uuid is None:
786
789
  raise LaunchError("Project manifest does not define a project UUID.")
@@ -846,6 +849,7 @@ def write_project_archive(
846
849
  _collect_artifact_members(
847
850
  paths,
848
851
  selected_task_ids=selected_task_ids if selection.scope == "tasks" else None,
852
+ max_bytes=artifact_limit,
849
853
  )
850
854
  if include_run_artifacts
851
855
  else []
@@ -881,7 +885,11 @@ def write_project_archive(
881
885
  }
882
886
 
883
887
 
884
- def read_project_archive(source_path: Path) -> dict[str, object]:
888
+ def read_project_archive(
889
+ source_path: Path,
890
+ *,
891
+ max_artifact_bytes: int | None = None,
892
+ ) -> dict[str, object]:
885
893
  """Read and validate a taskledger archive in-memory.
886
894
 
887
895
  Never extracts tar members to disk. Returns dict with keys
@@ -892,7 +900,9 @@ def read_project_archive(source_path: Path) -> dict[str, object]:
892
900
 
893
901
  with tarfile.open(source_path, "r:gz") as tar:
894
902
  members = {m.name: m for m in tar.getmembers()}
895
- artifact_members = _validate_archive_members(members)
903
+ artifact_members = _validate_archive_members(
904
+ members, max_artifact_bytes=max_artifact_bytes
905
+ )
896
906
 
897
907
  manifest_member = members[MANIFEST_MEMBER]
898
908
  payload_member = members[PAYLOAD_MEMBER]
@@ -962,7 +972,10 @@ def import_project_archive(
962
972
  ) -> dict[str, object]:
963
973
  """Import a taskledger archive into the current project."""
964
974
  normalized_lock_policy = normalize_import_lock_policy(lock_policy)
965
- archive = read_project_archive(source_path)
975
+ artifact_limit = load_project_context(
976
+ workspace_root, require_initialized=False
977
+ ).config.artifact_max_bytes
978
+ archive = read_project_archive(source_path, max_artifact_bytes=artifact_limit)
966
979
  payload = cast(dict[str, object], archive["payload"])
967
980
  manifest = cast(dict[str, object], archive["manifest"])
968
981
  artifact_members = cast(list[str], archive.get("artifact_members", []))
@@ -1216,7 +1229,15 @@ def _add_json_member(
1216
1229
 
1217
1230
 
1218
1231
  def _add_file_member(tar: tarfile.TarFile, name: str, source_path: Path) -> None:
1219
- data = source_path.read_bytes()
1232
+ size_bytes = source_path.stat().st_size
1233
+ if size_bytes > MAX_ARTIFACT_MEMBER_BYTES:
1234
+ raise LaunchError(
1235
+ "Cannot export oversized Taskledger artifact: "
1236
+ f"{source_path} ({size_bytes} bytes > {MAX_ARTIFACT_MEMBER_BYTES}). "
1237
+ "Run `taskledger doctor` and repair the artifact before exporting."
1238
+ )
1239
+ with source_path.open("rb") as source:
1240
+ data = source.read()
1220
1241
  info = tarfile.TarInfo(name)
1221
1242
  info.size = len(data)
1222
1243
  info.mtime = 0
@@ -1243,10 +1264,18 @@ def _default_task_archive_path(
1243
1264
  return Path(filename)
1244
1265
 
1245
1266
 
1267
+ def _relative_artifact_path(paths: V2Paths, source_path: Path) -> str:
1268
+ try:
1269
+ return source_path.relative_to(paths.project_dir).as_posix()
1270
+ except ValueError:
1271
+ return "logs/" + source_path.relative_to(paths.events_dir.parent).as_posix()
1272
+
1273
+
1246
1274
  def _collect_artifact_members(
1247
1275
  paths: V2Paths,
1248
1276
  *,
1249
1277
  selected_task_ids: set[str] | None = None,
1278
+ max_bytes: int = MAX_ARTIFACT_MEMBER_BYTES,
1250
1279
  ) -> list[tuple[str, Path]]:
1251
1280
  artifact_roots = [paths.tasks_dir.glob("task-*/artifacts/**/*")]
1252
1281
  if selected_task_ids is None:
@@ -1258,6 +1287,15 @@ def _collect_artifact_members(
1258
1287
  for source_path in iterator:
1259
1288
  if not source_path.is_file():
1260
1289
  continue
1290
+ size_bytes = source_path.stat().st_size
1291
+ if size_bytes > max_bytes:
1292
+ relative_path = _relative_artifact_path(paths, source_path)
1293
+ raise LaunchError(
1294
+ "Cannot export oversized Taskledger artifact: "
1295
+ f"{relative_path}\n{size_bytes} bytes > "
1296
+ f"artifact_max_bytes={max_bytes}. "
1297
+ "Run `taskledger doctor` and repair the artifact before exporting."
1298
+ )
1261
1299
  if selected_task_ids is not None:
1262
1300
  match = re.search(
1263
1301
  r"/tasks/(task-\d+)/artifacts/", source_path.as_posix()
@@ -1322,7 +1360,11 @@ def _extract_artifact_members(
1322
1360
  return extracted
1323
1361
 
1324
1362
 
1325
- def _validate_archive_members(members: dict[str, tarfile.TarInfo]) -> list[str]:
1363
+ def _validate_archive_members(
1364
+ members: dict[str, tarfile.TarInfo],
1365
+ *,
1366
+ max_artifact_bytes: int | None = None,
1367
+ ) -> list[str]:
1326
1368
  if MANIFEST_MEMBER not in members:
1327
1369
  raise LaunchError(f"Archive missing {MANIFEST_MEMBER}")
1328
1370
  if PAYLOAD_MEMBER not in members:
@@ -1357,10 +1399,19 @@ def _validate_archive_members(members: dict[str, tarfile.TarInfo]) -> list[str]:
1357
1399
  raise LaunchError(f"Unexpected archive member: {name!r}")
1358
1400
  if not info.isfile():
1359
1401
  raise LaunchError(f"Archive member {name!r} is not a regular file")
1360
- if info.size > MAX_ARTIFACT_MEMBER_BYTES:
1402
+ artifact_limit = MAX_ARTIFACT_MEMBER_BYTES
1403
+ if max_artifact_bytes is not None:
1404
+ artifact_limit = min(artifact_limit, max_artifact_bytes)
1405
+ if info.size > artifact_limit:
1406
+ if artifact_limit < MAX_ARTIFACT_MEMBER_BYTES:
1407
+ raise LaunchError(
1408
+ "Archive artifact member is too large for this Taskledger project: "
1409
+ f"{name!r}\n{info.size} bytes > "
1410
+ f"configured artifact_max_bytes={artifact_limit}."
1411
+ )
1361
1412
  raise LaunchError(
1362
1413
  "Archive artifact member is too large: "
1363
- f"{name!r} ({info.size} > {MAX_ARTIFACT_MEMBER_BYTES} bytes)"
1414
+ f"{name!r} ({info.size} > {artifact_limit} bytes)"
1364
1415
  )
1365
1416
  total_artifact_bytes += info.size
1366
1417
  if total_artifact_bytes > MAX_TOTAL_ARTIFACT_BYTES:
@@ -8,7 +8,7 @@ import sys
8
8
  import time
9
9
  from collections.abc import Callable
10
10
  from contextvars import ContextVar
11
- from dataclasses import dataclass
11
+ from dataclasses import dataclass, replace
12
12
  from pathlib import Path
13
13
  from typing import TextIO
14
14
 
@@ -23,6 +23,10 @@ from taskledger.storage.agent_logs import (
23
23
  load_agent_command_logs,
24
24
  write_agent_command_artifact,
25
25
  )
26
+ from taskledger.storage.artifact_policy import (
27
+ ABSOLUTE_MAX_ARTIFACT_BYTES,
28
+ bound_text_to_bytes,
29
+ )
26
30
  from taskledger.storage.project_config import (
27
31
  AgentLoggingConfig,
28
32
  load_project_config_overrides,
@@ -525,7 +529,13 @@ def _load_agent_logging_config(workspace_root: Path) -> AgentLoggingConfig:
525
529
 
526
530
  paths = resolve_project_paths(workspace_root)
527
531
  overrides = load_project_config_overrides(paths)
528
- return merge_project_config(overrides).agent_logging
532
+ project_config = merge_project_config(overrides)
533
+ agent_config = project_config.agent_logging
534
+ feature_limit = agent_config.max_artifact_bytes
535
+ effective_limit = project_config.artifact_max_bytes
536
+ if feature_limit is not None:
537
+ effective_limit = min(effective_limit, feature_limit)
538
+ return replace(agent_config, max_artifact_bytes=effective_limit)
529
539
 
530
540
 
531
541
  def _next_log_id(workspace_root: Path, timestamp: str) -> str:
@@ -557,13 +567,8 @@ def _json_text(payload: object) -> str:
557
567
 
558
568
 
559
569
  def _truncate_artifact(content: str, max_bytes: int | None) -> str:
560
- if max_bytes is None:
561
- return content
562
- encoded = content.encode("utf-8")
563
- if len(encoded) <= max_bytes:
564
- return content
565
- truncated = encoded[:max_bytes]
566
- return truncated.decode("utf-8", errors="ignore")
570
+ limit = ABSOLUTE_MAX_ARTIFACT_BYTES if max_bytes is None else max_bytes
571
+ return bound_text_to_bytes(content, max_bytes=limit).text
567
572
 
568
573
 
569
574
  def _combined_output(stdout: str, stderr: str) -> str:
@@ -185,15 +185,18 @@ def run_planning_command(
185
185
  command_cwd=execution_cwd,
186
186
  )
187
187
  output = _tasks._command_output(argv, completed.stdout, completed.stderr)
188
- artifact_ref: str | None = None
188
+ artifact_result = None
189
189
  if len(output) > 4000 or output.count("\n") > 50:
190
- artifact_ref = _tasks._write_command_artifact(
190
+ artifact_result = _tasks._write_command_artifact(
191
191
  workspace_root,
192
192
  task.id,
193
193
  run.run_id,
194
194
  output,
195
195
  )
196
- summary = _tasks._command_summary(argv, completed.returncode, artifact_ref)
196
+ artifact_ref = artifact_result.ref if artifact_result is not None else None
197
+ summary = _tasks._command_summary(
198
+ argv, completed.returncode, artifact_ref, artifact_result
199
+ )
197
200
  updated_run = replace(
198
201
  run,
199
202
  worklog=(*run.worklog, summary),
@@ -222,6 +225,16 @@ def run_planning_command(
222
225
  "exit_code": completed.returncode,
223
226
  "cwd": str(execution_cwd),
224
227
  "artifact_path": artifact_ref,
228
+ "artifact_truncated": artifact_result.truncated if artifact_result else False,
229
+ "artifact_original_bytes": artifact_result.original_bytes
230
+ if artifact_result
231
+ else None,
232
+ "artifact_stored_bytes": artifact_result.stored_bytes
233
+ if artifact_result
234
+ else None,
235
+ "artifact_limit_bytes": artifact_result.limit_bytes
236
+ if artifact_result
237
+ else None,
225
238
  "stdout": completed.stdout,
226
239
  "stderr": completed.stderr,
227
240
  }
@@ -12,6 +12,7 @@ from taskledger.domain.models import (
12
12
  TaskRunRecord,
13
13
  )
14
14
  from taskledger.domain.states import TASKLEDGER_STORAGE_LAYOUT_VERSION
15
+ from taskledger.errors import LaunchError
15
16
  from taskledger.storage.events import load_events
16
17
  from taskledger.storage.locks import lock_is_expired
17
18
  from taskledger.storage.migrations import inspect_records_for_migration
@@ -50,6 +51,8 @@ class DoctorScanContext:
50
51
  run_by_key: Mapping[tuple[str, str], TaskRunRecord]
51
52
  active_state: ActiveTaskState | None
52
53
 
54
+ artifact_limit_bytes: int
55
+
53
56
 
54
57
  def _build_scan_context(workspace_root: Path) -> DoctorScanContext:
55
58
  """Build the immutable scan context once at the start of a doctor invocation."""
@@ -57,6 +60,12 @@ def _build_scan_context(workspace_root: Path) -> DoctorScanContext:
57
60
  locator = load_project_locator(workspace_root)
58
61
  paths = resolve_v2_paths(workspace_root)
59
62
 
63
+ from taskledger.storage.artifact_policy import ABSOLUTE_MAX_ARTIFACT_BYTES
64
+ from taskledger.storage.project_config import (
65
+ load_project_config_document,
66
+ merge_project_config,
67
+ )
68
+
60
69
  tasks = tuple(list_tasks(workspace_root))
61
70
  task_by_id: dict[str, TaskRecord] = {task.id: task for task in tasks}
62
71
 
@@ -74,6 +83,12 @@ def _build_scan_context(workspace_root: Path) -> DoctorScanContext:
74
83
  active_state = load_active_task_state(workspace_root)
75
84
  except Exception: # noqa: BLE001
76
85
  active_state = None
86
+ try:
87
+ artifact_limit_bytes = merge_project_config(
88
+ load_project_config_document(resolved_paths.config_path)
89
+ ).artifact_max_bytes
90
+ except LaunchError:
91
+ artifact_limit_bytes = ABSOLUTE_MAX_ARTIFACT_BYTES
77
92
 
78
93
  return DoctorScanContext(
79
94
  workspace_root=workspace_root,
@@ -86,6 +101,7 @@ def _build_scan_context(workspace_root: Path) -> DoctorScanContext:
86
101
  runs_by_task=runs_by_task,
87
102
  run_by_key=run_by_key,
88
103
  active_state=active_state,
104
+ artifact_limit_bytes=artifact_limit_bytes,
89
105
  )
90
106
 
91
107
 
@@ -142,6 +158,16 @@ def _inspect_v2_project_phases(workspace_root: Path) -> dict[str, object]:
142
158
  diagnostics=diagnostics,
143
159
  )
144
160
 
161
+ from taskledger.services.doctor_checks.artifact_checks import (
162
+ find_oversized_artifacts,
163
+ )
164
+
165
+ for diagnostic in find_oversized_artifacts(
166
+ ctx.paths, max_bytes=ctx.artifact_limit_bytes
167
+ ):
168
+ diagnostics.append(diagnostic)
169
+ errors.append(str(diagnostic["message"]))
170
+
145
171
  for lock in ctx.locks:
146
172
  lock_task = ctx.task_by_id.get(lock.task_id)
147
173
  if lock_task is None: