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.
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/events/events.jsonl +6 -0
- taskledger-0.6.7/.ledger/releaseledger/data/ledgers/main/releases/v0.6.7/audit/commit-audit.yaml +87 -0
- taskledger-0.6.7/.ledger/releaseledger/data/ledgers/main/releases/v0.6.7/entries/entry-0001.md +53 -0
- taskledger-0.6.7/.ledger/releaseledger/data/ledgers/main/releases/v0.6.7/release.md +27 -0
- {taskledger-0.6.6/taskledger.egg-info → taskledger-0.6.7}/PKG-INFO +7 -1
- {taskledger-0.6.6 → taskledger-0.6.7}/README.md +6 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/docs/changelog.md +8 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/docs/command_contract.md +1 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/docs/sync.md +4 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/docs/transfer.md +6 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/docs/usage.md +3 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/_version.py +3 -3
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/config.py +12 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/exchange.py +59 -8
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/agent_logging.py +14 -9
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/change_tracking.py +16 -3
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/doctor.py +26 -0
- taskledger-0.6.7/taskledger/services/doctor_checks/artifact_checks.py +83 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/git_sync.py +28 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/implementation_flow.py +16 -3
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/tasks.py +30 -4
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/validation_flow.py +16 -3
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/agent_logs.py +6 -1
- taskledger-0.6.7/taskledger/storage/artifact_policy.py +106 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/project_config.py +29 -2
- {taskledger-0.6.6 → taskledger-0.6.7/taskledger.egg-info}/PKG-INFO +7 -1
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger.egg-info/SOURCES.txt +6 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger.egg-info/scm_file_list.json +6 -0
- taskledger-0.6.7/taskledger.egg-info/scm_version.json +8 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_agent_command_logging.py +12 -0
- taskledger-0.6.7/tests/test_artifact_policy.py +63 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_config_cli.py +25 -2
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_doctor.py +31 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_project_root_config.py +19 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_sync_git.py +36 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_taskledger_v2_exchange.py +14 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_validation_command.py +45 -0
- taskledger-0.6.6/taskledger.egg-info/scm_version.json +0 -8
- {taskledger-0.6.6 → taskledger-0.6.7}/.codecrate.toml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.github/workflows/codecov.yml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.github/workflows/pre-commit.yml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.github/workflows/python-publish.yml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.github/workflows/tests.yml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.gitignore +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/.archledger-migration-20260821T090309Z/config.toml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/.ledger-project.toml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/config.toml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/.ledger-project.toml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/archive/records/building_blocks/block-0083.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/archive/records/concepts/concept-0081.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/archive/records/runtime/runtime-0076.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/archive/records/runtime/runtime-0084.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/document-state.json +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/migrations/20260821T090309Z-ledgercore-0.4-repository-storage.json +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/migrations/migration-cbe21be3f9dc3db4b03f6366.json +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/profiles/arc42/sections/content-0001.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/profiles/arc42/sections/content-0002.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/profiles/arc42/sections/content-0003.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/profiles/arc42/sections/content-0004.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/profiles/arc42/sections/content-0005.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/profiles/arc42/sections/content-0006.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/profiles/arc42/sections/content-0007.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/profiles/arc42/sections/content-0008.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/profiles/arc42/sections/content-0009.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/profiles/arc42/sections/content-0010.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/profiles/arc42/sections/content-0011.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/profiles/arc42/sections/content-0012.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/building_blocks/block-0029.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/building_blocks/block-0030.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/building_blocks/block-0031.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/building_blocks/block-0032.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/building_blocks/block-0033.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/building_blocks/block-0034.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/concepts/concept-0040.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/concepts/concept-0041.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/concepts/concept-0042.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/concepts/concept-0043.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/concepts/concept-0044.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/concepts/concept-0045.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/concepts/concept-0082.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/concepts/concept-0085.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/concepts/concept-0086.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/constraints/constraint-0016.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/constraints/constraint-0017.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/constraints/constraint-0018.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/constraints/constraint-0019.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/contexts/context-0020.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/contexts/context-0021.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/contexts/context-0022.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/contexts/context-0023.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/decisions/adr-0046.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/decisions/adr-0047.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/decisions/adr-0048.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/decisions/adr-0049.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/decisions/adr-0050.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/decisions/adr-0051.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/deployment/deploy-0039.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/glossary/glossary-0061.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/glossary/glossary-0062.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/glossary/glossary-0063.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/glossary/glossary-0064.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/glossary/glossary-0065.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/glossary/glossary-0066.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/glossary/glossary-0067.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/glossary/glossary-0068.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/glossary/glossary-0069.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/glossary/glossary-0070.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/glossary/glossary-0071.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/glossary/glossary-0072.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/glossary/glossary-0073.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/quality_requirements/quality-0052.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/quality_requirements/quality-0053.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/quality_requirements/quality-0054.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/quality_requirements/quality-0055.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/quality_requirements/quality-0056.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/requirements/content-0013.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/requirements/content-0014.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/requirements/content-0015.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/risks/risk-0057.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/risks/risk-0058.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/risks/risk-0059.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/risks/risk-0060.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/runtime/runtime-0035.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/runtime/runtime-0036.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/runtime/runtime-0037.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/runtime/runtime-0038.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/runtime/runtime-0074.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/runtime/runtime-0075.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/runtime/runtime-0077.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/runtime/runtime-0078.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/runtime/runtime-0087.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/runtime/runtime-0088.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/stakeholders/content-0079.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/stakeholders/content-0080.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/strategy/strategy-0024.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/strategy/strategy-0025.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/strategy/strategy-0026.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/strategy/strategy-0027.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/records/strategy/strategy-0028.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/source-state.json +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/data/storage.yaml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/archledger/migrations/migration-66baa70bad8a0bb5ae852133.json +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/.ledger-project.toml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/config.toml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/.ledger-project.toml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/docs/docs-api-md-9eddf4dc.yaml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/docs/docs-architecture-taskledger-split-md-63034c0d.yaml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/docs/docs-command-contract-md-abe6f6d9.yaml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/docs/docs-full-task-cycle-md-721181f0.yaml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/docs/docs-multi-repo-md-929e47a9.yaml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/docs/docs-public-surface-md-c1b8772f.yaml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/docs/docs-service-boundary-whitelist-md-800b76f5.yaml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/docs/docs-sync-md-a29422f3.yaml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/docs/docs-transfer-md-f8532303.yaml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/docs/docs-usage-md-72376d0b.yaml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/scan.yaml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/source-index.json +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/documentledger/data/storage.yaml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/ledger.toml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/migrations/documentledger-bb67fdd8e51cff33.toml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/.ledger-project.toml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/config.toml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/.ledger-project.toml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0001.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0002.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0003.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0004.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0005.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0006.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0007.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0008.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0009.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0010.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0011.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0012.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0013.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0014.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0015.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0016.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0017.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0018.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0019.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0020.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0021.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0022.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0023.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/release.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.1/entries/entry-0001.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.1/entries/entry-0002.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.1/entries/entry-0003.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.1/entries/entry-0004.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.1/entries/entry-0005.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.1/release.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.2/entries/entry-0001.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.2/entries/entry-0002.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.2/entries/entry-0003.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.2/entries/entry-0004.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.2/release.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.3/audit/commit-audit.yaml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.3/entries/entry-0001.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.3/release.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.4/audit/commit-audit.yaml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.4/entries/entry-0001.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.4/entries/entry-0002.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.4/entries/entry-0003.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.4/release.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.5/audit/commit-audit.yaml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.5/entries/entry-0001.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.5/entries/entry-0002.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.5/entries/entry-0003.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.5/release.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.6/audit/commit-audit.yaml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.6/entries/entry-0001.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.6/release.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/write.lock +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/task/config.toml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/taskledger/.ledger-project.toml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ledger/taskledger/config.toml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.planledger.toml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.pre-commit-config.yaml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.readthedocs.yaml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/.ruff.toml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/AGENTS.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/API.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/LICENSE +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/Makefile +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/docs/Makefile +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/docs/api.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/docs/architecture.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/docs/architecture_taskledger_split.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/docs/build.sh +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/docs/conf.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/docs/documentation_freshness.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/docs/full_task_cycle.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/docs/index.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/docs/multi_repo.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/docs/public_surface.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/docs/release_checklist.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/docs/requirements.txt +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/docs/service_boundary_whitelist.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/pyproject.toml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/requirements/manifest.json +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/scripts/find_code_clones.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/setup.cfg +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/skills/taskledger/SKILL.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specmason.toml +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/README.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/UNMAPPED_TESTS.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/evidence/.gitkeep +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/evidence/taskledger-test-feature-coverage.json +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/.gitkeep +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/active_task/active-task.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/actor_harness_state/actor-harness-state.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/actor_resolution/actor-resolution.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/agent_command_logging/agent-command-logging.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/agent_session_protocol/agent-session-protocol.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/atomic_fast_io/atomic-fast-io.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/cli_command_contract/cli-command-contract.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/cli_import_resilience/cli-import-resilience.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/code_reviews/code-reviews.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/command_example_linter/command-example-linter.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/command_inventory/command-inventory.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/command_runner/command-runner.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/compact_mutation_output/compact-mutation-output.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/config_cli/config-cli.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/delta_remaining_contracts/delta-remaining-contracts.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/docs_and_skill/docs-and-skill.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/doctor/doctor.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/domain_policies/domain-policies.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/event_logging_config/event-logging-config.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/events/events.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/file_link_snapshots/file-link-snapshots.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/find_code_clones_script/find-code-clones-script.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/handoff_lifecycle/handoff-lifecycle.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/help_subprocess/help-subprocess.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/implementation_change_scan/implementation-change-scan.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/implementation_checks/implementation-checks.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/json_contracts/json-contracts.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/legacy_cleanup_contracts/legacy-cleanup-contracts.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/lifecycle_policies/lifecycle-policies.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/lock_diagnostics/lock-diagnostics.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/locks_audit/locks-audit.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/models_v1_schema/models-v1-schema.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/monitor/monitor.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/next_action_expired_lock/next-action-expired-lock.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/no_log_feature/no-log-feature.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/plan_approval_contract/plan-approval-contract.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/plan_lint/plan-lint.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/plan_review/plan-review.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/plan_revision_workflow/plan-revision-workflow.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/plan_todo_materialization/plan-todo-materialization.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/project_root_config/project-root-config.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/question_add_many/question-add-many.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/question_filter_answers/question-filter-answers.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/question_plan_regeneration/question-plan-regeneration.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/ready_work/ready-work.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/release_changelog/release-changelog.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/search/search.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/service_boundaries/service-boundaries.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/services_dashboard/services-dashboard.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/sidecar_collections/sidecar-collections.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/storage_bundle_layout/storage-bundle-layout.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/storage_common/storage-common.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/storage_init/storage-init.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/storage_migration/storage-migration.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/storage_repos/storage-repos.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/storage_sync/storage-sync.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/sync_git/sync-git.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/task_archive/archive.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/task_events/events.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/task_markdown_export/markdown-export.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/task_report/report.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/taskledger_branch_scoped_ledgers/taskledger-branch-scoped-ledgers.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/taskledger_cli_api_parity/taskledger-cli-api-parity.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/taskledger_v2_cli/taskledger-v2-cli.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/taskledger_v2_exchange/taskledger-v2-exchange.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/tasks_service_static/tasks-service-static.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/todo_implementation_gate/todo-implementation-gate.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/trace/trace.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/tree_command/tree-command.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/usage_cli/usage-cli.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/worker_pipeline_cli/worker-pipeline-cli.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/worker_pipeline_config/worker-pipeline-config.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/worker_pipeline_context/worker-pipeline-context.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/worker_pipeline_handoff/worker-pipeline-handoff.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/worker_pipeline_plan_template/worker-pipeline-plan-template.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/worker_pipeline_todos/worker-pipeline-todos.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/features/workflow_guidance/workflow-guidance.feature +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/manifest.json +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/mappings/.gitkeep +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/mappings/intentional-unmapped.json +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/reports/specmason/.gitkeep +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/reports/specmason/coverage.json +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/reports/specmason/coverage.md +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/specs/behavior/reports/specmason/mappings.json +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/__init__.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/__main__.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/__init__.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/handoff.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/introductions.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/locks.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/plans.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/project.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/questions.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/releases.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/repair.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/reviews.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/search.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/storage.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/sync.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/task_runs.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/api/tasks.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_actor.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_archive.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_common.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_config.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_help.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_implement.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_ledger.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_migrate.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_misc.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_pipeline.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_plan.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_question.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_ref.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_release.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_review.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_runtime.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_storage.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_sync.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_task.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_trace.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/cli_validate.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/command_inventory.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/compat/__init__.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/compat/ledgercore.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/__init__.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/_model_utils.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/active_state.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/actor.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/change.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/check.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/event.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/handoff.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/lock.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/models.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/plan.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/policies.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/question.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/release.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/review.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/run.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/sidecars.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/states.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/domain/task.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/errors.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/ids.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/launcher.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/migrations/__init__.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/migrations/hooks.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/py.typed +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/refs.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/search.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/__init__.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/actors.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/agent_transcripts.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/check_tracking.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/code_review.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/command_runner.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/dashboard.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/doctor_checks/migration_checks.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/doctor_checks/project_scan.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/doctor_checks/task_checks.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/event_logging.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/file_links.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/git_utils.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/handoff.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/handoff_lifecycle.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/lock_diagnostics.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/lock_inventory.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/monitor.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/navigation.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/next_action_logic.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/next_action_model.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/next_action_payload.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/phase5_lock_transfer.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/plan_editing.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/plan_hash.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/plan_input.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/plan_lint.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/plan_materialization.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/plan_review.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/planning_flow.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/ready_work.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/releases.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/run_store.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/runtime_info.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/storage_locations.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/storage_migration.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/task_archive.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/task_collections.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/task_events.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/task_export.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/task_lifecycle.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/task_queries.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/task_repair.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/task_reports.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/trace.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/tree.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/usage.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/validation.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/worker_context.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/worker_pipeline.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/workflow_guidance.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/services/workspace_snapshot.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/__init__.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/atomic.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/common.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/events.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/frontmatter.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/index_cache.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/indexes.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/init.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/layout_migration.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/ledger_config.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/ledger_local_config.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/ledger_manifest.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/ledgercore_backend.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/locks.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/meta.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/migrations.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/paths.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/project_binding.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/project_context.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/project_identity.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/repos.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/sidecar_index.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/task_ids.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/task_index.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/task_store.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/taskledger_migration.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/toml_edit.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/worker_pipeline_config.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/storage/yaml_store.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger/timeutils.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger.egg-info/dependency_links.txt +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger.egg-info/entry_points.txt +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger.egg-info/requires.txt +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/taskledger.egg-info/top_level.txt +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/__init__.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/conftest.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/support/__init__.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/support/builders.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/support/fake_command_runner.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_active_task.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_actor_harness_state.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_actor_resolution.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_agent_session_protocol.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_atomic_fast_io.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_canonical_config_split.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_canonical_layout_migration.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_canonical_mount_paths.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_canonical_project_boundary.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_canonical_project_context.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_cli_command_contract.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_cli_import_resilience.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_cli_runner_compatibility.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_code_reviews.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_command_example_linter.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_command_inventory.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_command_runner.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_compact_mutation_output.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_delta_remaining_contracts.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_docs_and_skill.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_domain_policies.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_error_contracts.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_event_logging_config.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_events.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_file_link_snapshots.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_find_code_clones_script.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_handoff_lifecycle.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_help_subprocess.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_implementation_change_scan.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_implementation_checks.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_import_boundaries.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_indexes.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_indexes_cache_recovery.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_json_contracts.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_ledger_manifest_mutation.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_ledgercore_compat.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_ledgercore_dependency.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_legacy_cleanup_contracts.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_lifecycle_policies.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_lock_diagnostics.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_lock_inventory.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_locks_audit.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_models_v1_schema.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_monitor.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_next_action_expired_lock.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_no_log_feature.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_performance_caching.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_plan_approval_contract.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_plan_input.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_plan_input_cli.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_plan_lint.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_plan_review.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_plan_revision_workflow.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_plan_todo_materialization.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_question_add_many.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_question_filter_answers.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_question_plan_regeneration.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_ready_work.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_release_changelog.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_resource_refs.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_runtime_info.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_search.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_service_boundaries.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_services_dashboard.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_shared_tool_ledger_storage.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_sidecar_collections.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_storage_bundle_layout.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_storage_common.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_storage_init.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_storage_migration.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_storage_migration_coordinator.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_storage_repos.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_storage_sync.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_storage_where_repair.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_storage_yaml_store.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_task_archive.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_task_events.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_task_ids.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_task_markdown_export.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_task_report.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_taskledger_branch_scoped_ledgers.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_taskledger_canonical_sync.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_taskledger_cli_api_parity.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_taskledger_ledgercore_050_adapter.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_taskledger_ledgercore_050_context.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_taskledger_ledgercore_050_migration_topology.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_taskledger_ledgercore_050_sync.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_taskledger_migration_v3.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_taskledger_sibling_migration.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_taskledger_sibling_storage.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_taskledger_storage_commands_v3.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_taskledger_v2_cli.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_tasks_service_static.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_todo_implementation_gate.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_trace.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_tree_command.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_usage_cli.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_validation_git_snapshot_recovery.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_worker_pipeline_cli.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_worker_pipeline_config.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_worker_pipeline_context.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_worker_pipeline_handoff.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_worker_pipeline_plan_template.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_worker_pipeline_todos.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_workflow_guidance.py +0 -0
- {taskledger-0.6.6 → taskledger-0.6.7}/tests/test_workspace_snapshot.py +0 -0
{taskledger-0.6.6 → taskledger-0.6.7}/.ledger/releaseledger/data/ledgers/main/events/events.jsonl
RENAMED
|
@@ -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}
|
taskledger-0.6.7/.ledger/releaseledger/data/ledgers/main/releases/v0.6.7/audit/commit-audit.yaml
ADDED
|
@@ -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: ""
|
taskledger-0.6.7/.ledger/releaseledger/data/ledgers/main/releases/v0.6.7/entries/entry-0001.md
ADDED
|
@@ -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.
|
|
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.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 6,
|
|
21
|
+
__version__ = version = '0.6.7'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 6, 7)
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
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 =
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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} > {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
188
|
+
artifact_result = None
|
|
189
189
|
if len(output) > 4000 or output.count("\n") > 50:
|
|
190
|
-
|
|
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
|
-
|
|
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:
|