taskledger 0.6.1__tar.gz → 0.6.2__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.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/events/events.jsonl +9 -0
- taskledger-0.6.2/.ledger/releaseledger/data/ledgers/main/releases/v0.6.2/entries/entry-0001.md +27 -0
- taskledger-0.6.2/.ledger/releaseledger/data/ledgers/main/releases/v0.6.2/entries/entry-0002.md +27 -0
- taskledger-0.6.2/.ledger/releaseledger/data/ledgers/main/releases/v0.6.2/entries/entry-0003.md +27 -0
- taskledger-0.6.2/.ledger/releaseledger/data/ledgers/main/releases/v0.6.2/entries/entry-0004.md +25 -0
- taskledger-0.6.2/.ledger/releaseledger/data/ledgers/main/releases/v0.6.2/release.md +26 -0
- {taskledger-0.6.1/taskledger.egg-info → taskledger-0.6.2}/PKG-INFO +1 -1
- {taskledger-0.6.1 → taskledger-0.6.2}/docs/changelog.md +17 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/docs/command_contract.md +13 -4
- {taskledger-0.6.1 → taskledger-0.6.2}/docs/sync.md +9 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/skills/taskledger/SKILL.md +7 -1
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/_version.py +3 -3
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/api/storage.py +17 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/cli_misc.py +5 -1
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/errors.py +7 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/tasks.py +7 -1
- taskledger-0.6.2/taskledger/storage/index_cache.py +199 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/ledgercore_backend.py +11 -1
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/project_context.py +22 -1
- {taskledger-0.6.1 → taskledger-0.6.2/taskledger.egg-info}/PKG-INFO +1 -1
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger.egg-info/SOURCES.txt +7 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger.egg-info/scm_file_list.json +7 -0
- taskledger-0.6.2/taskledger.egg-info/scm_version.json +8 -0
- taskledger-0.6.2/tests/test_indexes_cache_recovery.py +213 -0
- taskledger-0.6.1/taskledger.egg-info/scm_version.json +0 -8
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/archive/records/building_blocks/block-0083.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/archive/records/concepts/concept-0081.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/archive/records/runtime/runtime-0076.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/archive/records/runtime/runtime-0084.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/document-state.json +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/profiles/arc42/sections/content-0001.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/profiles/arc42/sections/content-0002.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/profiles/arc42/sections/content-0003.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/profiles/arc42/sections/content-0004.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/profiles/arc42/sections/content-0005.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/profiles/arc42/sections/content-0006.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/profiles/arc42/sections/content-0007.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/profiles/arc42/sections/content-0008.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/profiles/arc42/sections/content-0009.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/profiles/arc42/sections/content-0010.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/profiles/arc42/sections/content-0011.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/profiles/arc42/sections/content-0012.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/building_blocks/block-0029.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/building_blocks/block-0030.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/building_blocks/block-0031.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/building_blocks/block-0032.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/building_blocks/block-0033.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/building_blocks/block-0034.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/concepts/concept-0040.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/concepts/concept-0041.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/concepts/concept-0042.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/concepts/concept-0043.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/concepts/concept-0044.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/concepts/concept-0045.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/concepts/concept-0082.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/concepts/concept-0085.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/concepts/concept-0086.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/constraints/constraint-0016.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/constraints/constraint-0017.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/constraints/constraint-0018.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/constraints/constraint-0019.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/contexts/context-0020.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/contexts/context-0021.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/contexts/context-0022.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/contexts/context-0023.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/decisions/adr-0046.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/decisions/adr-0047.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/decisions/adr-0048.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/decisions/adr-0049.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/decisions/adr-0050.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/decisions/adr-0051.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/deployment/deploy-0039.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/glossary/glossary-0061.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/glossary/glossary-0062.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/glossary/glossary-0063.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/glossary/glossary-0064.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/glossary/glossary-0065.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/glossary/glossary-0066.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/glossary/glossary-0067.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/glossary/glossary-0068.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/glossary/glossary-0069.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/glossary/glossary-0070.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/glossary/glossary-0071.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/glossary/glossary-0072.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/glossary/glossary-0073.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/quality_requirements/quality-0052.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/quality_requirements/quality-0053.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/quality_requirements/quality-0054.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/quality_requirements/quality-0055.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/quality_requirements/quality-0056.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/requirements/content-0013.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/requirements/content-0014.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/requirements/content-0015.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/risks/risk-0057.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/risks/risk-0058.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/risks/risk-0059.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/risks/risk-0060.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/runtime/runtime-0035.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/runtime/runtime-0036.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/runtime/runtime-0037.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/runtime/runtime-0038.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/runtime/runtime-0074.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/runtime/runtime-0075.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/runtime/runtime-0077.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/runtime/runtime-0078.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/runtime/runtime-0087.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/runtime/runtime-0088.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/stakeholders/content-0079.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/stakeholders/content-0080.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/strategy/strategy-0024.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/strategy/strategy-0025.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/strategy/strategy-0026.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/strategy/strategy-0027.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/records/strategy/strategy-0028.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/source-state.json +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger/storage.yaml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.archledger.toml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.codecrate.toml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.documentledger/docs/docs-api-md-9eddf4dc.yaml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.documentledger/docs/docs-architecture-taskledger-split-md-63034c0d.yaml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.documentledger/docs/docs-command-contract-md-abe6f6d9.yaml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.documentledger/docs/docs-full-task-cycle-md-721181f0.yaml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.documentledger/docs/docs-multi-repo-md-929e47a9.yaml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.documentledger/docs/docs-public-surface-md-c1b8772f.yaml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.documentledger/docs/docs-service-boundary-whitelist-md-800b76f5.yaml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.documentledger/docs/docs-sync-md-a29422f3.yaml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.documentledger/docs/docs-transfer-md-f8532303.yaml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.documentledger/docs/docs-usage-md-72376d0b.yaml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.documentledger/scan.yaml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.documentledger/source-index.json +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.documentledger/storage.yaml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.documentledger.toml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.github/workflows/codecov.yml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.github/workflows/pre-commit.yml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.github/workflows/python-publish.yml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.github/workflows/tests.yml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.gitignore +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/ledger.toml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/.ledger-project.toml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/config.toml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/.ledger-project.toml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0001.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0002.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0003.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0004.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0005.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0006.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0007.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0008.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0009.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0010.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0011.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0012.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0013.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0014.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0015.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0016.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0017.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0018.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0019.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0020.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0021.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0022.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/entries/entry-0023.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.0/release.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.1/entries/entry-0001.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.1/entries/entry-0002.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.1/entries/entry-0003.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.1/entries/entry-0004.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.1/entries/entry-0005.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.6.1/release.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/write.lock +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/task/config.toml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/taskledger/.ledger-project.toml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ledger/taskledger/config.toml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.planledger.toml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.pre-commit-config.yaml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.readthedocs.yaml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/.ruff.toml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/AGENTS.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/API.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/ARCHITECTURE.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/LICENSE +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/Makefile +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/README.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/docs/Makefile +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/docs/api.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/docs/architecture_taskledger_split.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/docs/build.sh +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/docs/conf.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/docs/documentation_freshness.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/docs/full_task_cycle.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/docs/index.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/docs/multi_repo.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/docs/public_surface.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/docs/release_checklist.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/docs/requirements.txt +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/docs/service_boundary_whitelist.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/docs/transfer.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/docs/usage.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/pyproject.toml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/requirements/manifest.json +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/scripts/find_code_clones.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/setup.cfg +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specmason.toml +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/README.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/UNMAPPED_TESTS.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/evidence/.gitkeep +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/evidence/taskledger-test-feature-coverage.json +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/.gitkeep +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/active_task/active-task.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/actor_harness_state/actor-harness-state.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/actor_resolution/actor-resolution.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/agent_command_logging/agent-command-logging.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/agent_session_protocol/agent-session-protocol.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/atomic_fast_io/atomic-fast-io.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/cli_command_contract/cli-command-contract.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/cli_import_resilience/cli-import-resilience.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/code_reviews/code-reviews.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/command_example_linter/command-example-linter.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/command_inventory/command-inventory.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/command_runner/command-runner.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/compact_mutation_output/compact-mutation-output.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/config_cli/config-cli.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/delta_remaining_contracts/delta-remaining-contracts.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/docs_and_skill/docs-and-skill.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/doctor/doctor.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/domain_policies/domain-policies.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/event_logging_config/event-logging-config.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/events/events.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/file_link_snapshots/file-link-snapshots.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/find_code_clones_script/find-code-clones-script.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/handoff_lifecycle/handoff-lifecycle.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/help_subprocess/help-subprocess.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/implementation_change_scan/implementation-change-scan.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/implementation_checks/implementation-checks.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/json_contracts/json-contracts.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/legacy_cleanup_contracts/legacy-cleanup-contracts.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/lifecycle_policies/lifecycle-policies.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/lock_diagnostics/lock-diagnostics.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/locks_audit/locks-audit.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/models_v1_schema/models-v1-schema.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/monitor/monitor.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/next_action_expired_lock/next-action-expired-lock.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/no_log_feature/no-log-feature.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/plan_approval_contract/plan-approval-contract.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/plan_lint/plan-lint.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/plan_review/plan-review.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/plan_revision_workflow/plan-revision-workflow.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/plan_todo_materialization/plan-todo-materialization.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/project_root_config/project-root-config.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/question_add_many/question-add-many.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/question_filter_answers/question-filter-answers.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/question_plan_regeneration/question-plan-regeneration.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/ready_work/ready-work.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/release_changelog/release-changelog.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/search/search.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/service_boundaries/service-boundaries.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/services_dashboard/services-dashboard.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/sidecar_collections/sidecar-collections.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/storage_bundle_layout/storage-bundle-layout.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/storage_common/storage-common.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/storage_init/storage-init.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/storage_migration/storage-migration.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/storage_repos/storage-repos.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/storage_sync/storage-sync.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/sync_git/sync-git.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/task_archive/archive.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/task_events/events.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/task_markdown_export/markdown-export.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/task_report/report.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/taskledger_branch_scoped_ledgers/taskledger-branch-scoped-ledgers.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/taskledger_cli_api_parity/taskledger-cli-api-parity.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/taskledger_v2_cli/taskledger-v2-cli.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/taskledger_v2_exchange/taskledger-v2-exchange.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/tasks_service_static/tasks-service-static.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/todo_implementation_gate/todo-implementation-gate.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/trace/trace.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/tree_command/tree-command.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/usage_cli/usage-cli.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/worker_pipeline_cli/worker-pipeline-cli.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/worker_pipeline_config/worker-pipeline-config.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/worker_pipeline_context/worker-pipeline-context.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/worker_pipeline_handoff/worker-pipeline-handoff.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/worker_pipeline_plan_template/worker-pipeline-plan-template.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/worker_pipeline_todos/worker-pipeline-todos.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/features/workflow_guidance/workflow-guidance.feature +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/manifest.json +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/mappings/.gitkeep +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/mappings/intentional-unmapped.json +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/reports/specmason/.gitkeep +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/reports/specmason/coverage.json +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/reports/specmason/coverage.md +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/specs/behavior/reports/specmason/mappings.json +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/__init__.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/__main__.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/api/__init__.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/api/config.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/api/handoff.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/api/introductions.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/api/locks.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/api/plans.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/api/project.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/api/questions.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/api/releases.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/api/repair.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/api/reviews.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/api/search.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/api/sync.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/api/task_runs.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/api/tasks.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/cli.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/cli_actor.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/cli_archive.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/cli_common.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/cli_config.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/cli_help.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/cli_implement.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/cli_ledger.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/cli_migrate.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/cli_pipeline.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/cli_plan.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/cli_question.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/cli_ref.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/cli_release.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/cli_review.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/cli_runtime.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/cli_storage.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/cli_sync.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/cli_task.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/cli_trace.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/cli_validate.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/command_inventory.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/compat/__init__.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/compat/ledgercore.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/domain/__init__.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/domain/_model_utils.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/domain/active_state.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/domain/actor.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/domain/change.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/domain/check.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/domain/event.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/domain/handoff.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/domain/lock.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/domain/models.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/domain/plan.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/domain/policies.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/domain/question.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/domain/release.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/domain/review.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/domain/run.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/domain/sidecars.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/domain/states.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/domain/task.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/exchange.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/ids.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/launcher.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/migrations/__init__.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/migrations/hooks.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/py.typed +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/refs.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/search.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/__init__.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/actors.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/agent_logging.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/agent_transcripts.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/change_tracking.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/check_tracking.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/code_review.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/command_runner.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/dashboard.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/doctor.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/doctor_checks/migration_checks.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/doctor_checks/project_scan.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/doctor_checks/task_checks.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/event_logging.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/file_links.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/git_sync.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/git_utils.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/handoff.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/handoff_lifecycle.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/implementation_flow.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/lock_diagnostics.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/lock_inventory.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/monitor.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/navigation.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/next_action_logic.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/next_action_model.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/next_action_payload.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/phase5_lock_transfer.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/plan_editing.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/plan_hash.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/plan_input.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/plan_lint.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/plan_materialization.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/plan_review.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/planning_flow.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/ready_work.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/releases.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/run_store.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/runtime_info.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/storage_locations.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/storage_migration.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/task_archive.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/task_collections.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/task_events.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/task_export.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/task_lifecycle.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/task_queries.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/task_repair.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/task_reports.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/trace.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/tree.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/usage.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/validation.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/validation_flow.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/worker_context.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/worker_pipeline.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/workflow_guidance.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/services/workspace_snapshot.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/__init__.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/agent_logs.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/atomic.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/common.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/events.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/frontmatter.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/indexes.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/init.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/layout_migration.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/ledger_config.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/ledger_local_config.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/ledger_manifest.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/locks.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/meta.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/migrations.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/paths.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/project_binding.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/project_config.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/project_identity.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/repos.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/sidecar_index.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/task_ids.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/task_index.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/task_store.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/taskledger_migration.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/toml_edit.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/worker_pipeline_config.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/storage/yaml_store.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger/timeutils.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger.egg-info/dependency_links.txt +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger.egg-info/entry_points.txt +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger.egg-info/requires.txt +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/taskledger.egg-info/top_level.txt +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/__init__.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/conftest.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/support/__init__.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/support/builders.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/support/fake_command_runner.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_active_task.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_actor_harness_state.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_actor_resolution.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_agent_command_logging.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_agent_session_protocol.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_atomic_fast_io.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_canonical_config_split.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_canonical_layout_migration.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_canonical_mount_paths.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_canonical_project_boundary.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_canonical_project_context.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_cli_command_contract.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_cli_import_resilience.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_cli_runner_compatibility.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_code_reviews.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_command_example_linter.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_command_inventory.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_command_runner.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_compact_mutation_output.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_config_cli.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_delta_remaining_contracts.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_docs_and_skill.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_doctor.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_domain_policies.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_error_contracts.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_event_logging_config.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_events.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_file_link_snapshots.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_find_code_clones_script.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_handoff_lifecycle.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_help_subprocess.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_implementation_change_scan.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_implementation_checks.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_import_boundaries.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_indexes.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_json_contracts.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_ledger_manifest_mutation.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_ledgercore_compat.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_ledgercore_dependency.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_legacy_cleanup_contracts.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_lifecycle_policies.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_lock_diagnostics.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_lock_inventory.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_locks_audit.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_models_v1_schema.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_monitor.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_next_action_expired_lock.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_no_log_feature.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_performance_caching.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_plan_approval_contract.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_plan_input.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_plan_input_cli.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_plan_lint.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_plan_review.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_plan_revision_workflow.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_plan_todo_materialization.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_project_root_config.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_question_add_many.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_question_filter_answers.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_question_plan_regeneration.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_ready_work.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_release_changelog.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_resource_refs.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_runtime_info.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_search.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_service_boundaries.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_services_dashboard.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_shared_tool_ledger_storage.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_sidecar_collections.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_storage_bundle_layout.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_storage_common.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_storage_init.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_storage_migration.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_storage_migration_coordinator.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_storage_repos.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_storage_sync.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_storage_where_repair.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_storage_yaml_store.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_sync_git.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_task_archive.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_task_events.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_task_ids.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_task_markdown_export.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_task_report.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_taskledger_branch_scoped_ledgers.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_taskledger_canonical_sync.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_taskledger_cli_api_parity.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_taskledger_ledgercore_050_adapter.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_taskledger_ledgercore_050_context.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_taskledger_ledgercore_050_migration_topology.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_taskledger_ledgercore_050_sync.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_taskledger_migration_v3.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_taskledger_sibling_migration.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_taskledger_sibling_storage.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_taskledger_storage_commands_v3.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_taskledger_v2_cli.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_taskledger_v2_exchange.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_tasks_service_static.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_todo_implementation_gate.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_trace.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_tree_command.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_usage_cli.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_validation_git_snapshot_recovery.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_worker_pipeline_cli.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_worker_pipeline_config.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_worker_pipeline_context.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_worker_pipeline_handoff.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_worker_pipeline_plan_template.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_worker_pipeline_todos.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_workflow_guidance.py +0 -0
- {taskledger-0.6.1 → taskledger-0.6.2}/tests/test_workspace_snapshot.py +0 -0
{taskledger-0.6.1 → taskledger-0.6.2}/.ledger/releaseledger/data/ledgers/main/events/events.jsonl
RENAMED
|
@@ -11,3 +11,12 @@
|
|
|
11
11
|
{"data":{"added_source_refs":["git:c1d0982"],"fields":["source_refs"],"removed_source_refs":[],"source_refs_mode":"merge"},"entry_id":"entry-0005","event":"entry.updated","event_id":"event-0011","record_revisions":{"entry:v0.6.1/entry-0005":2},"release_version":"v0.6.1","schema_version":2}
|
|
12
12
|
{"data":{"added_source_refs":["git:94965d3"],"fields":["source_refs"],"removed_source_refs":[],"source_refs_mode":"merge"},"entry_id":"entry-0004","event":"entry.updated","event_id":"event-0012","record_revisions":{"entry:v0.6.1/entry-0004":2},"release_version":"v0.6.1","schema_version":2}
|
|
13
13
|
{"data":{"released_at":"2026-08-14"},"event":"release.finalized","event_id":"event-0013","record_revisions":{"release:v0.6.1":7},"release_version":"v0.6.1","schema_version":2}
|
|
14
|
+
{"data":{"status":"planned"},"event":"release.created","event_id":"event-0014","record_revisions":{"release:v0.6.2":1},"release_version":"v0.6.2","schema_version":2}
|
|
15
|
+
{"data":{"kind":"added","status":"accepted"},"entry_id":"entry-0001","event":"entry.added","event_id":"event-0015","record_revisions":{"entry:v0.6.2/entry-0001":1,"release:v0.6.2":2},"release_version":"v0.6.2","schema_version":2}
|
|
16
|
+
{"data":{"added_source_refs":[],"fields":["kind","summary"],"removed_source_refs":[],"source_refs_mode":"unchanged"},"entry_id":"entry-0001","event":"entry.updated","event_id":"event-0016","record_revisions":{"entry:v0.6.2/entry-0001":2},"release_version":"v0.6.2","schema_version":2}
|
|
17
|
+
{"data":{"kind":"changed","status":"accepted"},"entry_id":"entry-0002","event":"entry.added","event_id":"event-0017","record_revisions":{"entry:v0.6.2/entry-0002":1,"release:v0.6.2":3},"release_version":"v0.6.2","schema_version":2}
|
|
18
|
+
{"data":{"kind":"fixed","status":"accepted"},"entry_id":"entry-0003","event":"entry.added","event_id":"event-0018","record_revisions":{"entry:v0.6.2/entry-0003":1,"release:v0.6.2":4},"release_version":"v0.6.2","schema_version":2}
|
|
19
|
+
{"data":{"kind":"docs","status":"accepted"},"entry_id":"entry-0004","event":"entry.added","event_id":"event-0019","record_revisions":{"entry:v0.6.2/entry-0004":1,"release:v0.6.2":5},"release_version":"v0.6.2","schema_version":2}
|
|
20
|
+
{"data":{"added_source_refs":[],"fields":["summary"],"removed_source_refs":[],"source_refs_mode":"unchanged"},"entry_id":"entry-0002","event":"entry.updated","event_id":"event-0020","record_revisions":{"entry:v0.6.2/entry-0002":2},"release_version":"v0.6.2","schema_version":2}
|
|
21
|
+
{"data":{"added_source_refs":[],"fields":["summary"],"removed_source_refs":[],"source_refs_mode":"unchanged"},"entry_id":"entry-0003","event":"entry.updated","event_id":"event-0021","record_revisions":{"entry:v0.6.2/entry-0003":2},"release_version":"v0.6.2","schema_version":2}
|
|
22
|
+
{"data":{"released_at":"2026-08-15"},"event":"release.finalized","event_id":"event-0022","record_revisions":{"release:v0.6.2":6},"release_version":"v0.6.2","schema_version":2}
|
taskledger-0.6.2/.ledger/releaseledger/data/ledgers/main/releases/v0.6.2/entries/entry-0001.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema_version: 2
|
|
3
|
+
object_type: release_entry
|
|
4
|
+
versioning:
|
|
5
|
+
schema_version: 1
|
|
6
|
+
revision: 2
|
|
7
|
+
entry_id: entry-0001
|
|
8
|
+
release_version: v0.6.2
|
|
9
|
+
kind: changed
|
|
10
|
+
summary:
|
|
11
|
+
Automatic indexes cache bootstrapping before canonical mutations with quarantine-based
|
|
12
|
+
recovery for unbound caches
|
|
13
|
+
status: accepted
|
|
14
|
+
audience: null
|
|
15
|
+
scopes: []
|
|
16
|
+
source_refs:
|
|
17
|
+
- git:6305f28
|
|
18
|
+
paths:
|
|
19
|
+
- taskledger/storage/index_cache.py
|
|
20
|
+
issues: []
|
|
21
|
+
prs: []
|
|
22
|
+
sources: []
|
|
23
|
+
contributors: []
|
|
24
|
+
breaking: false
|
|
25
|
+
internal: false
|
|
26
|
+
order: 1
|
|
27
|
+
---
|
taskledger-0.6.2/.ledger/releaseledger/data/ledgers/main/releases/v0.6.2/entries/entry-0002.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema_version: 2
|
|
3
|
+
object_type: release_entry
|
|
4
|
+
versioning:
|
|
5
|
+
schema_version: 1
|
|
6
|
+
revision: 2
|
|
7
|
+
entry_id: entry-0002
|
|
8
|
+
release_version: v0.6.2
|
|
9
|
+
kind: changed
|
|
10
|
+
summary:
|
|
11
|
+
Indexes mount is fixed to cache storage; `storage set indexes cache` is now
|
|
12
|
+
an idempotent topology request and non-cache indexes storage is rejected directly
|
|
13
|
+
status: accepted
|
|
14
|
+
audience: null
|
|
15
|
+
scopes: []
|
|
16
|
+
source_refs: []
|
|
17
|
+
paths:
|
|
18
|
+
- taskledger/api/storage.py
|
|
19
|
+
issues: []
|
|
20
|
+
prs: []
|
|
21
|
+
sources:
|
|
22
|
+
- git:6305f28
|
|
23
|
+
contributors: []
|
|
24
|
+
breaking: false
|
|
25
|
+
internal: false
|
|
26
|
+
order: 2
|
|
27
|
+
---
|
taskledger-0.6.2/.ledger/releaseledger/data/ledgers/main/releases/v0.6.2/entries/entry-0003.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema_version: 2
|
|
3
|
+
object_type: release_entry
|
|
4
|
+
versioning:
|
|
5
|
+
schema_version: 1
|
|
6
|
+
revision: 2
|
|
7
|
+
entry_id: entry-0003
|
|
8
|
+
release_version: v0.6.2
|
|
9
|
+
kind: fixed
|
|
10
|
+
summary:
|
|
11
|
+
"`reindex` command now reports cache recovery results and surfaces structured
|
|
12
|
+
errors for recovery failures"
|
|
13
|
+
status: accepted
|
|
14
|
+
audience: null
|
|
15
|
+
scopes: []
|
|
16
|
+
source_refs: []
|
|
17
|
+
paths:
|
|
18
|
+
- taskledger/services/tasks.py
|
|
19
|
+
issues: []
|
|
20
|
+
prs: []
|
|
21
|
+
sources:
|
|
22
|
+
- git:6305f28
|
|
23
|
+
contributors: []
|
|
24
|
+
breaking: false
|
|
25
|
+
internal: false
|
|
26
|
+
order: 3
|
|
27
|
+
---
|
taskledger-0.6.2/.ledger/releaseledger/data/ledgers/main/releases/v0.6.2/entries/entry-0004.md
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema_version: 2
|
|
3
|
+
object_type: release_entry
|
|
4
|
+
versioning:
|
|
5
|
+
schema_version: 1
|
|
6
|
+
revision: 1
|
|
7
|
+
entry_id: entry-0004
|
|
8
|
+
release_version: v0.6.2
|
|
9
|
+
kind: docs
|
|
10
|
+
summary: Documented indexes cache recovery behavior and multi-machine sync workflow
|
|
11
|
+
status: accepted
|
|
12
|
+
audience: null
|
|
13
|
+
scopes: []
|
|
14
|
+
source_refs: []
|
|
15
|
+
paths:
|
|
16
|
+
- docs/command_contract.md
|
|
17
|
+
issues: []
|
|
18
|
+
prs: []
|
|
19
|
+
sources:
|
|
20
|
+
- git:6305f28
|
|
21
|
+
contributors: []
|
|
22
|
+
breaking: false
|
|
23
|
+
internal: false
|
|
24
|
+
order: 4
|
|
25
|
+
---
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema_version: 2
|
|
3
|
+
object_type: release
|
|
4
|
+
versioning:
|
|
5
|
+
schema_version: 1
|
|
6
|
+
revision: 6
|
|
7
|
+
version: v0.6.2
|
|
8
|
+
status: released
|
|
9
|
+
title: Release v0.6.2
|
|
10
|
+
released_at: "2026-08-15"
|
|
11
|
+
previous_version: v0.6.1
|
|
12
|
+
cancel_reason: null
|
|
13
|
+
superseded_by: null
|
|
14
|
+
changelog_file: null
|
|
15
|
+
boundary_ref: null
|
|
16
|
+
source_refs: []
|
|
17
|
+
source_count: null
|
|
18
|
+
entry_count: 4
|
|
19
|
+
artifact_count: 0
|
|
20
|
+
git_base_ref: null
|
|
21
|
+
git_base_sha: null
|
|
22
|
+
git_head_ref: null
|
|
23
|
+
git_head_sha: null
|
|
24
|
+
git_range: null
|
|
25
|
+
git_commit_count: null
|
|
26
|
+
---
|
|
@@ -2,6 +2,23 @@
|
|
|
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.2] - 2026-08-15
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- Automatic indexes cache bootstrapping before canonical mutations with quarantine-based recovery for unbound caches
|
|
10
|
+
- Indexes mount is fixed to cache storage; `storage set indexes cache` is now an idempotent topology request and non-cache indexes storage is rejected directly
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- `reindex` command now reports cache recovery results and surfaces structured errors for recovery failures
|
|
15
|
+
|
|
16
|
+
### Documentation
|
|
17
|
+
|
|
18
|
+
- Documented indexes cache recovery behavior and multi-machine sync workflow
|
|
19
|
+
|
|
20
|
+
<!-- generated by releaseledger -->
|
|
21
|
+
|
|
5
22
|
## [v0.6.1] - 2026-08-14
|
|
6
23
|
|
|
7
24
|
### Added
|
|
@@ -664,15 +664,24 @@ taskledger ledger doctor
|
|
|
664
664
|
```
|
|
665
665
|
|
|
666
666
|
Checkout-scoped indexes under the resolved cache mount are optional derived
|
|
667
|
-
caches or registries.
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
667
|
+
caches or registries. Read-only commands continue to work from canonical
|
|
668
|
+
Markdown/YAML records and do not initialize a missing cache. Before a canonical
|
|
669
|
+
mutation, Taskledger initializes a missing or empty cache binding and rebuilds
|
|
670
|
+
the derived indexes. A non-empty cache without its binding marker is atomically
|
|
671
|
+
quarantined beside the cache and rebuilt from canonical records. Conflicting or
|
|
672
|
+
invalid markers, symlinks, and non-directory cache paths are not adopted
|
|
673
|
+
automatically. The remaining derived caches may be plain JSON arrays with no
|
|
674
|
+
version metadata and can be rebuilt explicitly with:
|
|
671
675
|
|
|
672
676
|
```bash
|
|
673
677
|
taskledger reindex
|
|
674
678
|
```
|
|
675
679
|
|
|
680
|
+
`taskledger repair index` uses the same recovery path and reports any quarantine
|
|
681
|
+
location. The `indexes` mount is fixed to cache storage, so
|
|
682
|
+
`taskledger storage set indexes cache` is an idempotent topology request;
|
|
683
|
+
non-cache indexes storage is rejected directly.
|
|
684
|
+
|
|
676
685
|
A newer storage version than the installed taskledger supports is rejected with
|
|
677
686
|
a clear error.
|
|
678
687
|
|
|
@@ -42,6 +42,15 @@ taskledger sync git push
|
|
|
42
42
|
|
|
43
43
|
## Second PC bootstrap
|
|
44
44
|
|
|
45
|
+
Indexes are checkout-local derived state and are not synchronized between PCs.
|
|
46
|
+
After opening a project on a new machine, deleting the local cache, or allowing
|
|
47
|
+
the cache to be evicted, read-only commands continue to use canonical records.
|
|
48
|
+
The first mutating command creates the local Ledgercore cache binding and
|
|
49
|
+
rebuilds the indexes automatically; no second `taskledger init` is required.
|
|
50
|
+
If a non-empty unbound cache is found, Taskledger preserves it as an
|
|
51
|
+
`indexes.quarantine-*` sibling before rebuilding. Use `taskledger repair index`
|
|
52
|
+
for explicit cache health repair.
|
|
53
|
+
|
|
45
54
|
Clone both repositories as siblings:
|
|
46
55
|
|
|
47
56
|
```bash
|
|
@@ -459,7 +459,13 @@ Lock recovery decision tree:
|
|
|
459
459
|
- If doctor reports a running implementation run with no matching lock and the task is still resumable, run `taskledger implement resume --task TASK --run RUN --reason "Reacquire implementation lock."`.
|
|
460
460
|
- Never use repair to bypass approval, validation, or active implementation locks.
|
|
461
461
|
- If validation fails, record the failure and return to implementation or replanning.
|
|
462
|
-
-
|
|
462
|
+
- Missing or empty checkout-local indexes caches are bootstrapped automatically
|
|
463
|
+
before canonical mutations and rebuilt from authoritative records. A
|
|
464
|
+
non-empty unbound cache is quarantined rather than deleted; conflicting
|
|
465
|
+
markers are not auto-adopted. Read-only commands do not bootstrap the cache.
|
|
466
|
+
- If indexes are stale or an unusual cache-binding problem needs explicit
|
|
467
|
+
repair, run `taskledger repair index`; `taskledger reindex` is a compatibility
|
|
468
|
+
alias. Do not tell users to manually create `.ledger-project.toml`.
|
|
463
469
|
- If a task is truly cancelled and the user wants to continue, use `taskledger task uncancel --task TASK_REF --reason "..." [--to STAGE]` to restore a safe durable stage before re-entering an active stage.
|
|
464
470
|
- If dependencies must be bypassed, only a user waiver may unblock implementation.
|
|
465
471
|
|
|
@@ -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.2'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 6, 2)
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
24
|
+
__commit_id__ = commit_id = 'g196a79e85'
|
|
@@ -148,6 +148,23 @@ def storage_set(
|
|
|
148
148
|
) -> dict[str, object]:
|
|
149
149
|
if mode not in {"copy", "move"}:
|
|
150
150
|
raise LaunchError("mode must be copy or move")
|
|
151
|
+
if mount == "indexes":
|
|
152
|
+
if storage != "cache":
|
|
153
|
+
raise LaunchError(
|
|
154
|
+
"TASKLEDGER_STORAGE_BINDING_INVALID: The Taskledger indexes mount "
|
|
155
|
+
"is fixed to cache storage.",
|
|
156
|
+
details={"mount": mount, "requested_storage": storage},
|
|
157
|
+
remediation=["Run `taskledger repair index` to rebuild the cache."],
|
|
158
|
+
)
|
|
159
|
+
report = build_storage_location_report(
|
|
160
|
+
workspace_root, require_initialized=False
|
|
161
|
+
).to_dict()
|
|
162
|
+
report["unchanged"] = True
|
|
163
|
+
report["message"] = "Indexes already use cache storage."
|
|
164
|
+
report["remediation"] = (
|
|
165
|
+
"Run `taskledger repair index` to rebuild the indexes cache."
|
|
166
|
+
)
|
|
167
|
+
return report
|
|
151
168
|
if storage == "external" and not external_root:
|
|
152
169
|
raise LaunchError("external storage requires --root")
|
|
153
170
|
migrate_taskledger_mount(
|
|
@@ -1210,7 +1210,11 @@ def emit_can_command(ctx: typer.Context, task_ref: str | None, action: str) -> N
|
|
|
1210
1210
|
|
|
1211
1211
|
def emit_reindex_command(ctx: typer.Context) -> None:
|
|
1212
1212
|
state = cli_state_from_context(ctx)
|
|
1213
|
-
|
|
1213
|
+
try:
|
|
1214
|
+
payload = reindex(state.cwd)
|
|
1215
|
+
except LaunchError as exc:
|
|
1216
|
+
emit_error(ctx, exc)
|
|
1217
|
+
raise typer.Exit(code=launch_error_exit_code(exc)) from exc
|
|
1214
1218
|
emit_payload(ctx, payload, human="reindexed v2 task state")
|
|
1215
1219
|
|
|
1216
1220
|
|
|
@@ -36,6 +36,7 @@ STORAGE_ERROR_CODES = frozenset(
|
|
|
36
36
|
"TASKLEDGER_LEDGER_SCHEMA_MIGRATION_REQUIRED",
|
|
37
37
|
"TASKLEDGER_REGISTRATION_INVALID",
|
|
38
38
|
"TASKLEDGER_STORAGE_BINDING_INVALID",
|
|
39
|
+
"TASKLEDGER_CACHE_RECOVERY_FAILED",
|
|
39
40
|
"TASKLEDGER_EXTERNAL_STORE_INVALID",
|
|
40
41
|
"TASKLEDGER_STORAGE_MIGRATION_ACTIVE_LOCKS",
|
|
41
42
|
"TASKLEDGER_STORAGE_MIGRATION_BLOCKED",
|
|
@@ -275,6 +276,12 @@ class StorageCorruption(LaunchError):
|
|
|
275
276
|
error_type = "StorageCorruption"
|
|
276
277
|
|
|
277
278
|
|
|
279
|
+
class CacheRecoveryFailed(LaunchError):
|
|
280
|
+
code = "TASKLEDGER_CACHE_RECOVERY_FAILED"
|
|
281
|
+
exit_code = 4
|
|
282
|
+
error_type = "CacheRecoveryFailed"
|
|
283
|
+
|
|
284
|
+
|
|
278
285
|
class ActiveTaskNotFound(StorageCorruption):
|
|
279
286
|
code = "ACTIVE_TASK_NOT_FOUND"
|
|
280
287
|
error_type = "StorageCorruption"
|
|
@@ -1564,12 +1564,18 @@ def task_dossier(
|
|
|
1564
1564
|
|
|
1565
1565
|
|
|
1566
1566
|
def reindex(workspace_root: Path) -> dict[str, object]:
|
|
1567
|
+
from taskledger.storage.project_context import require_mutable_project_context
|
|
1568
|
+
|
|
1569
|
+
context = require_mutable_project_context(workspace_root)
|
|
1567
1570
|
paths = ensure_v2_layout(workspace_root)
|
|
1568
1571
|
counts = rebuild_v2_indexes(paths)
|
|
1569
1572
|
_append_event(
|
|
1570
1573
|
workspace_root, "*", "repair.index", dict(cast(dict[str, object], counts))
|
|
1571
1574
|
)
|
|
1572
|
-
|
|
1575
|
+
payload: dict[str, object] = {"kind": "taskledger_reindex", "counts": counts}
|
|
1576
|
+
if context.cache_recovery is not None:
|
|
1577
|
+
payload["cache_recovery"] = context.cache_recovery.to_dict()
|
|
1578
|
+
return payload
|
|
1573
1579
|
|
|
1574
1580
|
|
|
1575
1581
|
def repair_task_record(*args, **kwargs): # type: ignore[no-untyped-def]
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"""Safe recovery for Taskledger's disposable indexes cache."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from datetime import datetime, timezone
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import TYPE_CHECKING, Any, Literal
|
|
9
|
+
from uuid import uuid4
|
|
10
|
+
|
|
11
|
+
from filelock import FileLock
|
|
12
|
+
|
|
13
|
+
from taskledger.errors import CacheRecoveryFailed, LaunchError
|
|
14
|
+
from taskledger.storage.ledgercore_backend import (
|
|
15
|
+
INDEX_MOUNT,
|
|
16
|
+
initialize_taskledger_bindings,
|
|
17
|
+
validate_taskledger_mount,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
from taskledger.storage.project_context import TaskledgerProjectContext
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@dataclass(frozen=True, slots=True)
|
|
25
|
+
class IndexCacheRecoveryResult:
|
|
26
|
+
"""Describe local cache maintenance performed before a mutation."""
|
|
27
|
+
|
|
28
|
+
action: Literal["initialized", "rebuilt", "quarantined_rebuilt"]
|
|
29
|
+
cache_root: Path
|
|
30
|
+
quarantine_path: Path | None
|
|
31
|
+
counts: dict[str, int]
|
|
32
|
+
|
|
33
|
+
def to_dict(self) -> dict[str, object]:
|
|
34
|
+
return {
|
|
35
|
+
"action": self.action,
|
|
36
|
+
"cache_path": str(self.cache_root),
|
|
37
|
+
"quarantine_path": (
|
|
38
|
+
str(self.quarantine_path) if self.quarantine_path is not None else None
|
|
39
|
+
),
|
|
40
|
+
"counts": dict(self.counts),
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _index_validation_result(
|
|
45
|
+
context: TaskledgerProjectContext, root: Path
|
|
46
|
+
) -> Any | None:
|
|
47
|
+
report = context.storage_validation
|
|
48
|
+
if report is None:
|
|
49
|
+
return None
|
|
50
|
+
return next(
|
|
51
|
+
(result for result in report.results if result.path == root),
|
|
52
|
+
None,
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _safe_recovery_candidate(context: TaskledgerProjectContext) -> bool:
|
|
57
|
+
if context.mode != "canonical" or context.layout is None:
|
|
58
|
+
return False
|
|
59
|
+
if context.initialization.status != "ready":
|
|
60
|
+
return False
|
|
61
|
+
manifest = getattr(context.loaded_project, "manifest", None)
|
|
62
|
+
if getattr(manifest, "schema_version", None) != 3:
|
|
63
|
+
return False
|
|
64
|
+
if (
|
|
65
|
+
not context.paths.data_root.is_dir()
|
|
66
|
+
or not context.paths.storage_meta_path.is_file()
|
|
67
|
+
):
|
|
68
|
+
return False
|
|
69
|
+
index_mount = context.layout.mounts.get(INDEX_MOUNT)
|
|
70
|
+
if index_mount is None or index_mount.storage != "cache":
|
|
71
|
+
return False
|
|
72
|
+
|
|
73
|
+
root = index_mount.path
|
|
74
|
+
index_result = _index_validation_result(context, root)
|
|
75
|
+
if index_result is not None and index_result.path != root:
|
|
76
|
+
return False
|
|
77
|
+
report = context.storage_validation
|
|
78
|
+
if report is not None and any(
|
|
79
|
+
not result.valid and result.path != root for result in report.results
|
|
80
|
+
):
|
|
81
|
+
return False
|
|
82
|
+
return True
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _expected_index_files_missing(context: TaskledgerProjectContext) -> bool:
|
|
86
|
+
paths = context.paths
|
|
87
|
+
return any(
|
|
88
|
+
not path.is_file()
|
|
89
|
+
for path in (
|
|
90
|
+
paths.task_index_path,
|
|
91
|
+
paths.active_locks_index_path,
|
|
92
|
+
paths.sidecar_index_path,
|
|
93
|
+
paths.introductions_index_path,
|
|
94
|
+
paths.dependencies_index_path,
|
|
95
|
+
)
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def _unique_quarantine_path(root: Path) -> Path:
|
|
100
|
+
stamp = datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%SZ")
|
|
101
|
+
while True:
|
|
102
|
+
candidate = root.with_name(f"{root.name}.quarantine-{stamp}-{uuid4().hex[:8]}")
|
|
103
|
+
if not candidate.exists() and not candidate.is_symlink():
|
|
104
|
+
return candidate
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def _recovery_failure(
|
|
108
|
+
root: Path,
|
|
109
|
+
quarantine: Path | None,
|
|
110
|
+
exc: Exception,
|
|
111
|
+
) -> CacheRecoveryFailed:
|
|
112
|
+
return CacheRecoveryFailed(
|
|
113
|
+
"TASKLEDGER_CACHE_RECOVERY_FAILED: unable to rebuild indexes cache "
|
|
114
|
+
f"{root}: {exc}",
|
|
115
|
+
details={
|
|
116
|
+
"cache_path": str(root),
|
|
117
|
+
"quarantine_path": str(quarantine) if quarantine is not None else None,
|
|
118
|
+
"operation": "rebuild",
|
|
119
|
+
"cause": str(exc),
|
|
120
|
+
},
|
|
121
|
+
remediation=[
|
|
122
|
+
"Run `taskledger storage validate`.",
|
|
123
|
+
"Run `taskledger repair index`.",
|
|
124
|
+
],
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def ensure_indexes_cache_for_mutation(
|
|
129
|
+
context: TaskledgerProjectContext,
|
|
130
|
+
) -> IndexCacheRecoveryResult | None:
|
|
131
|
+
"""Prepare the disposable indexes mount before writing derived state.
|
|
132
|
+
|
|
133
|
+
This helper is intentionally narrow: it only handles a canonical schema-3
|
|
134
|
+
cache mount after persistent config/data storage has validated successfully.
|
|
135
|
+
"""
|
|
136
|
+
if not _safe_recovery_candidate(context):
|
|
137
|
+
return None
|
|
138
|
+
|
|
139
|
+
layout = context.layout
|
|
140
|
+
if layout is None:
|
|
141
|
+
return None
|
|
142
|
+
index_mount = layout.mounts[INDEX_MOUNT]
|
|
143
|
+
root = index_mount.path
|
|
144
|
+
root.parent.mkdir(parents=True, exist_ok=True)
|
|
145
|
+
|
|
146
|
+
with FileLock(f"{root}.recovery.lock"):
|
|
147
|
+
if root.is_symlink() or (root.exists() and not root.is_dir()):
|
|
148
|
+
return None
|
|
149
|
+
|
|
150
|
+
marker = root / ".ledger-project.toml"
|
|
151
|
+
if marker.is_symlink():
|
|
152
|
+
return None
|
|
153
|
+
|
|
154
|
+
# Re-check after locking so a concurrent mutation can safely win.
|
|
155
|
+
validation = validate_taskledger_mount(index_mount, allow_missing=True)
|
|
156
|
+
if marker.exists():
|
|
157
|
+
if not validation.valid:
|
|
158
|
+
return None
|
|
159
|
+
if not _expected_index_files_missing(context):
|
|
160
|
+
return None
|
|
161
|
+
try:
|
|
162
|
+
from taskledger.storage.indexes import rebuild_v2_indexes
|
|
163
|
+
from taskledger.storage.task_store import v2_paths_from_context
|
|
164
|
+
|
|
165
|
+
counts = rebuild_v2_indexes(v2_paths_from_context(context))
|
|
166
|
+
except (LaunchError, OSError) as exc:
|
|
167
|
+
raise _recovery_failure(root, None, exc) from exc
|
|
168
|
+
return IndexCacheRecoveryResult("rebuilt", root, None, counts)
|
|
169
|
+
|
|
170
|
+
quarantine: Path | None = None
|
|
171
|
+
try:
|
|
172
|
+
if root.exists():
|
|
173
|
+
if any(root.iterdir()):
|
|
174
|
+
quarantine = _unique_quarantine_path(root)
|
|
175
|
+
root.rename(quarantine)
|
|
176
|
+
|
|
177
|
+
initialize_taskledger_bindings(
|
|
178
|
+
layout,
|
|
179
|
+
initialize_config=False,
|
|
180
|
+
initialize_data=False,
|
|
181
|
+
initialize_indexes=True,
|
|
182
|
+
)
|
|
183
|
+
from taskledger.storage.indexes import rebuild_v2_indexes
|
|
184
|
+
from taskledger.storage.task_store import v2_paths_from_context
|
|
185
|
+
|
|
186
|
+
counts = rebuild_v2_indexes(v2_paths_from_context(context))
|
|
187
|
+
except (LaunchError, OSError) as exc:
|
|
188
|
+
marker = root / ".ledger-project.toml"
|
|
189
|
+
if marker.is_file() and not marker.is_symlink():
|
|
190
|
+
marker.unlink(missing_ok=True)
|
|
191
|
+
raise _recovery_failure(root, quarantine, exc) from exc
|
|
192
|
+
|
|
193
|
+
action: Literal["initialized", "quarantined_rebuilt"] = (
|
|
194
|
+
"quarantined_rebuilt" if quarantine is not None else "initialized"
|
|
195
|
+
)
|
|
196
|
+
return IndexCacheRecoveryResult(action, root, quarantine, counts)
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
__all__ = ["IndexCacheRecoveryResult", "ensure_indexes_cache_for_mutation"]
|
|
@@ -40,7 +40,11 @@ from ledgercore.manifest import (
|
|
|
40
40
|
LedgerRegistration,
|
|
41
41
|
MountDefinition,
|
|
42
42
|
)
|
|
43
|
-
from ledgercore.storage_binding import
|
|
43
|
+
from ledgercore.storage_binding import (
|
|
44
|
+
StorageBindingError,
|
|
45
|
+
read_storage_binding,
|
|
46
|
+
validate_storage_binding,
|
|
47
|
+
)
|
|
44
48
|
|
|
45
49
|
TOOL_NAME = "taskledger"
|
|
46
50
|
DATA_MOUNT = "data"
|
|
@@ -302,6 +306,11 @@ def initialize_taskledger_bindings(
|
|
|
302
306
|
return results
|
|
303
307
|
|
|
304
308
|
|
|
309
|
+
def validate_taskledger_mount(mount: Any, *, allow_missing: bool = False) -> Any:
|
|
310
|
+
"""Validate one resolved mount through the Ledgercore adapter boundary."""
|
|
311
|
+
return validate_storage_binding(mount, allow_missing=allow_missing)
|
|
312
|
+
|
|
313
|
+
|
|
305
314
|
def initialize_taskledger_external_store(layout: Any) -> bool:
|
|
306
315
|
"""Initialize an external root only during explicit Taskledger init."""
|
|
307
316
|
mount = layout.mounts[DATA_MOUNT]
|
|
@@ -453,6 +462,7 @@ __all__ = [
|
|
|
453
462
|
"ensure_taskledger_ledger_registration",
|
|
454
463
|
"execute_taskledger_layout_migration",
|
|
455
464
|
"initialize_taskledger_bindings",
|
|
465
|
+
"validate_taskledger_mount",
|
|
456
466
|
"load_taskledger_ledger_layout",
|
|
457
467
|
"locate_taskledger_project",
|
|
458
468
|
"initialize_taskledger_external_store",
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import importlib
|
|
6
|
+
import logging
|
|
6
7
|
from dataclasses import dataclass
|
|
7
8
|
from pathlib import Path
|
|
8
9
|
from typing import Any, Literal, cast
|
|
@@ -135,6 +136,7 @@ class TaskledgerProjectContext:
|
|
|
135
136
|
legacy_locator: ProjectPaths | None
|
|
136
137
|
loaded_project: Any | None = None
|
|
137
138
|
storage_validation: Any | None = None
|
|
139
|
+
cache_recovery: Any | None = None
|
|
138
140
|
local_overrides_present: bool = False
|
|
139
141
|
# Compatibility fields are derived values, not configuration ownership.
|
|
140
142
|
store_root: Path | None = None
|
|
@@ -388,9 +390,28 @@ def require_mutable_project_context(
|
|
|
388
390
|
"""Require a real initialized project before any command may write state."""
|
|
389
391
|
context = load_project_context(
|
|
390
392
|
start,
|
|
391
|
-
require_initialized=
|
|
393
|
+
require_initialized=False,
|
|
392
394
|
allow_legacy=allow_legacy,
|
|
393
395
|
)
|
|
396
|
+
cache_recovery = None
|
|
397
|
+
if context.mode == "canonical":
|
|
398
|
+
from taskledger.storage.index_cache import ensure_indexes_cache_for_mutation
|
|
399
|
+
|
|
400
|
+
cache_recovery = ensure_indexes_cache_for_mutation(context)
|
|
401
|
+
context = load_project_context(
|
|
402
|
+
start,
|
|
403
|
+
require_initialized=True,
|
|
404
|
+
allow_legacy=allow_legacy,
|
|
405
|
+
)
|
|
406
|
+
if cache_recovery is not None:
|
|
407
|
+
from dataclasses import replace
|
|
408
|
+
|
|
409
|
+
context = replace(context, cache_recovery=cache_recovery)
|
|
410
|
+
if cache_recovery.quarantine_path is not None:
|
|
411
|
+
logging.getLogger(__name__).warning(
|
|
412
|
+
"Taskledger quarantined the unbound indexes cache at %s",
|
|
413
|
+
cache_recovery.quarantine_path,
|
|
414
|
+
)
|
|
394
415
|
if context.mode == "legacy":
|
|
395
416
|
required = (
|
|
396
417
|
context.paths.project_dir,
|
|
@@ -158,6 +158,11 @@ specmason.toml
|
|
|
158
158
|
.ledger/releaseledger/data/ledgers/main/releases/v0.6.1/entries/entry-0003.md
|
|
159
159
|
.ledger/releaseledger/data/ledgers/main/releases/v0.6.1/entries/entry-0004.md
|
|
160
160
|
.ledger/releaseledger/data/ledgers/main/releases/v0.6.1/entries/entry-0005.md
|
|
161
|
+
.ledger/releaseledger/data/ledgers/main/releases/v0.6.2/release.md
|
|
162
|
+
.ledger/releaseledger/data/ledgers/main/releases/v0.6.2/entries/entry-0001.md
|
|
163
|
+
.ledger/releaseledger/data/ledgers/main/releases/v0.6.2/entries/entry-0002.md
|
|
164
|
+
.ledger/releaseledger/data/ledgers/main/releases/v0.6.2/entries/entry-0003.md
|
|
165
|
+
.ledger/releaseledger/data/ledgers/main/releases/v0.6.2/entries/entry-0004.md
|
|
161
166
|
.ledger/task/config.toml
|
|
162
167
|
.ledger/taskledger/.ledger-project.toml
|
|
163
168
|
.ledger/taskledger/config.toml
|
|
@@ -417,6 +422,7 @@ taskledger/storage/atomic.py
|
|
|
417
422
|
taskledger/storage/common.py
|
|
418
423
|
taskledger/storage/events.py
|
|
419
424
|
taskledger/storage/frontmatter.py
|
|
425
|
+
taskledger/storage/index_cache.py
|
|
420
426
|
taskledger/storage/indexes.py
|
|
421
427
|
taskledger/storage/init.py
|
|
422
428
|
taskledger/storage/layout_migration.py
|
|
@@ -478,6 +484,7 @@ tests/test_implementation_change_scan.py
|
|
|
478
484
|
tests/test_implementation_checks.py
|
|
479
485
|
tests/test_import_boundaries.py
|
|
480
486
|
tests/test_indexes.py
|
|
487
|
+
tests/test_indexes_cache_recovery.py
|
|
481
488
|
tests/test_json_contracts.py
|
|
482
489
|
tests/test_ledger_manifest_mutation.py
|
|
483
490
|
tests/test_ledgercore_compat.py
|