bantamkit 0.34.2__tar.gz → 0.34.3__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 (218) hide show
  1. {bantamkit-0.34.2 → bantamkit-0.34.3}/PKG-INFO +10 -10
  2. {bantamkit-0.34.2 → bantamkit-0.34.3}/README.md +9 -9
  3. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/__init__.py +1 -1
  4. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/eventlog.py +7 -6
  5. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/memory/store.py +50 -3
  6. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_bantamkit_gitignore.py +64 -0
  7. {bantamkit-0.34.2 → bantamkit-0.34.3}/.gitignore +0 -0
  8. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/contracts/default.yaml +0 -0
  9. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/devteam/manifest.yaml +0 -0
  10. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/devteam/repo/HISTORY.md +0 -0
  11. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/devteam/repo/README.md +0 -0
  12. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/devteam/repo/docs/architecture.md +0 -0
  13. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/devteam/repo/docs/runbook.md +0 -0
  14. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/devteam/repo/issues/142-settlement-timeout.md +0 -0
  15. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/devteam/repo/patches/0009-retry-budget.patch +0 -0
  16. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/devteam/repo/src/ledger/__init__.py +0 -0
  17. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/devteam/repo/src/ledger/config.py +0 -0
  18. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/devteam/repo/src/ledger/errors.py +0 -0
  19. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/devteam/repo/src/ledger/posting.py +0 -0
  20. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/devteam/repo/src/ledger/registry.py +0 -0
  21. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/devteam/repo/src/ledger/report.py +0 -0
  22. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/devteam/repo/src/ledger/retry.py +0 -0
  23. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/devteam/repo/src/ledger/settle.py +0 -0
  24. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/devteam/repo/src/ledger/validate.py +0 -0
  25. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/devteam/repo/tests/test_posting.py +0 -0
  26. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/devteam/repo/tests/test_settle.py +0 -0
  27. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/devteam/tasks/dt-error-contract.yaml +0 -0
  28. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/devteam/tasks/dt-handler-map.yaml +0 -0
  29. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/devteam/tasks/dt-patch-before-after.yaml +0 -0
  30. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/devteam/tasks/dt-retry-attempts.yaml +0 -0
  31. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/devteam/tasks/dt-settlement-config.yaml +0 -0
  32. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/devteam/tasks/dt-symbol-home.yaml +0 -0
  33. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/devteam/tasks/dt-trace-blame.yaml +0 -0
  34. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/devteam/tasks/dt-unread-key.yaml +0 -0
  35. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/document/tasks/doc-large-in-137.yaml +0 -0
  36. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/document/tasks/doc-large-in-359.yaml +0 -0
  37. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/document/tasks/doc-large-in-372.yaml +0 -0
  38. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/document/tasks/doc-large-out-11764.yaml +0 -0
  39. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/document/tasks/doc-large-out-4137.yaml +0 -0
  40. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/document/tasks/doc-large-out-8022.yaml +0 -0
  41. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/document/tasks/doc-small-137.yaml +0 -0
  42. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/document/tasks/doc-small-261.yaml +0 -0
  43. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/document/tasks/doc-small-388.yaml +0 -0
  44. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/fixtures/.gitkeep +0 -0
  45. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/fixtures/catalog.json +0 -0
  46. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/perturbations/task-completion.yaml +0 -0
  47. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/tasks/.gitkeep +0 -0
  48. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/tasks/extract-contact.yaml +0 -0
  49. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/tasks/extract-invoice.yaml +0 -0
  50. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/tasks/extract-order.yaml +0 -0
  51. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/tasks/extract-schedule.yaml +0 -0
  52. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/tasks/extract-versions.yaml +0 -0
  53. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/tasks/nav-prod-port.yaml +0 -0
  54. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/tasks/nav-release-bundle.yaml +0 -0
  55. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/tasks/recall-audit-retention.yaml +0 -0
  56. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/tasks/recall-cache-ttl.yaml +0 -0
  57. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/tasks/recall-db-port.yaml +0 -0
  58. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/tasks/recall-deploy.yaml +0 -0
  59. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/tasks/recall-env-endpoint.yaml +0 -0
  60. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/tasks/recall-oncall-rotation.yaml +0 -0
  61. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/tasks/recall-oncall.yaml +0 -0
  62. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/tasks/recall-org-quota.yaml +0 -0
  63. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/tasks/recall-owner.yaml +0 -0
  64. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/tasks/shop-basket-total.yaml +0 -0
  65. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/tasks/shop-cheapest.yaml +0 -0
  66. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/tasks/shop-compare.yaml +0 -0
  67. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/tasks/shop-gadget-value.yaml +0 -0
  68. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/tasks/shop-stock-total.yaml +0 -0
  69. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/evals/tasks/shop-total.yaml +0 -0
  70. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/pricing/default.json +0 -0
  71. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/profiles/default.yaml +0 -0
  72. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/profiles/patient.yaml +0 -0
  73. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/rubrics/.gitkeep +0 -0
  74. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/rubrics/code-quality.yaml +0 -0
  75. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/rubrics/grounded-completion.yaml +0 -0
  76. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/rubrics/task-completion.yaml +0 -0
  77. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/schemas/shiftwork-checkpoint.json +0 -0
  78. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/skills/.gitkeep +0 -0
  79. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/skills/file-graph.md +0 -0
  80. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/skills/memory.md +0 -0
  81. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/tools/.gitkeep +0 -0
  82. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/tools/bantamkit_read.json +0 -0
  83. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/tools/bantamkit_status.json +0 -0
  84. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/tools/build_identity.json +0 -0
  85. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/tools/document_list.json +0 -0
  86. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/tools/document_read.json +0 -0
  87. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/tools/file_graph.json +0 -0
  88. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/tools/memory_compact.json +0 -0
  89. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/tools/memory_dream.json +0 -0
  90. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/tools/memory_recall.json +0 -0
  91. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/tools/memory_save.json +0 -0
  92. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/tools/repo_map.json +0 -0
  93. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/tools/shiftwork_clock_in.json +0 -0
  94. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/tools/shiftwork_clock_out.json +0 -0
  95. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/tools/shiftwork_status.json +0 -0
  96. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/tools/skill_audit.json +0 -0
  97. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/tools/token_ledger.json +0 -0
  98. {bantamkit-0.34.2 → bantamkit-0.34.3}/_assets/tools/validate_json.json +0 -0
  99. {bantamkit-0.34.2 → bantamkit-0.34.3}/hatch_build.py +0 -0
  100. {bantamkit-0.34.2 → bantamkit-0.34.3}/pyproject.toml +0 -0
  101. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/agent.py +0 -0
  102. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/assets.py +0 -0
  103. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/budget.py +0 -0
  104. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/client.py +0 -0
  105. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/contract.py +0 -0
  106. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/criticreplay.py +0 -0
  107. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/critique.py +0 -0
  108. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/docmanifest.py +0 -0
  109. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/docread.py +0 -0
  110. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/evalrun.py +0 -0
  111. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/filegraph.py +0 -0
  112. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/hostinstall.py +0 -0
  113. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/loopguard.py +0 -0
  114. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/mcpreport.py +0 -0
  115. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/mcpserver.py +0 -0
  116. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/memory/__init__.py +0 -0
  117. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/memory/__main__.py +0 -0
  118. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/memory/component.py +0 -0
  119. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/memory/divergence.py +0 -0
  120. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/memory/dream.py +0 -0
  121. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/memory/layers.py +0 -0
  122. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/pdfread.py +0 -0
  123. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/pricing.py +0 -0
  124. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/profile.py +0 -0
  125. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/repomap.py +0 -0
  126. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/selfupdate.py +0 -0
  127. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/shiftwork.py +0 -0
  128. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/skillaudit.py +0 -0
  129. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/statusline.py +0 -0
  130. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/structured.py +0 -0
  131. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/textutil.py +0 -0
  132. {bantamkit-0.34.2 → bantamkit-0.34.3}/src/bantamkit/tokenledger.py +0 -0
  133. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/cli_exit_status_probe.py +0 -0
  134. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/conftest.py +0 -0
  135. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/data/docread/bad-crc.docx +0 -0
  136. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/data/docread/charref-4301-digits.html +0 -0
  137. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/data/docread/charset-table.json +0 -0
  138. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/data/docread/compression-method-9.docx +0 -0
  139. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/data/docread/corrupt-deflate.docx +0 -0
  140. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/data/docread/encrypted-member.docx +0 -0
  141. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/data/docread/encrypted-mimetype.odt +0 -0
  142. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/data/docread/eszett-cell-ref.xlsx +0 -0
  143. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/data/docread/internal-dtd-entity.docx +0 -0
  144. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/data/docread/rfc2231-charset.eml +0 -0
  145. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/data/docread/rfc822-nested-twice.eml +0 -0
  146. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/data/docread/unicode-digit-shared-string.xlsx +0 -0
  147. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/data/docread/x-uuencode.eml +0 -0
  148. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/data/f8404ab-perturbation-baseline.json +0 -0
  149. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/data/platform-assumption-baseline.json +0 -0
  150. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/data/served-tool-surface.json +0 -0
  151. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/docread_fixtures.py +0 -0
  152. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/perturbation_baseline_harness.py +0 -0
  153. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/rbp16_effect_probe.py +0 -0
  154. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/rbp18_payload_probe.py +0 -0
  155. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_adapter.py +0 -0
  156. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_agent.py +0 -0
  157. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_amendguard.py +0 -0
  158. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_bantamkit_read_tool.py +0 -0
  159. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_budget.py +0 -0
  160. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_build_identity.py +0 -0
  161. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_client.py +0 -0
  162. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_compaction_corpus_survey.py +0 -0
  163. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_conformance.py +0 -0
  164. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_conformance_harness_resilience.py +0 -0
  165. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_conformance_suite_table_gate.py +0 -0
  166. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_contract_fanout.py +0 -0
  167. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_criticreplay.py +0 -0
  168. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_critique.py +0 -0
  169. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_doc_commands_gate.py +0 -0
  170. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_docread.py +0 -0
  171. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_docread_ceilings.py +0 -0
  172. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_document_manifest_parity.py +0 -0
  173. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_document_setup.py +0 -0
  174. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_document_tasks.py +0 -0
  175. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_document_tools.py +0 -0
  176. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_encoding_gate.py +0 -0
  177. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_evalrun.py +0 -0
  178. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_eventlog.py +0 -0
  179. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_field_program_gates.py +0 -0
  180. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_field_programs.py +0 -0
  181. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_filegraph.py +0 -0
  182. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_hostinstall.py +0 -0
  183. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_install_shape.py +0 -0
  184. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_ladder_statistics.py +0 -0
  185. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_launcher_which.py +0 -0
  186. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_layers.py +0 -0
  187. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_loopguard.py +0 -0
  188. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_mcp_endpoint.py +0 -0
  189. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_mcpdrift.py +0 -0
  190. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_mcpreport.py +0 -0
  191. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_mcpserver.py +0 -0
  192. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_memory.py +0 -0
  193. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_memory_compact_tool.py +0 -0
  194. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_memory_component.py +0 -0
  195. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_memory_divergence.py +0 -0
  196. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_memory_dream.py +0 -0
  197. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_memory_layers.py +0 -0
  198. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_memory_store_tripwire.py +0 -0
  199. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_mutmatrix.py +0 -0
  200. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_newline_gate.py +0 -0
  201. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_packaging.py +0 -0
  202. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_pdfread.py +0 -0
  203. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_pinharness_ledger.py +0 -0
  204. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_platform_assumption_gate.py +0 -0
  205. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_pricing.py +0 -0
  206. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_repo_map_tool.py +0 -0
  207. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_repomap.py +0 -0
  208. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_selfupdate.py +0 -0
  209. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_served_tool_count_records.py +0 -0
  210. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_shiftwork.py +0 -0
  211. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_skillaudit.py +0 -0
  212. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_status_surface.py +0 -0
  213. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_statusline.py +0 -0
  214. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_structured.py +0 -0
  215. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_thread_exception_gate.py +0 -0
  216. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_tokenledger.py +0 -0
  217. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_tool_manifest.py +0 -0
  218. {bantamkit-0.34.2 → bantamkit-0.34.3}/tests/test_version_agreement.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: bantamkit
3
- Version: 0.34.2
3
+ Version: 0.34.3
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
@@ -96,9 +96,9 @@ CPU architecture and Python minor version** (some wheels, such as `pydantic_core
96
96
  one platform only), copy `wheels/` across, and install from it:
97
97
 
98
98
  ```bash
99
- python -m pip download "bantamkit[mcp]==0.34.2" -d wheels
99
+ python -m pip download "bantamkit[mcp]==0.34.3" -d wheels
100
100
  python -m venv <env>
101
- <env>/bin/pip install --no-index --find-links wheels "bantamkit[mcp]==0.34.2"
101
+ <env>/bin/pip install --no-index --find-links wheels "bantamkit[mcp]==0.34.3"
102
102
  <env>/bin/bantamkit-mcp --install cursor
103
103
  ```
104
104
 
@@ -247,10 +247,10 @@ pipx upgrade bantamkit # pipx
247
247
  uv tool upgrade bantamkit # uv
248
248
  ```
249
249
 
250
- `--update` (`check the package index and update this install if it differs, then exit`) is the
251
- only network access here. An editable install, a local file or a source tree is refused with
252
- exit 1 and a sentence naming the manual route (for a clone, `git pull`). For a wheelhouse, repeat
253
- the download and install.
250
+ `--update` (`check the package index and update this install if it differs, then exit`) upgrades
251
+ an install from PyPI with this interpreter's pip; it is the only network access here. An editable
252
+ install, a local file or a source tree is refused with exit 1 and a sentence naming the manual
253
+ route (for a clone, `git pull`). For a wheelhouse, repeat the download and install.
254
254
 
255
255
  **Then restart the server in the host** (`/mcp` → reconnect in Claude Code; fully restart Claude
256
256
  Desktop). `bantamkit_status` prints the version **and the `build_id` of the code answering
@@ -288,7 +288,7 @@ you**; a new version with an old `build_id` means an old process.
288
288
  | `shiftwork_status` | report the open cursor |
289
289
  | `token_ledger` | what a session cost, read off the host's transcripts |
290
290
  | `bantamkit_status` | report store health against its budget |
291
- | `build_identity` | report the fingerprint of the source on disk, not the executing code |
291
+ | `build_identity` | report the fingerprint of the source on disk, not the executing code — useful when a machine carries two installs under one name |
292
292
 
293
293
  The document reader `bantamkit_read` left the served tools in job50 (2026-09-12) and stays in the
294
294
  library as `bantamkit.docread`.
@@ -303,7 +303,7 @@ under the `[mcp]` extra.
303
303
  Contracts, schemas, eval tasks, rubrics and tool manifests ship inside the package.
304
304
  `bantamkit-mcp --assets-root` prints the resolved directory and its file count, and
305
305
  `BANTAMKIT_ASSETS` overrides it. A build that cannot find the pack fails instead of shipping
306
- without it.
306
+ without it — deliberately, because the silent version shipped once.
307
307
 
308
308
  ## The operator CLI: `python -m bantamkit.memory`
309
309
 
@@ -342,7 +342,7 @@ git clone https://github.com/Ink01101011/bantamkit
342
342
  cd bantamkit
343
343
  python -m venv .venv && .venv/bin/pip install -e "runtime-py[dev,mcp]"
344
344
  .venv/bin/python -m pytest runtime-py/tests -q
345
- .venv/bin/ruff check runtime-py
345
+ .venv/bin/ruff check runtime-py tools
346
346
  ```
347
347
 
348
348
  The cross-runtime gate needs Node:
@@ -68,9 +68,9 @@ CPU architecture and Python minor version** (some wheels, such as `pydantic_core
68
68
  one platform only), copy `wheels/` across, and install from it:
69
69
 
70
70
  ```bash
71
- python -m pip download "bantamkit[mcp]==0.34.2" -d wheels
71
+ python -m pip download "bantamkit[mcp]==0.34.3" -d wheels
72
72
  python -m venv <env>
73
- <env>/bin/pip install --no-index --find-links wheels "bantamkit[mcp]==0.34.2"
73
+ <env>/bin/pip install --no-index --find-links wheels "bantamkit[mcp]==0.34.3"
74
74
  <env>/bin/bantamkit-mcp --install cursor
75
75
  ```
76
76
 
@@ -219,10 +219,10 @@ pipx upgrade bantamkit # pipx
219
219
  uv tool upgrade bantamkit # uv
220
220
  ```
221
221
 
222
- `--update` (`check the package index and update this install if it differs, then exit`) is the
223
- only network access here. An editable install, a local file or a source tree is refused with
224
- exit 1 and a sentence naming the manual route (for a clone, `git pull`). For a wheelhouse, repeat
225
- the download and install.
222
+ `--update` (`check the package index and update this install if it differs, then exit`) upgrades
223
+ an install from PyPI with this interpreter's pip; it is the only network access here. An editable
224
+ install, a local file or a source tree is refused with exit 1 and a sentence naming the manual
225
+ route (for a clone, `git pull`). For a wheelhouse, repeat the download and install.
226
226
 
227
227
  **Then restart the server in the host** (`/mcp` → reconnect in Claude Code; fully restart Claude
228
228
  Desktop). `bantamkit_status` prints the version **and the `build_id` of the code answering
@@ -260,7 +260,7 @@ you**; a new version with an old `build_id` means an old process.
260
260
  | `shiftwork_status` | report the open cursor |
261
261
  | `token_ledger` | what a session cost, read off the host's transcripts |
262
262
  | `bantamkit_status` | report store health against its budget |
263
- | `build_identity` | report the fingerprint of the source on disk, not the executing code |
263
+ | `build_identity` | report the fingerprint of the source on disk, not the executing code — useful when a machine carries two installs under one name |
264
264
 
265
265
  The document reader `bantamkit_read` left the served tools in job50 (2026-09-12) and stays in the
266
266
  library as `bantamkit.docread`.
@@ -275,7 +275,7 @@ under the `[mcp]` extra.
275
275
  Contracts, schemas, eval tasks, rubrics and tool manifests ship inside the package.
276
276
  `bantamkit-mcp --assets-root` prints the resolved directory and its file count, and
277
277
  `BANTAMKIT_ASSETS` overrides it. A build that cannot find the pack fails instead of shipping
278
- without it.
278
+ without it — deliberately, because the silent version shipped once.
279
279
 
280
280
  ## The operator CLI: `python -m bantamkit.memory`
281
281
 
@@ -314,7 +314,7 @@ git clone https://github.com/Ink01101011/bantamkit
314
314
  cd bantamkit
315
315
  python -m venv .venv && .venv/bin/pip install -e "runtime-py[dev,mcp]"
316
316
  .venv/bin/python -m pytest runtime-py/tests -q
317
- .venv/bin/ruff check runtime-py
317
+ .venv/bin/ruff check runtime-py tools
318
318
  ```
319
319
 
320
320
  The cross-runtime gate needs Node:
@@ -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.34.2"
32
+ __version__ = "0.34.3"
@@ -69,7 +69,7 @@ from datetime import UTC, datetime, timedelta
69
69
  from pathlib import Path
70
70
  from typing import Any
71
71
 
72
- from bantamkit.memory.store import ensure_bantamkit_gitignore
72
+ from bantamkit.memory.store import bantamkit_dir_for, ensure_bantamkit_gitignore
73
73
 
74
74
  #: Environment switch. Unset or `off`/`0`/`false`/`no`/empty -> disabled. `on`/`1`/
75
75
  #: `true`/`yes` -> the default file inside the memory store. Anything else is taken as
@@ -289,11 +289,12 @@ class EventLog:
289
289
  # USER RULING #2 (J51-8a): the ignore file is written only when THIS call is what
290
290
  # creates `.bantamkit`, so existence has to be checked BEFORE the mkdir below --
291
291
  # after it, the directory unconditionally exists and the question is unanswerable.
292
- bantamkit_dir = None
293
- for parent in self.path.parents:
294
- if parent.name == ".bantamkit":
295
- bantamkit_dir = parent
296
- break
292
+ #
293
+ # J54-3: the walk moved into `bantamkit_dir_for` beside the writer it feeds, so the
294
+ # two creators in this runtime ask the same question in the same words rather than
295
+ # keeping a copy each. The answer here is unchanged -- a log file is never itself
296
+ # named `.bantamkit`, so self-or-ancestors and ancestors give the same directory.
297
+ bantamkit_dir = bantamkit_dir_for(self.path)
297
298
  bantamkit_dir_existed_before = bantamkit_dir is not None and bantamkit_dir.exists()
298
299
  self.path.parent.mkdir(parents=True, exist_ok=True)
299
300
  if bantamkit_dir is not None:
@@ -286,6 +286,14 @@ def ensure_bantamkit_gitignore(directory: Path, *, created: bool) -> None:
286
286
  would leave a `.bantamkit` that git can see (or ignore one it should not), which is
287
287
  the whole bug this closes.
288
288
 
289
+ THE CREATORS, ENUMERATED (J54-3), because "anything else" is how one got missed: in
290
+ THIS runtime there are exactly two -- `MemoryStore._ensure_dirs` and `EventLog._append`
291
+ -- and both now ask `bantamkit_dir_for` which directory the decision is about, rather
292
+ than assuming the root's parent is it. `runtime-ts` has a THIRD, `hostinstall`'s
293
+ `thisCommand`, where npm creates `~/.bantamkit/mcp` for `--install`; there is no npm
294
+ install path in this runtime (the offline install is Node-only by user ruling), which
295
+ is why that creator has no counterpart here. `docs/porting.md` carries the row.
296
+
289
297
  NEVER REWRITES. A `.gitignore` that already exists -- whatever its bytes -- is left
290
298
  exactly as it is, kept as a second guard even when `created` is `True`: an operator
291
299
  who deleted it to commit the directory keeps that decision, and this never diffs its
@@ -313,6 +321,34 @@ def ensure_bantamkit_gitignore(directory: Path, *, created: bool) -> None:
313
321
  pass
314
322
 
315
323
 
324
+ def bantamkit_dir_for(path: Path) -> Path | None:
325
+ """The `.bantamkit` directory a `mkdir(parents=True)` of `path` would create or fill,
326
+ or `None` when there is none: `path` itself if it is named `.bantamkit`, otherwise its
327
+ nearest ancestor that is.
328
+
329
+ WHY A WALK AND NOT `path.parent` (J54-3). Every creator has to hand
330
+ `ensure_bantamkit_gitignore` the directory the decision is ABOUT, and `parent` is the
331
+ right answer for exactly one shape of path, `<x>/.bantamkit/memory`. A store rooted AT
332
+ the `.bantamkit` directory (`--store ~/.bantamkit`) or nested deeper under it
333
+ (`<x>/.bantamkit/memory/extra`) creates a `.bantamkit` whose gitignore decision was
334
+ taken about the wrong directory -- so no decision was taken at all, and git could see
335
+ the whole tree. MEASURED, not hypothetical: `~/.bantamkit` on the machine this was
336
+ found on holds an empty `facts/` and `archive/` beside `memory/`, left by a store once
337
+ rooted at it, and no `.gitignore`.
338
+
339
+ NEAREST AND NOT OUTERMOST, which is the choice `EventLog._append` already made and this
340
+ function now carries for both creators: under a `<x>/.bantamkit/y/.bantamkit/z` the
341
+ directory a reader would expect to be ignored is the one the store is actually in.
342
+
343
+ READ-ONLY. It looks at names, never at the filesystem, so it is equally valid before or
344
+ after the mkdir -- but `created` is answered by checking THIS path's existence BEFORE.
345
+ """
346
+ for candidate in (path, *path.parents):
347
+ if candidate.name == ".bantamkit":
348
+ return candidate
349
+ return None
350
+
351
+
316
352
  class MemoryStore:
317
353
  def __init__(
318
354
  self,
@@ -405,8 +441,16 @@ class MemoryStore:
405
441
  # Checked BEFORE the mkdir, per user ruling #2: this is the one moment that can
406
442
  # tell whether `.bantamkit` already existed. After the mkdir it unconditionally
407
443
  # exists either way, so the answer has to be captured now or not at all.
408
- bantamkit_dir = self.root.parent
409
- bantamkit_dir_existed_before = bantamkit_dir.exists()
444
+ #
445
+ # J54-3: `bantamkit_dir_for`, not `self.root.parent`. The mkdir below is
446
+ # `parents=True`, so it creates every missing component of `self.root` -- a root
447
+ # that IS the `.bantamkit` directory, or one nested deeper under it, brought a
448
+ # `.bantamkit` into existence while the decision was being taken about some other
449
+ # directory, which meant no decision at all.
450
+ bantamkit_dir = bantamkit_dir_for(self.root)
451
+ bantamkit_dir_existed_before = (
452
+ bantamkit_dir is not None and bantamkit_dir.exists()
453
+ )
410
454
  try:
411
455
  (self.root / "facts").mkdir(parents=True, exist_ok=True)
412
456
  (self.root / "archive").mkdir(parents=True, exist_ok=True)
@@ -415,7 +459,10 @@ class MemoryStore:
415
459
  f"memory store could not be created: {self.root}; the directory is not"
416
460
  " there and this filesystem would not make it, so nothing was written"
417
461
  ) from e
418
- ensure_bantamkit_gitignore(bantamkit_dir, created=not bantamkit_dir_existed_before)
462
+ if bantamkit_dir is not None:
463
+ ensure_bantamkit_gitignore(
464
+ bantamkit_dir, created=not bantamkit_dir_existed_before
465
+ )
419
466
 
420
467
  # ---- ops ----
421
468
 
@@ -234,3 +234,67 @@ def test_eventlog_path_unrelated_to_dot_bantamkit_writes_no_gitignore(tmp_path):
234
234
 
235
235
  assert log.write_failed is False
236
236
  assert not list(tmp_path.glob("**/.gitignore"))
237
+
238
+
239
+ # ---------------------------------------------------------------------- J54-3 (2026-09-18)
240
+ #
241
+ # THE SECOND CREATOR THE PROPERTY MISSED, and it is not hypothetical: on the machine this
242
+ # was found on, `~/.bantamkit` holds an empty `facts/` and `archive/` beside `memory/` --
243
+ # a `MemoryStore` was once rooted AT the `.bantamkit` directory itself (`--store
244
+ # ~/.bantamkit`), its `mkdir(parents=True)` brought `~/.bantamkit` into existence, and the
245
+ # gitignore decision was taken about `~` instead, because `_ensure_dirs` looked at
246
+ # `self.root.parent` and nothing else.
247
+ #
248
+ # `self.root.parent` is the right directory for exactly one shape of root,
249
+ # `<x>/.bantamkit/memory`. A root that IS the `.bantamkit` directory, or one nested deeper
250
+ # under it, creates a `.bantamkit` that no call ever decides about -- the hole the
251
+ # docstring names as "a second creator that skipped this call, or that got `created`
252
+ # wrong". `EventLog._append` already walks the ancestors to find the `.bantamkit` among
253
+ # them; this is that same walk, in the other creator.
254
+
255
+
256
+ def test_j54_3_a_store_rooted_at_the_bantamkit_directory_itself_gets_the_gitignore(tmp_path):
257
+ root = tmp_path / ".bantamkit"
258
+ assert not root.exists()
259
+
260
+ MemoryStore(root)
261
+
262
+ gitignore = root / ".gitignore"
263
+ assert gitignore.exists()
264
+ assert gitignore.read_bytes() == BANTAMKIT_GITIGNORE_TEXT.encode("utf-8")
265
+
266
+
267
+ def test_j54_3_a_store_nested_deeper_under_bantamkit_gets_the_gitignore(tmp_path):
268
+ root = tmp_path / ".bantamkit" / "memory" / "extra"
269
+ assert not (tmp_path / ".bantamkit").exists()
270
+
271
+ MemoryStore(root)
272
+
273
+ gitignore = tmp_path / ".bantamkit" / ".gitignore"
274
+ assert gitignore.exists()
275
+ assert gitignore.read_text(encoding="utf-8") == BANTAMKIT_GITIGNORE_TEXT
276
+
277
+
278
+ def test_j54_3_ruling_2_holds_for_a_store_rooted_at_an_existing_bantamkit(tmp_path):
279
+ """The fix must not over-fire: a `.bantamkit` that predates this call never gets one,
280
+ whichever creator is looking at it."""
281
+ root = tmp_path / ".bantamkit"
282
+ root.mkdir()
283
+
284
+ store = MemoryStore(root)
285
+ store.save("project", "widget-cache", "one line", "body", ())
286
+
287
+ assert not (root / ".gitignore").exists()
288
+
289
+
290
+ def test_j54_3_deleting_the_gitignore_under_a_nested_root_stays_deleted(tmp_path):
291
+ root = tmp_path / ".bantamkit" / "memory" / "extra"
292
+ gitignore = tmp_path / ".bantamkit" / ".gitignore"
293
+
294
+ store = MemoryStore(root)
295
+ assert gitignore.exists()
296
+
297
+ gitignore.unlink()
298
+ store.save("project", "widget-cache", "one line", "body", ())
299
+
300
+ assert not gitignore.exists()
File without changes
File without changes
File without changes
File without changes