bantamkit 0.35.7__tar.gz → 0.35.9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. {bantamkit-0.35.7 → bantamkit-0.35.9}/PKG-INFO +4 -4
  2. {bantamkit-0.35.7 → bantamkit-0.35.9}/README.md +2 -2
  3. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/tools/memory_compact.json +1 -2
  4. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/tools/memory_recall.json +1 -3
  5. bantamkit-0.35.9/_assets/tools/shiftwork_clock_in.json +37 -0
  6. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/tools/shiftwork_clock_out.json +1 -1
  7. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/tools/validate_json.json +1 -1
  8. bantamkit-0.35.9/_assets/tools/work_plan.json +55 -0
  9. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/__init__.py +1 -1
  10. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/assets.py +29 -3
  11. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/contract.py +393 -6
  12. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/eventlog.py +24 -1
  13. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/hookadapter.py +273 -50
  14. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/hostinstall.py +191 -32
  15. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/mcpreport.py +29 -4
  16. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/mcpserver.py +188 -35
  17. bantamkit-0.35.9/src/bantamkit/mcpstdio.py +248 -0
  18. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/memory/__main__.py +17 -2
  19. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/memory/component.py +81 -7
  20. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/memory/layers.py +41 -1
  21. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/memory/store.py +325 -38
  22. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/selfupdate.py +212 -73
  23. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/shiftwork.py +244 -42
  24. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/tokenledger.py +22 -1
  25. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/updatecheck.py +33 -4
  26. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/workplan.py +67 -7
  27. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/data/served-tool-surface.json +19 -16
  28. bantamkit-0.35.9/tests/test_assets.py +48 -0
  29. bantamkit-0.35.9/tests/test_cli_oneshot.py +113 -0
  30. bantamkit-0.35.9/tests/test_contract_patterns.py +190 -0
  31. bantamkit-0.35.9/tests/test_contract_refs.py +155 -0
  32. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_eventlog.py +25 -0
  33. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_hookadapter.py +270 -2
  34. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_hostinstall.py +181 -8
  35. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_hostinstall_hooks.py +140 -2
  36. bantamkit-0.35.9/tests/test_mcp_request_guard.py +103 -0
  37. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_mcpreport.py +42 -0
  38. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_mcpserver.py +15 -0
  39. bantamkit-0.35.9/tests/test_mcpstdio_frames.py +68 -0
  40. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_memory.py +326 -0
  41. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_memory_compact_tool.py +8 -1
  42. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_memory_component.py +12 -6
  43. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_memory_layers.py +51 -0
  44. bantamkit-0.35.9/tests/test_memory_strings.py +372 -0
  45. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_nativeexport.py +10 -7
  46. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_selfupdate.py +368 -34
  47. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_shiftwork.py +420 -2
  48. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_skillaudit.py +53 -0
  49. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_status_surface.py +20 -5
  50. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_tokenledger.py +89 -0
  51. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_updatecheck.py +32 -5
  52. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_workplan.py +82 -0
  53. bantamkit-0.35.7/_assets/tools/shiftwork_clock_in.json +0 -37
  54. bantamkit-0.35.7/_assets/tools/work_plan.json +0 -49
  55. {bantamkit-0.35.7 → bantamkit-0.35.9}/.gitignore +0 -0
  56. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/contracts/default.yaml +0 -0
  57. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/devteam/manifest.yaml +0 -0
  58. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/devteam/repo/HISTORY.md +0 -0
  59. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/devteam/repo/README.md +0 -0
  60. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/devteam/repo/docs/architecture.md +0 -0
  61. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/devteam/repo/docs/runbook.md +0 -0
  62. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/devteam/repo/issues/142-settlement-timeout.md +0 -0
  63. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/devteam/repo/patches/0009-retry-budget.patch +0 -0
  64. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/devteam/repo/src/ledger/__init__.py +0 -0
  65. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/devteam/repo/src/ledger/config.py +0 -0
  66. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/devteam/repo/src/ledger/errors.py +0 -0
  67. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/devteam/repo/src/ledger/posting.py +0 -0
  68. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/devteam/repo/src/ledger/registry.py +0 -0
  69. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/devteam/repo/src/ledger/report.py +0 -0
  70. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/devteam/repo/src/ledger/retry.py +0 -0
  71. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/devteam/repo/src/ledger/settle.py +0 -0
  72. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/devteam/repo/src/ledger/validate.py +0 -0
  73. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/devteam/repo/tests/test_posting.py +0 -0
  74. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/devteam/repo/tests/test_settle.py +0 -0
  75. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/devteam/tasks/dt-error-contract.yaml +0 -0
  76. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/devteam/tasks/dt-handler-map.yaml +0 -0
  77. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/devteam/tasks/dt-patch-before-after.yaml +0 -0
  78. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/devteam/tasks/dt-retry-attempts.yaml +0 -0
  79. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/devteam/tasks/dt-settlement-config.yaml +0 -0
  80. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/devteam/tasks/dt-symbol-home.yaml +0 -0
  81. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/devteam/tasks/dt-trace-blame.yaml +0 -0
  82. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/devteam/tasks/dt-unread-key.yaml +0 -0
  83. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/document/tasks/doc-large-in-137.yaml +0 -0
  84. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/document/tasks/doc-large-in-359.yaml +0 -0
  85. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/document/tasks/doc-large-in-372.yaml +0 -0
  86. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/document/tasks/doc-large-out-11764.yaml +0 -0
  87. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/document/tasks/doc-large-out-4137.yaml +0 -0
  88. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/document/tasks/doc-large-out-8022.yaml +0 -0
  89. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/document/tasks/doc-small-137.yaml +0 -0
  90. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/document/tasks/doc-small-261.yaml +0 -0
  91. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/document/tasks/doc-small-388.yaml +0 -0
  92. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/fixtures/.gitkeep +0 -0
  93. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/fixtures/catalog.json +0 -0
  94. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/perturbations/task-completion.yaml +0 -0
  95. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/tasks/.gitkeep +0 -0
  96. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/tasks/extract-contact.yaml +0 -0
  97. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/tasks/extract-invoice.yaml +0 -0
  98. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/tasks/extract-order.yaml +0 -0
  99. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/tasks/extract-schedule.yaml +0 -0
  100. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/tasks/extract-versions.yaml +0 -0
  101. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/tasks/nav-prod-port.yaml +0 -0
  102. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/tasks/nav-release-bundle.yaml +0 -0
  103. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/tasks/recall-audit-retention.yaml +0 -0
  104. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/tasks/recall-cache-ttl.yaml +0 -0
  105. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/tasks/recall-db-port.yaml +0 -0
  106. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/tasks/recall-deploy.yaml +0 -0
  107. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/tasks/recall-env-endpoint.yaml +0 -0
  108. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/tasks/recall-oncall-rotation.yaml +0 -0
  109. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/tasks/recall-oncall.yaml +0 -0
  110. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/tasks/recall-org-quota.yaml +0 -0
  111. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/tasks/recall-owner.yaml +0 -0
  112. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/tasks/shop-basket-total.yaml +0 -0
  113. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/tasks/shop-cheapest.yaml +0 -0
  114. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/tasks/shop-compare.yaml +0 -0
  115. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/tasks/shop-gadget-value.yaml +0 -0
  116. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/tasks/shop-stock-total.yaml +0 -0
  117. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/evals/tasks/shop-total.yaml +0 -0
  118. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/pricing/default.json +0 -0
  119. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/profiles/default.yaml +0 -0
  120. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/profiles/patient.yaml +0 -0
  121. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/rubrics/.gitkeep +0 -0
  122. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/rubrics/code-quality.yaml +0 -0
  123. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/rubrics/grounded-completion.yaml +0 -0
  124. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/rubrics/task-completion.yaml +0 -0
  125. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/schemas/shiftwork-checkpoint.json +0 -0
  126. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/skills/.gitkeep +0 -0
  127. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/skills/file-graph.md +0 -0
  128. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/skills/memory.md +0 -0
  129. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/tools/.gitkeep +0 -0
  130. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/tools/bantamkit_read.json +0 -0
  131. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/tools/bantamkit_status.json +0 -0
  132. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/tools/build_identity.json +0 -0
  133. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/tools/document_list.json +0 -0
  134. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/tools/document_read.json +0 -0
  135. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/tools/file_graph.json +0 -0
  136. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/tools/memory_dream.json +0 -0
  137. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/tools/memory_save.json +0 -0
  138. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/tools/repo_map.json +0 -0
  139. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/tools/shiftwork_plan.json +0 -0
  140. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/tools/shiftwork_status.json +0 -0
  141. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/tools/skill_audit.json +0 -0
  142. {bantamkit-0.35.7 → bantamkit-0.35.9}/_assets/tools/token_ledger.json +0 -0
  143. {bantamkit-0.35.7 → bantamkit-0.35.9}/hatch_build.py +0 -0
  144. {bantamkit-0.35.7 → bantamkit-0.35.9}/pyproject.toml +0 -0
  145. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/agent.py +0 -0
  146. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/budget.py +0 -0
  147. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/client.py +0 -0
  148. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/criticreplay.py +0 -0
  149. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/critique.py +0 -0
  150. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/docmanifest.py +0 -0
  151. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/docread.py +0 -0
  152. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/evalrun.py +0 -0
  153. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/filegraph.py +0 -0
  154. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/loopguard.py +0 -0
  155. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/memory/__init__.py +0 -0
  156. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/memory/divergence.py +0 -0
  157. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/memory/dream.py +0 -0
  158. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/pdfread.py +0 -0
  159. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/pricing.py +0 -0
  160. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/profile.py +0 -0
  161. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/repomap.py +0 -0
  162. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/skillaudit.py +0 -0
  163. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/statusline.py +0 -0
  164. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/structured.py +0 -0
  165. {bantamkit-0.35.7 → bantamkit-0.35.9}/src/bantamkit/textutil.py +0 -0
  166. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/cli_exit_status_probe.py +0 -0
  167. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/conftest.py +0 -0
  168. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/data/docread/bad-crc.docx +0 -0
  169. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/data/docread/charref-4301-digits.html +0 -0
  170. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/data/docread/charset-table.json +0 -0
  171. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/data/docread/compression-method-9.docx +0 -0
  172. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/data/docread/corrupt-deflate.docx +0 -0
  173. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/data/docread/encrypted-member.docx +0 -0
  174. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/data/docread/encrypted-mimetype.odt +0 -0
  175. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/data/docread/eszett-cell-ref.xlsx +0 -0
  176. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/data/docread/internal-dtd-entity.docx +0 -0
  177. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/data/docread/rfc2231-charset.eml +0 -0
  178. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/data/docread/rfc822-nested-twice.eml +0 -0
  179. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/data/docread/unicode-digit-shared-string.xlsx +0 -0
  180. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/data/docread/x-uuencode.eml +0 -0
  181. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/data/f8404ab-perturbation-baseline.json +0 -0
  182. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/data/platform-assumption-baseline.json +0 -0
  183. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/docread_fixtures.py +0 -0
  184. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/perturbation_baseline_harness.py +0 -0
  185. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/rbp16_effect_probe.py +0 -0
  186. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/rbp18_payload_probe.py +0 -0
  187. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_adapter.py +0 -0
  188. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_agent.py +0 -0
  189. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_amendguard.py +0 -0
  190. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_bantamkit_gitignore.py +0 -0
  191. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_bantamkit_read_tool.py +0 -0
  192. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_budget.py +0 -0
  193. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_build_identity.py +0 -0
  194. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_client.py +0 -0
  195. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_compaction_corpus_survey.py +0 -0
  196. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_conformance.py +0 -0
  197. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_conformance_harness_resilience.py +0 -0
  198. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_conformance_suite_table_gate.py +0 -0
  199. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_contract_fanout.py +0 -0
  200. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_criticreplay.py +0 -0
  201. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_critique.py +0 -0
  202. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_doc_commands_gate.py +0 -0
  203. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_docread.py +0 -0
  204. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_docread_ceilings.py +0 -0
  205. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_document_manifest_parity.py +0 -0
  206. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_document_setup.py +0 -0
  207. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_document_tasks.py +0 -0
  208. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_document_tools.py +0 -0
  209. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_encoding_gate.py +0 -0
  210. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_evalrun.py +0 -0
  211. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_field_program_gates.py +0 -0
  212. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_field_programs.py +0 -0
  213. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_filegraph.py +0 -0
  214. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_install_shape.py +0 -0
  215. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_ladder_statistics.py +0 -0
  216. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_launcher_which.py +0 -0
  217. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_layers.py +0 -0
  218. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_loopguard.py +0 -0
  219. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_mcp_endpoint.py +0 -0
  220. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_mcpdrift.py +0 -0
  221. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_memory_divergence.py +0 -0
  222. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_memory_dream.py +0 -0
  223. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_memory_store_tripwire.py +0 -0
  224. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_mutmatrix.py +0 -0
  225. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_newline_gate.py +0 -0
  226. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_packaging.py +0 -0
  227. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_pdfread.py +0 -0
  228. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_pinharness_ledger.py +0 -0
  229. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_platform_assumption_gate.py +0 -0
  230. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_pricing.py +0 -0
  231. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_readme_separation.py +0 -0
  232. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_repo_map_tool.py +0 -0
  233. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_repomap.py +0 -0
  234. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_served_tool_count_records.py +0 -0
  235. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_statusline.py +0 -0
  236. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_structured.py +0 -0
  237. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_thread_exception_gate.py +0 -0
  238. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_tool_manifest.py +0 -0
  239. {bantamkit-0.35.7 → bantamkit-0.35.9}/tests/test_version_agreement.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: bantamkit
3
- Version: 0.35.7
3
+ Version: 0.35.9
4
4
  Summary: Memory MCP server for Claude Code, Cursor, VS Code Copilot and Claude Desktop, plus a Python library that lifts small-model agents. Install once, run offline.
5
5
  Project-URL: Homepage, https://github.com/Ink01101011/bantamkit
6
6
  Project-URL: Repository, https://github.com/Ink01101011/bantamkit
@@ -103,9 +103,9 @@ CPU architecture and Python minor version** (some wheels, such as `pydantic_core
103
103
  one platform only), copy `wheels/` across, and install from it:
104
104
 
105
105
  ```bash
106
- python -m pip download "bantamkit[mcp]==0.35.7" -d wheels
106
+ python -m pip download "bantamkit[mcp]==0.35.9" -d wheels
107
107
  python -m venv <env>
108
- <env>/bin/pip install --no-index --find-links wheels "bantamkit[mcp]==0.35.7"
108
+ <env>/bin/pip install --no-index --find-links wheels "bantamkit[mcp]==0.35.9"
109
109
  <env>/bin/bantamkit-mcp --install cursor
110
110
  ```
111
111
 
@@ -74,9 +74,9 @@ CPU architecture and Python minor version** (some wheels, such as `pydantic_core
74
74
  one platform only), copy `wheels/` across, and install from it:
75
75
 
76
76
  ```bash
77
- python -m pip download "bantamkit[mcp]==0.35.7" -d wheels
77
+ python -m pip download "bantamkit[mcp]==0.35.9" -d wheels
78
78
  python -m venv <env>
79
- <env>/bin/pip install --no-index --find-links wheels "bantamkit[mcp]==0.35.7"
79
+ <env>/bin/pip install --no-index --find-links wheels "bantamkit[mcp]==0.35.9"
80
80
  <env>/bin/bantamkit-mcp --install cursor
81
81
  ```
82
82
 
@@ -10,8 +10,7 @@
10
10
  "properties": {
11
11
  "reserve": {
12
12
  "type": "integer",
13
- "minimum": 0,
14
- "description": "Bytes of index headroom to free below the budget. Omit for the default: the size of the largest index line the store holds, capped at half the budget."
13
+ "description": "Bytes of index headroom to free below the budget: the target is `budget - reserve`, a negative value counts as 0, any value is capped at half the budget, and 0 compacts to the budget itself. Omit for the default: the room the degraded-index warning demands (the budget minus `(90 * budget - 1) // 100`) plus the size of the largest index line the store holds -- at the default 24000-byte budget with a 39-byte largest line that is 2401 + 39 = 2440, a 21560-byte target."
15
14
  }
16
15
  }
17
16
  },
@@ -17,9 +17,7 @@
17
17
  },
18
18
  "k": {
19
19
  "type": "integer",
20
- "minimum": 1,
21
- "maximum": 5,
22
- "description": "Facts wanted. Raised to the store default of 3 when smaller; never lowered below it."
20
+ "description": "Facts wanted, clamped to 1..5. Raised to the store default of 3 when smaller; never lowered below it."
23
21
  }
24
22
  }
25
23
  },
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "shiftwork_clock_in",
3
+ "description": "Shift-work clock-in: schema-validate the checkpoint file and return the brief for the unit at plan.cursor — {unit, role, invariants, handoff, do_not, files} — to hand to the spawned agent verbatim. The unit briefed is the one at plan.cursor, or, when unit_id is given, that unit — either way it must appear in shiftwork_plan's `ready`, the batch the dependency graph says may run now: the cursor unit is held to the same ready test as unit_id. A unit that is not ready (a done or dropped cursor, a cursor whose dependencies have not run, a unit_id naming no unit) is refused with {\"result\": \"error\", \"reason\": \"unit <id> is not ready; ready is <a, b>\"}, and on both paths the refusals of the batch view itself (cycle, unknown dependency, unreadable checkpoint) pass through verbatim; a cursor naming no unit still escalates. Clock-in still never moves plan.cursor; clock_out does. Structured refusals, never exceptions: result=escalate when handoff.open_questions is non-empty, result=success when every unit is done or dropped, result=error when the checkpoint fails validation. Clock-in also WRITES: on result=brief, and only then, it appends one line {event: brief, ts, unit, role} to <checkpoint>.log.jsonl — best-effort: a log it cannot write costs the brief nothing (the brief still returns, no error, only the record is lost). clock_out reads those lines back to write `briefed` on every accounting line, so the ledger is no longer one line per clock-out; a brief line carries `event` and no `status`. See docs/shiftwork.md.",
4
+ "surfaces": [
5
+ "mcp"
6
+ ],
7
+ "parameters": {
8
+ "properties": {
9
+ "checkpoint": {
10
+ "title": "Checkpoint",
11
+ "type": "string"
12
+ },
13
+ "unit_id": {
14
+ "anyOf": [
15
+ {
16
+ "type": "string"
17
+ },
18
+ {
19
+ "type": "null"
20
+ }
21
+ ],
22
+ "default": null,
23
+ "title": "Unit Id"
24
+ }
25
+ },
26
+ "required": [
27
+ "checkpoint"
28
+ ],
29
+ "type": "object",
30
+ "title": "shiftwork_clock_inArguments"
31
+ },
32
+ "output_schema": {
33
+ "type": "object",
34
+ "additionalProperties": true,
35
+ "title": "shiftwork_clock_inDictOutput"
36
+ }
37
+ }
@@ -87,7 +87,7 @@
87
87
  "anyOf": [
88
88
  {
89
89
  "type": "object",
90
- "description": "Per-unit cost. Written verbatim, beside ts/unit/role/status, as one line of <checkpoint>.log.jsonl - the ledger the N-sessions experiment reads. The keys named here have fixed meanings so a reader holding only the ledger knows what each number counts, in which unit, and which model produced it; any other key passes through unchanged (a refused key is friction, not safety). Lines written before this schema existed may spell these differently; the schema governs new writes only.",
90
+ "description": "Per-unit cost. Written verbatim, beside ts/unit/role/status, as one line of <checkpoint>.log.jsonl - the ledger the N-sessions experiment reads. The keys named here have fixed meanings so a reader holding only the ledger knows what each number counts, in which unit, and which model produced it; any other key passes through unchanged, except the five the runtime writes itself — unit, role, status, ts, event — which are refused (result=error) before anything is written; a self-reported briefed is overwritten, not refused. Lines written before this schema existed may spell these differently; the schema governs new writes only.",
91
91
  "properties": {
92
92
  "tokens": {
93
93
  "type": "integer",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "validate_json",
3
- "description": "Validate candidate output text against a JSON Schema. Returns {valid, feedback}; when invalid, feed the feedback back to the model and retry.",
3
+ "description": "Validate candidate output text against a JSON Schema. Returns {valid, feedback}; when invalid, feed the feedback back to the model and retry. The output may be any JSON value; otherwise the first fenced block, or the first object or array in the text, is used. $schema selects draft-04, draft-06, draft-07, 2019-09 or 2020-12 (default); $ref resolves only inside the one schema (\"#\", \"#/...\", \"#name\"), so a remote reference or an embedded $id is refused. pattern is Python re syntax, without inline flags, look-behind, backreferences, atomic or possessive groups, conditional groups or \\N{...}; a document's patterns get 500 ms in total.",
4
4
  "surfaces": [
5
5
  "mcp"
6
6
  ],
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "work_plan",
3
+ "description": "Work plan: turn a dependency graph into the batches that may run in parallel. Takes `nodes`, each `{id, depends_on, priority}` — `depends_on` absent or null means none, `priority` defaults to 0 — and answers `{\"result\": \"plan\", \"batches\", \"sequence\", \"width\"}`: batch k holds every node whose dependencies all appear in batches below k, `sequence` is those batches flattened in order, and `width` is the largest batch length — the widest fan-out, which is the number an orchestrator needs to decide whether it can afford the batch. Order inside a batch is priority descending, then the order the nodes were given; both halves are contract, because determinism inside a batch is what two implementations are held to. Empty `nodes` is an ANSWER, not a refusal: no batches, no sequence, width 0. Four refusals, checked in this order and one sentence each: `nodes[<i>].<field> must be ...` for a node whose `id` is not a string, whose `depends_on` is not a list of strings or whose `priority` is not an integer (named by position, never coerced), `duplicate node id <id>`, `node <id> depends on <dep>, which no node declares`, and `the graph has a cycle: <a> -> <b> -> <a>`. It reports what the graph permits and decides nothing about what may actually be dispatched together — `depends_on` encodes logical order, not file contention, so a batch this tool calls parallel may still hold work that writes one file. Pure computation over the nodes it was handed: it opens no file and takes no path. Never mutates.",
4
+ "surfaces": [
5
+ "mcp"
6
+ ],
7
+ "parameters": {
8
+ "properties": {
9
+ "nodes": {
10
+ "title": "Nodes",
11
+ "type": "array",
12
+ "items": {
13
+ "type": "object",
14
+ "properties": {
15
+ "id": {
16
+ "type": "string",
17
+ "description": "The node's identifier, unique across `nodes`"
18
+ },
19
+ "depends_on": {
20
+ "anyOf": [
21
+ {
22
+ "type": "array",
23
+ "items": {
24
+ "type": "string"
25
+ }
26
+ },
27
+ {
28
+ "type": "null"
29
+ }
30
+ ],
31
+ "description": "Ids this node waits for; every one of them must be declared by some node. Optional: absent or null means none"
32
+ },
33
+ "priority": {
34
+ "type": "integer",
35
+ "description": "Tie-break inside a batch, descending. Optional; 0 when absent"
36
+ }
37
+ },
38
+ "required": [
39
+ "id"
40
+ ]
41
+ }
42
+ }
43
+ },
44
+ "required": [
45
+ "nodes"
46
+ ],
47
+ "type": "object",
48
+ "title": "work_planArguments"
49
+ },
50
+ "output_schema": {
51
+ "type": "object",
52
+ "additionalProperties": true,
53
+ "title": "work_planDictOutput"
54
+ }
55
+ }
@@ -29,4 +29,4 @@ from bantamkit.structured import StructuredOutputError, extract_json, structured
29
29
  # file as its dynamic version source, so the wheel's metadata and the string the MCP
30
30
  # server advertises are the same committed bytes, and neither is a function of when
31
31
  # someone last ran `pip`.
32
- __version__ = "0.35.7"
32
+ __version__ = "0.35.9"
@@ -26,6 +26,32 @@ def assets_root() -> Path:
26
26
  raise AssetNotFound("no assets directory found; set BANTAMKIT_ASSETS")
27
27
 
28
28
 
29
+ def _asset_path(kind: str, name: str, ext: str) -> Path:
30
+ """job66/#145: the one path every loader below builds, and the containment check on it.
31
+
32
+ `name` is a BARE asset name (`memory`, `shiftwork-checkpoint`, `memory_recall`) and
33
+ nothing else. Before this, each loader joined `name` under its directory verbatim, so a
34
+ caller passing user input could read any `.json`/`.md` on disk through `..`. A name
35
+ holding a path separator (`/` or `\\`, either platform's), `..`, a drive colon or a NUL
36
+ is refused BEFORE any filesystem access, and the joined path is then checked LEXICALLY
37
+ (`os.path.abspath`, not `resolve()`: a pack may be a symlink farm, and the check is about
38
+ the name) to sit directly inside `<root>/<kind>s/`. On Windows `Path("tools") / "C:x"`
39
+ is drive-relative and leaves the pack, which is what the colon refusal and the lexical
40
+ check close. The refusal is an `AssetNotFound`, so the MCP resource handler's existing
41
+ `unknown skill asset: <name>` answer is unchanged. `runtime-ts/src/assets.ts::assetPath`
42
+ raises the same sentence.
43
+ """
44
+ directory = assets_root() / f"{kind}s"
45
+ path = directory / f"{name}{ext}"
46
+ if (
47
+ any(c in name for c in "/\\:\0")
48
+ or ".." in name
49
+ or os.path.dirname(os.path.abspath(path)) != os.path.abspath(directory)
50
+ ):
51
+ raise AssetNotFound(f"{kind} asset name is not a bare name: {name}")
52
+ return path
53
+
54
+
29
55
  def load_tool_asset(name: str) -> dict:
30
56
  """Return one tool asset VERBATIM — every key, including the ones no surface uses.
31
57
 
@@ -34,7 +60,7 @@ def load_tool_asset(name: str) -> dict:
34
60
  register this at all?) and `output_schema` (what do I advertise as the return shape?)
35
61
  and neither belongs on the agent-facing `Tool`.
36
62
  """
37
- path = assets_root() / "tools" / f"{name}.json"
63
+ path = _asset_path("tool", name, ".json")
38
64
  if not path.exists():
39
65
  raise AssetNotFound(f"tool asset not found: {path}")
40
66
  return json.loads(path.read_text(encoding="utf-8"))
@@ -54,14 +80,14 @@ def load_tool(name: str) -> Tool:
54
80
 
55
81
  def load_schema(name: str) -> dict:
56
82
  """Return a JSON Schema asset (parsed) — e.g. the shift-work checkpoint contract."""
57
- path = assets_root() / "schemas" / f"{name}.json"
83
+ path = _asset_path("schema", name, ".json")
58
84
  if not path.exists():
59
85
  raise AssetNotFound(f"schema asset not found: {path}")
60
86
  return json.loads(path.read_text(encoding="utf-8"))
61
87
 
62
88
 
63
89
  def load_skill(name: str) -> str:
64
- path = assets_root() / "skills" / f"{name}.md"
90
+ path = _asset_path("skill", name, ".md")
65
91
  if not path.exists():
66
92
  raise AssetNotFound(f"skill asset not found: {path}")
67
93
  return path.read_text(encoding="utf-8")