atomadic-forge 0.77.0__tar.gz → 0.78.0__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 (462) hide show
  1. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/CHANGELOG.md +5 -0
  2. {atomadic_forge-0.77.0/src/atomadic_forge.egg-info → atomadic_forge-0.78.0}/PKG-INFO +3 -3
  3. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/README.md +2 -2
  4. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/pyproject.toml +1 -1
  5. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/certify_checks.py +2 -0
  6. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/response_enricher.py +22 -0
  7. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/scout_walk.py +2 -0
  8. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/wire_check.py +2 -0
  9. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/emergent_feature.py +2 -0
  10. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/forge_pipeline.py +2 -0
  11. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/synergy_feature.py +2 -0
  12. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/verify_umbrella.py +2 -0
  13. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a4_sy_orchestration/cli.py +5 -0
  14. atomadic_forge-0.78.0/src/atomadic_forge/commands/token_savings.py +70 -0
  15. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0/src/atomadic_forge.egg-info}/PKG-INFO +3 -3
  16. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge.egg-info/SOURCES.txt +2 -0
  17. atomadic_forge-0.78.0/tests/test_token_savings_ledger.py +76 -0
  18. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_welcome_enhancements.py +10 -7
  19. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/FUNDING.yml +0 -0
  20. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  21. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  22. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  23. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/actions/forge-action/README.md +0 -0
  24. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/actions/forge-action/action.yml +0 -0
  25. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/dependabot.yml +0 -0
  26. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/pull_request_template.md +0 -0
  27. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/workflows/ci.yml +0 -0
  28. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/workflows/customer-refactor.yml +0 -0
  29. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/workflows/forge-self-certify.yml +0 -0
  30. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/workflows/mcp-registry-publish.yml +0 -0
  31. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/workflows/metrics-auto-regen.yml +0 -0
  32. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/workflows/metrics-drift.yml +0 -0
  33. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/workflows/publish-on-tag.yml +0 -0
  34. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/workflows/release-readiness.yml +0 -0
  35. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/workflows/release.yml +0 -0
  36. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/workflows/surface-drift.yml +0 -0
  37. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/workflows/uptime.yml +0 -0
  38. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/ARCHITECTURE.md +0 -0
  39. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/CONTRIBUTING.md +0 -0
  40. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/LICENSE +0 -0
  41. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/MANIFEST.in +0 -0
  42. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/SECURITY.md +0 -0
  43. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/assets/Atomadic-Forge-01.png +0 -0
  44. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/01-getting-started.md +0 -0
  45. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/02-commands.md +0 -0
  46. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/03-tutorial.md +0 -0
  47. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/04-llm-loops.md +0 -0
  48. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/05-faq.md +0 -0
  49. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/AGENTS_GUIDE.md +0 -0
  50. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/AIR_GAPPED.md +0 -0
  51. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/CI_CD.md +0 -0
  52. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/CODEX_WALKTHROUGH.md +0 -0
  53. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/COMMANDS.md +0 -0
  54. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/FIRST_10_MINUTES.md +0 -0
  55. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/FORMALIZATION.md +0 -0
  56. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/HIVE_PRIMITIVES.md +0 -0
  57. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/HIVE_STATUS.md +0 -0
  58. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/IDE_INTEGRATION.md +0 -0
  59. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/LANDSCAPE.md +0 -0
  60. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/MARKET_POSITIONING.md +0 -0
  61. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/MCP_TOOLS.md +0 -0
  62. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/MIGRATION.md +0 -0
  63. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/MULTI_REPO.md +0 -0
  64. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/PROVIDERS.md +0 -0
  65. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/README.md +0 -0
  66. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/RECEIPT.md +0 -0
  67. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/RELAY_PROTOCOL.md +0 -0
  68. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/RELEASE_CHECKLIST.md +0 -0
  69. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/RELEASE_MESSAGING.md +0 -0
  70. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/ROADMAP.md +0 -0
  71. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/SHOWCASE.md +0 -0
  72. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/SIDECAR.md +0 -0
  73. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/STUDIO.md +0 -0
  74. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/TOOL_FACTORY_WALKTHROUGH.md +0 -0
  75. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/V0.46.0_JUSTIFICATION_REPORT.md +0 -0
  76. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/V0.47.0_SELF_TEST_REPORT.md +0 -0
  77. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/WHY_NOW.md +0 -0
  78. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/WORKER_VS_LOCAL_MCP.md +0 -0
  79. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/WORLD_COLLISION.md +0 -0
  80. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/INDEX.md +0 -0
  81. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/absorb.md +0 -0
  82. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/audit.md +0 -0
  83. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/chat.md +0 -0
  84. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/commandsmith.md +0 -0
  85. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/config.md +0 -0
  86. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/create.md +0 -0
  87. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/demo.md +0 -0
  88. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/emergent-swarm.md +0 -0
  89. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/emergent-then-synergy.md +0 -0
  90. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/emergent.md +0 -0
  91. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/enhancement.md +0 -0
  92. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/evolve-then-iterate.md +0 -0
  93. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/evolve.md +0 -0
  94. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/feature-then-emergent.md +0 -0
  95. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/guard-install.md +0 -0
  96. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/handoff.md +0 -0
  97. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/harvest.md +0 -0
  98. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/hive.md +0 -0
  99. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/iterate.md +0 -0
  100. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/materialize.md +0 -0
  101. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/metrics.md +0 -0
  102. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/recon-swarm.md +0 -0
  103. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/relay.md +0 -0
  104. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/surface.md +0 -0
  105. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/synergy-then-emergent.md +0 -0
  106. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/synergy.md +0 -0
  107. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/welcome.md +0 -0
  108. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/wisdom.md +0 -0
  109. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
  110. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/compliance/CS-1.md +0 -0
  111. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
  112. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
  113. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/compliance/SR_11-7_MAPPING.md +0 -0
  114. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/handoffs/WORKER_AUTO_DEPLOY_2026-05-06.md +0 -0
  115. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/tutorials/01-quickstart.md +0 -0
  116. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/tutorials/02-your-first-package.md +0 -0
  117. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/tutorials/03-the-five-tier-law.md +0 -0
  118. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/tutorials/04-plug-in-llms.md +0 -0
  119. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/tutorials/05-multi-repo-absorb.md +0 -0
  120. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/tutorials/06-javascript-quickstart.md +0 -0
  121. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/setup.cfg +0 -0
  122. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/__init__.py +0 -0
  123. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/__main__.py +0 -0
  124. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
  125. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
  126. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
  127. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
  128. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
  129. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
  130. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/enhancement_proposal_constants.py +0 -0
  131. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
  132. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
  133. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
  134. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/handoff_constants.py +0 -0
  135. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/hive_constants.py +0 -0
  136. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +0 -0
  137. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/lifetime_savings_constants.py +0 -0
  138. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/materialize_types.py +0 -0
  139. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +0 -0
  140. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/nexus_constants.py +0 -0
  141. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
  142. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
  143. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/response_enrichment.py +0 -0
  144. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
  145. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +0 -0
  146. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
  147. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
  148. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
  149. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
  150. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/welcome_constants.py +0 -0
  151. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/wisdom_constants.py +0 -0
  152. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
  153. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/abstract_method_repair.py +0 -0
  154. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +0 -0
  155. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
  156. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
  157. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
  158. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/ast_scope_lock.py +0 -0
  159. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
  160. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/call_graph.py +0 -0
  161. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/capability_scout.py +0 -0
  162. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
  163. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
  164. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
  165. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
  166. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/code_signature.py +0 -0
  167. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
  168. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
  169. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
  170. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
  171. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
  172. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/cosine_similarity.py +0 -0
  173. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
  174. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/custom_provider_client.py +0 -0
  175. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/dead_code_check.py +0 -0
  176. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/doc_auto_update.py +0 -0
  177. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
  178. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
  179. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
  180. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
  181. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
  182. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
  183. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/enhancement_proposal_builder.py +0 -0
  184. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
  185. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
  186. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/exported_api_check.py +0 -0
  187. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
  188. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
  189. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/forge_locate.py +0 -0
  190. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/forge_metrics.py +0 -0
  191. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
  192. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/git_churn.py +0 -0
  193. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/graft_extract.py +0 -0
  194. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/handoff_builder.py +0 -0
  195. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/harvest_absorb.py +0 -0
  196. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/harvest_concept_bridge.py +0 -0
  197. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/hive_consensus_math.py +0 -0
  198. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/hive_io.py +0 -0
  199. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
  200. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
  201. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/intent_similarity.py +0 -0
  202. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
  203. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/lifetime_savings.py +0 -0
  204. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
  205. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
  206. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
  207. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
  208. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
  209. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/maintainability_index.py +0 -0
  210. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
  211. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +0 -0
  212. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
  213. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
  214. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
  215. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/polyglot_classify.py +0 -0
  216. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/polyglot_imports.py +0 -0
  217. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/polyglot_surface.py +0 -0
  218. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
  219. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
  220. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
  221. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
  222. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
  223. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
  224. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
  225. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/repo_public_surface.py +0 -0
  226. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +0 -0
  227. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
  228. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
  229. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
  230. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
  231. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/scaffold_polyglot.py +0 -0
  232. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
  233. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
  234. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
  235. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
  236. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/smell_scan.py +0 -0
  237. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/steersman_pack.py +0 -0
  238. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
  239. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/surface_gap_check.py +0 -0
  240. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
  241. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
  242. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
  243. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
  244. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/test_selector.py +0 -0
  245. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
  246. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
  247. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
  248. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +0 -0
  249. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/validation_commands.py +0 -0
  250. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/welcome_narrator.py +0 -0
  251. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/wire_stubs_gen.py +0 -0
  252. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/wisdom_capture.py +0 -0
  253. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/wisdom_io.py +0 -0
  254. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/wisdom_promote.py +0 -0
  255. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/wisdom_recall.py +0 -0
  256. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/worktree_status.py +0 -0
  257. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
  258. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +0 -0
  259. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +0 -0
  260. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/evolve_session_store.py +0 -0
  261. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
  262. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +0 -0
  263. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/iterate_session_store.py +0 -0
  264. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
  265. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
  266. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/nexus_client.py +0 -0
  267. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
  268. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
  269. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/remote_seed_store.py +0 -0
  270. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/repo_public_surface_sync.py +0 -0
  271. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
  272. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/absorb_feature.py +0 -0
  273. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +0 -0
  274. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/cherry_hunter.py +0 -0
  275. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/cna_check.py +0 -0
  276. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
  277. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/commit_compose.py +0 -0
  278. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/create_feature.py +0 -0
  279. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/dedup_engine.py +0 -0
  280. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +0 -0
  281. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a0_qk_constants/__init__.py +0 -0
  282. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a1_at_functions/__init__.py +0 -0
  283. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
  284. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +0 -0
  285. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
  286. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
  287. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/emergent_swarm.py +0 -0
  288. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/enhancement_proposal_feature.py +0 -0
  289. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
  290. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
  291. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/forge_evolve_session.py +0 -0
  292. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
  293. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/forge_loop_session.py +0 -0
  294. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/forge_metrics_feature.py +0 -0
  295. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
  296. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/graft_feature.py +0 -0
  297. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/guard_install.py +0 -0
  298. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/handoff_feature.py +0 -0
  299. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/hive_sync.py +0 -0
  300. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
  301. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/materialize_feature.py +0 -0
  302. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/mcp_server.py +0 -0
  303. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/nexus_bridge.py +0 -0
  304. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/relay_daemon.py +0 -0
  305. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
  306. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/surface_export.py +0 -0
  307. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/tool_factory.py +0 -0
  308. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/welcome_feature.py +0 -0
  309. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/wisdom_feature.py +0 -0
  310. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
  311. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
  312. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
  313. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
  314. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/__init__.py +0 -0
  315. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/_registry.py +0 -0
  316. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/absorb.py +0 -0
  317. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/audit.py +0 -0
  318. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/chat.py +0 -0
  319. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/commandsmith.py +0 -0
  320. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/config_cmd.py +0 -0
  321. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/create.py +0 -0
  322. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/demo.py +0 -0
  323. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/emergent.py +0 -0
  324. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/emergent_swarm.py +0 -0
  325. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
  326. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/enhancement.py +0 -0
  327. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/evolve.py +0 -0
  328. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
  329. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
  330. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/graft.py +0 -0
  331. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/guard_install.py +0 -0
  332. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/handoff.py +0 -0
  333. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/harvest.py +0 -0
  334. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/hive.py +0 -0
  335. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/iterate.py +0 -0
  336. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/materialize.py +0 -0
  337. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/metrics.py +0 -0
  338. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/recon_swarm.py +0 -0
  339. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/relay.py +0 -0
  340. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/surface.py +0 -0
  341. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/synergy.py +0 -0
  342. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
  343. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/welcome.py +0 -0
  344. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/wisdom.py +0 -0
  345. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
  346. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
  347. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge.egg-info/requires.txt +0 -0
  348. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge.egg-info/top_level.txt +0 -0
  349. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_aaaa_nexus_client.py +0 -0
  350. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_abstract_method_repair.py +0 -0
  351. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_agent_hire_protocol.py +0 -0
  352. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_agent_plan.py +0 -0
  353. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_agent_plan_pkg_label.py +0 -0
  354. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_agent_summary.py +0 -0
  355. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_ast_scope_lock.py +0 -0
  356. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_audit_verb.py +0 -0
  357. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_body_extractor_repairs.py +0 -0
  358. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_call_graph_summary.py +0 -0
  359. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_capability_scout.py +0 -0
  360. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_card_renderer.py +0 -0
  361. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_certify_operational_axis.py +0 -0
  362. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_chat.py +0 -0
  363. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_cherry_dedup_class_methods.py +0 -0
  364. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_cherry_pick.py +0 -0
  365. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_classify_tier.py +0 -0
  366. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_classify_tier_ast_signals.py +0 -0
  367. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_cli_smoke.py +0 -0
  368. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_cli_swarm_aliases.py +0 -0
  369. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_codex_5_complete.py +0 -0
  370. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_codex_6_enforce_polyglot.py +0 -0
  371. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_commandsmith.py +0 -0
  372. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_compiler_feedback.py +0 -0
  373. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_compliance_checker.py +0 -0
  374. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_config.py +0 -0
  375. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_copilots_copilot.py +0 -0
  376. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_cost_circuit_breaker.py +0 -0
  377. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_create_feature.py +0 -0
  378. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_cs1_renderer.py +0 -0
  379. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_custom_provider.py +0 -0
  380. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_dead_code_check.py +0 -0
  381. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_dedup_engine.py +0 -0
  382. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_demo.py +0 -0
  383. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_doc_auto_update.py +0 -0
  384. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_emergent_compose.py +0 -0
  385. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_emergent_signature_extract.py +0 -0
  386. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_emergent_synthesize_imports.py +0 -0
  387. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_enhancement_proposal.py +0 -0
  388. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_error_codes.py +0 -0
  389. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_error_hints.py +0 -0
  390. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_evolve_js.py +0 -0
  391. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_exported_api_check.py +0 -0
  392. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_finalize_scaffold.py +0 -0
  393. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_forge_action.py +0 -0
  394. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_forge_auth_a1.py +0 -0
  395. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_forge_auth_a2.py +0 -0
  396. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_forge_enforce.py +0 -0
  397. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_generation_quality.py +0 -0
  398. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_git_churn.py +0 -0
  399. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_graft_feature.py +0 -0
  400. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_handoff.py +0 -0
  401. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_harvest_concept_bridge.py +0 -0
  402. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_harvest_source_warnings.py +0 -0
  403. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_hierarchical_memory.py +0 -0
  404. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_hive_sync.py +0 -0
  405. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_ignore_and_docs.py +0 -0
  406. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_import_smoke.py +0 -0
  407. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_iterate_evolve.py +0 -0
  408. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_js_certify.py +0 -0
  409. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_js_parser.py +0 -0
  410. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_js_recon.py +0 -0
  411. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_js_wire.py +0 -0
  412. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_lineage_chain.py +0 -0
  413. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_ling_provider.py +0 -0
  414. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_local_signer.py +0 -0
  415. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_lsp_protocol.py +0 -0
  416. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_maintainability_index.py +0 -0
  417. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_manifest_diff.py +0 -0
  418. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_materialize_feature.py +0 -0
  419. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_mcp_lazy_bootstrap.py +0 -0
  420. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_mcp_protocol.py +0 -0
  421. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_nexus_bridge.py +0 -0
  422. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_ollama_client.py +0 -0
  423. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_pipeline.py +0 -0
  424. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_plan_apply.py +0 -0
  425. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_polyglot_cli_mcp.py +0 -0
  426. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_polyglot_full_pipeline.py +0 -0
  427. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_polyglot_hardening.py +0 -0
  428. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_polyglot_swift_kotlin_go.py +0 -0
  429. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_polyglot_symbol_parity.py +0 -0
  430. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_pre_audit_smoke.py +0 -0
  431. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_precommit_hooks.py +0 -0
  432. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_progress_reporter.py +0 -0
  433. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_receipt_emitter.py +0 -0
  434. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_receipt_schema.py +0 -0
  435. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_receipt_signer.py +0 -0
  436. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_remote_seed_store.py +0 -0
  437. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_repo_public_surface.py +0 -0
  438. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_response_enricher.py +0 -0
  439. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_roi_calculator.py +0 -0
  440. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_sbom_cmd_text_summary.py +0 -0
  441. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_sbom_emitter.py +0 -0
  442. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_scaffold.py +0 -0
  443. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_sidecar.py +0 -0
  444. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_sidecar_validate.py +0 -0
  445. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_smell_score_formula.py +0 -0
  446. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_stagnation.py +0 -0
  447. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_steersman_pack.py +0 -0
  448. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_stub_detector.py +0 -0
  449. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_surface_export.py +0 -0
  450. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_surface_gap_check.py +0 -0
  451. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_synergy.py +0 -0
  452. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_test_runner.py +0 -0
  453. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_tier_init_rebuild.py +0 -0
  454. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_trust_gate_response.py +0 -0
  455. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_verify_suggested_recipe.py +0 -0
  456. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_welcome.py +0 -0
  457. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_whoami_cmd.py +0 -0
  458. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_wire_certify.py +0 -0
  459. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_wire_stubs_gen.py +0 -0
  460. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_wire_suggest_repairs.py +0 -0
  461. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_wire_type_checking.py +0 -0
  462. {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_wisdom.py +0 -0
@@ -2,6 +2,11 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## v0.78.0 — 2026-05-08
6
+
7
+ - feat(forge): token-savings auto-ledger across every enriched verb
8
+
9
+
5
10
  ## v0.77.0 — 2026-05-08
6
11
 
7
12
  - fix(forge): cherry-pick — collapse Class.method explosion (root-cause)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atomadic-forge
3
- Version: 0.77.0
3
+ Version: 0.78.0
4
4
  Summary: Atomadic Forge — absorb, enforce, emerge. Polyglot (Python · JavaScript/TypeScript · Rust · Go · Swift · Kotlin) architecture guardian for AI-generated code.
5
5
  Author: Atomadic
6
6
  License-Expression: BUSL-1.1
@@ -225,8 +225,8 @@ Full tool reference: [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md) | First call: `welco
225
225
 
226
226
  | MCP tools | **10 tools · 116 actions** |
227
227
  | CLI verbs | **59** |
228
- | Source files | **232** (~47K LOC) |
229
- | Tests | **1588 passing** across **115 test files** |
228
+ | Source files | **233** (~47K LOC) |
229
+ | Tests | **1592 passing** across **116 test files** |
230
230
  | Lean4 formal proofs | **872 theorems** (mathematically verified core logic) |
231
231
  | Monadic tiers | **5** (a0 → a4, strict upward-only composition) |
232
232
  | Languages | Python, JS/TS, Swift, Kotlin, Go, Rust |
@@ -193,8 +193,8 @@ Full tool reference: [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md) | First call: `welco
193
193
 
194
194
  | MCP tools | **10 tools · 116 actions** |
195
195
  | CLI verbs | **59** |
196
- | Source files | **232** (~47K LOC) |
197
- | Tests | **1588 passing** across **115 test files** |
196
+ | Source files | **233** (~47K LOC) |
197
+ | Tests | **1592 passing** across **116 test files** |
198
198
  | Lean4 formal proofs | **872 theorems** (mathematically verified core logic) |
199
199
  | Monadic tiers | **5** (a0 → a4, strict upward-only composition) |
200
200
  | Languages | Python, JS/TS, Swift, Kotlin, Go, Rust |
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "atomadic-forge"
7
- version = "0.77.0"
7
+ version = "0.78.0"
8
8
  description = "Atomadic Forge — absorb, enforce, emerge. Polyglot (Python · JavaScript/TypeScript · Rust · Go · Swift · Kotlin) architecture guardian for AI-generated code."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -588,4 +588,6 @@ def certify(root: Path, *, project: str = "Atomadic project",
588
588
  basis_kind="files",
589
589
  ),
590
590
  summary=_summarize_certify(base),
591
+ project_root=root,
592
+ tool="certify",
591
593
  )
@@ -90,18 +90,40 @@ def enrich_response(
90
90
  *,
91
91
  scope: dict[str, Any] | None = None,
92
92
  summary: str = "",
93
+ project_root: Any = None,
94
+ tool: str = "",
93
95
  ) -> dict[str, Any]:
94
96
  """Return ``report`` with ``scope`` and ``summary`` injected.
95
97
 
96
98
  Existing keys are not modified. If the report already carries a
97
99
  ``scope`` or ``summary`` from upstream, the new values overwrite
98
100
  (callers control the order).
101
+
102
+ When ``project_root`` and ``tool`` are provided AND the supplied
103
+ ``scope.tokens_saved_estimate`` is positive, this also appends an
104
+ entry to the project's lifetime-savings ledger so every verb
105
+ contributes to the boastable total. Best-effort: a ledger write
106
+ failure never affects the returned report.
99
107
  """
100
108
  out = dict(report)
101
109
  if scope is not None:
102
110
  out["scope"] = scope
103
111
  if summary:
104
112
  out["summary"] = summary
113
+ if project_root is not None and tool:
114
+ try:
115
+ est = int((scope or {}).get("tokens_saved_estimate") or 0)
116
+ except (TypeError, ValueError):
117
+ est = 0
118
+ if est > 0:
119
+ try:
120
+ from pathlib import Path as _P
121
+
122
+ from .lifetime_savings import append_savings as _append
123
+ _append(project_root=_P(str(project_root)),
124
+ tool=tool, tokens_saved=est)
125
+ except Exception: # pragma: no cover - never break tool response
126
+ pass
105
127
  return out
106
128
 
107
129
 
@@ -508,6 +508,8 @@ def harvest_repo(
508
508
  basis_kind="files",
509
509
  ),
510
510
  summary=summarize_recon(base),
511
+ project_root=root,
512
+ tool="recon",
511
513
  )
512
514
 
513
515
 
@@ -598,4 +598,6 @@ def scan_violations(
598
598
  basis_kind="files",
599
599
  ),
600
600
  summary=_summarize_wire(report),
601
+ project_root=package_root,
602
+ tool="wire",
601
603
  )
@@ -104,6 +104,8 @@ class EmergentScan:
104
104
  basis_kind="symbols",
105
105
  ),
106
106
  summary=_summarize_emergent(dict(base)),
107
+ project_root=self.src_root,
108
+ tool="emergent",
107
109
  )
108
110
  return enriched # type: ignore[return-value]
109
111
 
@@ -420,6 +420,8 @@ def run_auto(*, target: Path, output: Path, package: str = "absorbed",
420
420
  basis_kind="both",
421
421
  ),
422
422
  summary=_summarize_auto(base),
423
+ project_root=target,
424
+ tool="auto",
423
425
  )
424
426
 
425
427
 
@@ -64,6 +64,8 @@ class SynergyScan:
64
64
  basis_kind="symbols",
65
65
  ),
66
66
  summary=_summarize_synergy(dict(base)),
67
+ project_root=self.src_root,
68
+ tool="synergy",
67
69
  ) # type: ignore[return-value]
68
70
 
69
71
  def implement(self, candidate_id: str, report: SynergyScanReport,
@@ -311,6 +311,8 @@ def verify(
311
311
  basis_kind="files",
312
312
  ),
313
313
  summary=_summarize_verify(base),
314
+ project_root=project_root,
315
+ tool="verify",
314
316
  )
315
317
 
316
318
 
@@ -2734,6 +2734,11 @@ def _register_specialty_apps() -> None:
2734
2734
  ("atomadic_forge.commands.graft", "graft",
2735
2735
  "Pull one symbol from a source file into the target's tier "
2736
2736
  "surface and optionally auto-wire CLI + MCP."),
2737
+ # v0.78.0 — token-savings: lifetime ledger of LLM round-trips
2738
+ # spared. Every enriched verb appends to .atomadic-forge/
2739
+ # lifetime_savings.jsonl automatically.
2740
+ ("atomadic_forge.commands.token_savings", "token-savings",
2741
+ "Show the project's lifetime token-savings ledger."),
2737
2742
  ("atomadic_forge.commands.emergent_swarm", "emergent-swarm",
2738
2743
  "Round-5: cross-repo emergent composition discovery."),
2739
2744
  ("atomadic_forge.commands.emergent_swarm", "emergent_swarm",
@@ -0,0 +1,70 @@
1
+ """Tier a4 — `forge token-savings` CLI surface.
2
+
3
+ Display the lifetime token-savings ledger for a project. Every Forge
4
+ verb that reports a ``scope.tokens_saved_estimate`` automatically
5
+ appends to this ledger via ``response_enricher.enrich_response``, so
6
+ the running total is the cumulative LLM round-trip cost the Forge has
7
+ spared the caller — boastable, verifiable, file-backed.
8
+
9
+ The ledger lives at ``<project>/.atomadic-forge/lifetime_savings.jsonl``.
10
+ One JSON object per line, append-only. Read it directly to audit.
11
+ """
12
+ from __future__ import annotations
13
+
14
+ import json
15
+ from pathlib import Path
16
+ from typing import Annotated
17
+
18
+ import typer
19
+
20
+ from atomadic_forge.a1_at_functions.lifetime_savings import (
21
+ read_savings_summary,
22
+ )
23
+
24
+ COMMAND_NAME = "token-savings"
25
+ COMMAND_HELP = (
26
+ "Show the project's lifetime token-savings ledger — the cumulative "
27
+ "LLM round-trips the Forge has spared, broken down by tool."
28
+ )
29
+
30
+ app = typer.Typer(no_args_is_help=False, help=COMMAND_HELP)
31
+
32
+
33
+ @app.callback(invoke_without_command=True)
34
+ def run(
35
+ project: Annotated[Path, typer.Option(
36
+ "--project", "-p",
37
+ help="Project root (must contain .atomadic-forge/).",
38
+ exists=True, file_okay=False, dir_okay=True, resolve_path=True)] = (
39
+ Path(".")),
40
+ json_out: Annotated[bool, typer.Option(
41
+ "--json", help="Emit machine-readable JSON.")] = False,
42
+ ) -> None:
43
+ """Show lifetime token-savings for the project."""
44
+ summary = read_savings_summary(project_root=project)
45
+
46
+ if json_out:
47
+ typer.echo(json.dumps(summary, indent=2, default=str))
48
+ return
49
+
50
+ typer.echo("")
51
+ typer.echo("Forge — lifetime token-savings ledger")
52
+ typer.echo("-" * 60)
53
+ typer.echo(f" project: {project}")
54
+ typer.echo(f" ledger: {summary['ledger_file']}")
55
+ if not summary["ledger_present"]:
56
+ typer.secho(" (no ledger yet — run any verb to start logging)",
57
+ fg="yellow")
58
+ return
59
+ total = int(summary["tokens_saved_lifetime"])
60
+ typer.echo(f" entries: {summary['entry_count']}")
61
+ typer.echo(f" tokens saved: {total:,}")
62
+ typer.echo(f" first seen: {summary['first_seen_at']}")
63
+ typer.echo(f" last seen: {summary['last_seen_at']}")
64
+ by_tool = summary.get("by_tool") or {}
65
+ if by_tool:
66
+ typer.echo("")
67
+ typer.echo(" by tool:")
68
+ for tool, n in sorted(by_tool.items(), key=lambda kv: -kv[1]):
69
+ pct = (100.0 * n / total) if total else 0.0
70
+ typer.echo(f" {tool:<14} {n:>10,} ({pct:5.1f}%)")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atomadic-forge
3
- Version: 0.77.0
3
+ Version: 0.78.0
4
4
  Summary: Atomadic Forge — absorb, enforce, emerge. Polyglot (Python · JavaScript/TypeScript · Rust · Go · Swift · Kotlin) architecture guardian for AI-generated code.
5
5
  Author: Atomadic
6
6
  License-Expression: BUSL-1.1
@@ -225,8 +225,8 @@ Full tool reference: [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md) | First call: `welco
225
225
 
226
226
  | MCP tools | **10 tools · 116 actions** |
227
227
  | CLI verbs | **59** |
228
- | Source files | **232** (~47K LOC) |
229
- | Tests | **1588 passing** across **115 test files** |
228
+ | Source files | **233** (~47K LOC) |
229
+ | Tests | **1592 passing** across **116 test files** |
230
230
  | Lean4 formal proofs | **872 theorems** (mathematically verified core logic) |
231
231
  | Monadic tiers | **5** (a0 → a4, strict upward-only composition) |
232
232
  | Languages | Python, JS/TS, Swift, Kotlin, Go, Rust |
@@ -339,6 +339,7 @@ src/atomadic_forge/commands/relay.py
339
339
  src/atomadic_forge/commands/surface.py
340
340
  src/atomadic_forge/commands/synergy.py
341
341
  src/atomadic_forge/commands/synergy_then_emergent.py
342
+ src/atomadic_forge/commands/token_savings.py
342
343
  src/atomadic_forge/commands/welcome.py
343
344
  src/atomadic_forge/commands/wisdom.py
344
345
  tests/test_aaaa_nexus_client.py
@@ -446,6 +447,7 @@ tests/test_surface_gap_check.py
446
447
  tests/test_synergy.py
447
448
  tests/test_test_runner.py
448
449
  tests/test_tier_init_rebuild.py
450
+ tests/test_token_savings_ledger.py
449
451
  tests/test_trust_gate_response.py
450
452
  tests/test_verify_suggested_recipe.py
451
453
  tests/test_welcome.py
@@ -0,0 +1,76 @@
1
+ """Tests for the auto-ledger token-savings flow.
2
+
3
+ Every Forge verb that calls ``enrich_response`` with a positive
4
+ ``tokens_saved_estimate`` should automatically append a ledger entry.
5
+ The total surfaced via ``read_savings_summary`` is the boastable
6
+ public metric.
7
+ """
8
+ from __future__ import annotations
9
+
10
+ from pathlib import Path
11
+
12
+ from atomadic_forge.a1_at_functions.lifetime_savings import (
13
+ read_savings_summary,
14
+ )
15
+ from atomadic_forge.a1_at_functions.response_enricher import (
16
+ enrich_response,
17
+ make_scope,
18
+ )
19
+
20
+
21
+ def test_enrich_writes_ledger_entry(tmp_path: Path) -> None:
22
+ """Positive scope + project_root + tool ⇒ ledger row appended."""
23
+ scope = make_scope(files_scanned=10, basis_kind="files")
24
+ out = enrich_response(
25
+ {"schema_version": "test/v1"},
26
+ scope=scope,
27
+ summary="tested",
28
+ project_root=tmp_path,
29
+ tool="recon",
30
+ )
31
+ assert out["scope"]["tokens_saved_estimate"] > 0
32
+ summary = read_savings_summary(project_root=tmp_path)
33
+ assert summary["ledger_present"]
34
+ assert summary["entry_count"] == 1
35
+ assert summary["tokens_saved_lifetime"] == out["scope"]["tokens_saved_estimate"]
36
+ assert summary["by_tool"]["recon"] == out["scope"]["tokens_saved_estimate"]
37
+
38
+
39
+ def test_enrich_without_project_root_skips_ledger(tmp_path: Path) -> None:
40
+ """Old-style call (no project_root) must not write to any ledger."""
41
+ enrich_response(
42
+ {"schema_version": "test/v1"},
43
+ scope=make_scope(files_scanned=10, basis_kind="files"),
44
+ summary="tested",
45
+ )
46
+ summary = read_savings_summary(project_root=tmp_path)
47
+ assert summary["ledger_present"] is False
48
+ assert summary["tokens_saved_lifetime"] == 0
49
+
50
+
51
+ def test_enrich_zero_estimate_skips_ledger(tmp_path: Path) -> None:
52
+ """An estimate of 0 must not create a ledger entry."""
53
+ enrich_response(
54
+ {"schema_version": "test/v1"},
55
+ scope=make_scope(basis_kind="none"),
56
+ summary="tested",
57
+ project_root=tmp_path,
58
+ tool="recon",
59
+ )
60
+ summary = read_savings_summary(project_root=tmp_path)
61
+ assert summary["ledger_present"] is False
62
+
63
+
64
+ def test_multiple_calls_accumulate(tmp_path: Path) -> None:
65
+ """Three enriched calls land three entries; totals add."""
66
+ for i in range(3):
67
+ enrich_response(
68
+ {},
69
+ scope=make_scope(files_scanned=5 + i, basis_kind="files"),
70
+ project_root=tmp_path,
71
+ tool=f"tool_{i}",
72
+ )
73
+ summary = read_savings_summary(project_root=tmp_path)
74
+ assert summary["entry_count"] == 3
75
+ # by_tool keys should be the three distinct tool names
76
+ assert set(summary["by_tool"].keys()) == {"tool_0", "tool_1", "tool_2"}
@@ -191,25 +191,28 @@ def test_read_savings_summary_skips_malformed_lines(tmp_path: Path) -> None:
191
191
 
192
192
 
193
193
  def test_welcome_logs_session_to_ledger_and_reads_lifetime(tmp_path: Path) -> None:
194
- # First run — establishes the ledger.
194
+ # First run — establishes the ledger. As of v0.78 every constituent
195
+ # verb (recon, wire) auto-ledgers via enrich_response in addition
196
+ # to welcome's own session aggregate, so entry_count >= 1.
195
197
  out1 = welcome(project_root=tmp_path, skip_certify=True)
196
198
  assert out1["session_tokens_saved_estimate"] >= 0
197
- assert out1["lifetime_savings"]["entry_count"] == 1
199
+ n1 = out1["lifetime_savings"]["entry_count"]
200
+ assert n1 >= 1
198
201
  # Second run — lifetime grows.
199
202
  out2 = welcome(project_root=tmp_path, skip_certify=True)
200
- assert out2["lifetime_savings"]["entry_count"] == 2
203
+ assert out2["lifetime_savings"]["entry_count"] > n1
201
204
  assert (out2["lifetime_savings"]["tokens_saved_lifetime"]
202
205
  >= out1["lifetime_savings"]["tokens_saved_lifetime"])
203
206
 
204
207
 
205
208
  def test_welcome_narrative_surfaces_lifetime_after_two_sessions(tmp_path: Path) -> None:
206
- # First run won't show lifetime (suppressed at <2 entries to avoid
207
- # underselling first-time users).
209
+ # First run will already show lifetime as of v0.78 because constituent
210
+ # verbs auto-ledger; subsequent runs continue to show it.
208
211
  out1 = welcome(project_root=tmp_path, skip_certify=True)
209
- assert "Lifetime savings" not in out1["narrative"]
210
- # Second run shows it.
211
212
  out2 = welcome(project_root=tmp_path, skip_certify=True)
212
213
  assert "Lifetime savings" in out2["narrative"]
214
+ # First-run narrative may or may not show — just guard the second one.
215
+ assert out1["lifetime_savings"]["entry_count"] >= 1
213
216
 
214
217
 
215
218
  # ---------- 4. polished failing-repo narrative -------------------------
File without changes