atomadic-forge 0.76.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.76.0 → atomadic_forge-0.78.0}/CHANGELOG.md +11 -0
  2. {atomadic_forge-0.76.0/src/atomadic_forge.egg-info → atomadic_forge-0.78.0}/PKG-INFO +3 -3
  3. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/README.md +2 -2
  4. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/CI_CD.md +3 -3
  5. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/COMMANDS.md +1 -1
  6. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/FORMALIZATION.md +2 -2
  7. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/MCP_TOOLS.md +2 -2
  8. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/RECEIPT.md +2 -2
  9. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/pyproject.toml +1 -1
  10. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/certify_checks.py +2 -0
  11. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/cherry_pick.py +27 -0
  12. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/doc_auto_update.py +199 -7
  13. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/response_enricher.py +22 -0
  14. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/scout_walk.py +2 -0
  15. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/wire_check.py +2 -0
  16. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/emergent_feature.py +2 -0
  17. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/forge_pipeline.py +2 -0
  18. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/synergy_feature.py +2 -0
  19. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/verify_umbrella.py +2 -0
  20. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a4_sy_orchestration/cli.py +5 -0
  21. atomadic_forge-0.78.0/src/atomadic_forge/commands/token_savings.py +70 -0
  22. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0/src/atomadic_forge.egg-info}/PKG-INFO +3 -3
  23. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge.egg-info/SOURCES.txt +3 -0
  24. atomadic_forge-0.78.0/tests/test_cherry_dedup_class_methods.py +80 -0
  25. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_doc_auto_update.py +103 -0
  26. atomadic_forge-0.78.0/tests/test_token_savings_ledger.py +76 -0
  27. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_welcome_enhancements.py +10 -7
  28. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/.github/FUNDING.yml +0 -0
  29. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  30. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  31. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  32. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/.github/actions/forge-action/README.md +0 -0
  33. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/.github/actions/forge-action/action.yml +0 -0
  34. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/.github/dependabot.yml +0 -0
  35. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/.github/pull_request_template.md +0 -0
  36. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/.github/workflows/ci.yml +0 -0
  37. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/.github/workflows/customer-refactor.yml +0 -0
  38. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/.github/workflows/forge-self-certify.yml +0 -0
  39. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/.github/workflows/mcp-registry-publish.yml +0 -0
  40. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/.github/workflows/metrics-auto-regen.yml +0 -0
  41. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/.github/workflows/metrics-drift.yml +0 -0
  42. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/.github/workflows/publish-on-tag.yml +0 -0
  43. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/.github/workflows/release-readiness.yml +0 -0
  44. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/.github/workflows/release.yml +0 -0
  45. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/.github/workflows/surface-drift.yml +0 -0
  46. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/.github/workflows/uptime.yml +0 -0
  47. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/ARCHITECTURE.md +0 -0
  48. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/CONTRIBUTING.md +0 -0
  49. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/LICENSE +0 -0
  50. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/MANIFEST.in +0 -0
  51. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/SECURITY.md +0 -0
  52. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/assets/Atomadic-Forge-01.png +0 -0
  53. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/01-getting-started.md +0 -0
  54. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/02-commands.md +0 -0
  55. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/03-tutorial.md +0 -0
  56. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/04-llm-loops.md +0 -0
  57. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/05-faq.md +0 -0
  58. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/AGENTS_GUIDE.md +0 -0
  59. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/AIR_GAPPED.md +0 -0
  60. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/CODEX_WALKTHROUGH.md +0 -0
  61. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/FIRST_10_MINUTES.md +0 -0
  62. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/HIVE_PRIMITIVES.md +0 -0
  63. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/HIVE_STATUS.md +0 -0
  64. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/IDE_INTEGRATION.md +0 -0
  65. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/LANDSCAPE.md +0 -0
  66. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/MARKET_POSITIONING.md +0 -0
  67. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/MIGRATION.md +0 -0
  68. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/MULTI_REPO.md +0 -0
  69. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/PROVIDERS.md +0 -0
  70. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/README.md +0 -0
  71. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/RELAY_PROTOCOL.md +0 -0
  72. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/RELEASE_CHECKLIST.md +0 -0
  73. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/RELEASE_MESSAGING.md +0 -0
  74. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/ROADMAP.md +0 -0
  75. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/SHOWCASE.md +0 -0
  76. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/SIDECAR.md +0 -0
  77. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/STUDIO.md +0 -0
  78. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/TOOL_FACTORY_WALKTHROUGH.md +0 -0
  79. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/V0.46.0_JUSTIFICATION_REPORT.md +0 -0
  80. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/V0.47.0_SELF_TEST_REPORT.md +0 -0
  81. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/WHY_NOW.md +0 -0
  82. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/WORKER_VS_LOCAL_MCP.md +0 -0
  83. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/WORLD_COLLISION.md +0 -0
  84. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/INDEX.md +0 -0
  85. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/absorb.md +0 -0
  86. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/audit.md +0 -0
  87. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/chat.md +0 -0
  88. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/commandsmith.md +0 -0
  89. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/config.md +0 -0
  90. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/create.md +0 -0
  91. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/demo.md +0 -0
  92. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/emergent-swarm.md +0 -0
  93. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/emergent-then-synergy.md +0 -0
  94. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/emergent.md +0 -0
  95. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/enhancement.md +0 -0
  96. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/evolve-then-iterate.md +0 -0
  97. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/evolve.md +0 -0
  98. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/feature-then-emergent.md +0 -0
  99. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/guard-install.md +0 -0
  100. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/handoff.md +0 -0
  101. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/harvest.md +0 -0
  102. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/hive.md +0 -0
  103. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/iterate.md +0 -0
  104. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/materialize.md +0 -0
  105. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/metrics.md +0 -0
  106. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/recon-swarm.md +0 -0
  107. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/relay.md +0 -0
  108. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/surface.md +0 -0
  109. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/synergy-then-emergent.md +0 -0
  110. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/synergy.md +0 -0
  111. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/welcome.md +0 -0
  112. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/commands/wisdom.md +0 -0
  113. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
  114. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/compliance/CS-1.md +0 -0
  115. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
  116. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
  117. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/compliance/SR_11-7_MAPPING.md +0 -0
  118. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/handoffs/WORKER_AUTO_DEPLOY_2026-05-06.md +0 -0
  119. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/tutorials/01-quickstart.md +0 -0
  120. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/tutorials/02-your-first-package.md +0 -0
  121. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/tutorials/03-the-five-tier-law.md +0 -0
  122. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/tutorials/04-plug-in-llms.md +0 -0
  123. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/tutorials/05-multi-repo-absorb.md +0 -0
  124. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/docs/tutorials/06-javascript-quickstart.md +0 -0
  125. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/setup.cfg +0 -0
  126. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/__init__.py +0 -0
  127. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/__main__.py +0 -0
  128. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
  129. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
  130. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
  131. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
  132. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
  133. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
  134. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/enhancement_proposal_constants.py +0 -0
  135. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
  136. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
  137. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
  138. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/handoff_constants.py +0 -0
  139. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/hive_constants.py +0 -0
  140. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +0 -0
  141. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/lifetime_savings_constants.py +0 -0
  142. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/materialize_types.py +0 -0
  143. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +0 -0
  144. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/nexus_constants.py +0 -0
  145. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
  146. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
  147. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/response_enrichment.py +0 -0
  148. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
  149. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +0 -0
  150. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
  151. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
  152. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
  153. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
  154. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/welcome_constants.py +0 -0
  155. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/wisdom_constants.py +0 -0
  156. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
  157. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/abstract_method_repair.py +0 -0
  158. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +0 -0
  159. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
  160. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
  161. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
  162. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/ast_scope_lock.py +0 -0
  163. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
  164. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/call_graph.py +0 -0
  165. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/capability_scout.py +0 -0
  166. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
  167. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
  168. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
  169. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/code_signature.py +0 -0
  170. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
  171. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
  172. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
  173. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
  174. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
  175. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/cosine_similarity.py +0 -0
  176. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
  177. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/custom_provider_client.py +0 -0
  178. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/dead_code_check.py +0 -0
  179. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
  180. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
  181. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
  182. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
  183. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
  184. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
  185. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/enhancement_proposal_builder.py +0 -0
  186. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
  187. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
  188. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/exported_api_check.py +0 -0
  189. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
  190. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
  191. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/forge_locate.py +0 -0
  192. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/forge_metrics.py +0 -0
  193. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
  194. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/git_churn.py +0 -0
  195. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/graft_extract.py +0 -0
  196. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/handoff_builder.py +0 -0
  197. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/harvest_absorb.py +0 -0
  198. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/harvest_concept_bridge.py +0 -0
  199. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/hive_consensus_math.py +0 -0
  200. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/hive_io.py +0 -0
  201. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
  202. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
  203. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/intent_similarity.py +0 -0
  204. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
  205. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/lifetime_savings.py +0 -0
  206. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
  207. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
  208. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
  209. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
  210. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
  211. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/maintainability_index.py +0 -0
  212. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
  213. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +0 -0
  214. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
  215. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
  216. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
  217. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/polyglot_classify.py +0 -0
  218. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/polyglot_imports.py +0 -0
  219. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/polyglot_surface.py +0 -0
  220. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
  221. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
  222. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
  223. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
  224. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
  225. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
  226. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
  227. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/repo_public_surface.py +0 -0
  228. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +0 -0
  229. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
  230. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
  231. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
  232. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
  233. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/scaffold_polyglot.py +0 -0
  234. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
  235. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
  236. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
  237. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
  238. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/smell_scan.py +0 -0
  239. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/steersman_pack.py +0 -0
  240. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
  241. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/surface_gap_check.py +0 -0
  242. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
  243. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
  244. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
  245. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
  246. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/test_selector.py +0 -0
  247. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
  248. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
  249. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
  250. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +0 -0
  251. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/validation_commands.py +0 -0
  252. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/welcome_narrator.py +0 -0
  253. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/wire_stubs_gen.py +0 -0
  254. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/wisdom_capture.py +0 -0
  255. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/wisdom_io.py +0 -0
  256. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/wisdom_promote.py +0 -0
  257. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/wisdom_recall.py +0 -0
  258. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/worktree_status.py +0 -0
  259. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
  260. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +0 -0
  261. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +0 -0
  262. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/evolve_session_store.py +0 -0
  263. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
  264. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +0 -0
  265. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/iterate_session_store.py +0 -0
  266. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
  267. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
  268. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/nexus_client.py +0 -0
  269. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
  270. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
  271. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/remote_seed_store.py +0 -0
  272. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/repo_public_surface_sync.py +0 -0
  273. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
  274. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/absorb_feature.py +0 -0
  275. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +0 -0
  276. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/cherry_hunter.py +0 -0
  277. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/cna_check.py +0 -0
  278. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
  279. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/commit_compose.py +0 -0
  280. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/create_feature.py +0 -0
  281. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/dedup_engine.py +0 -0
  282. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +0 -0
  283. {atomadic_forge-0.76.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
  284. {atomadic_forge-0.76.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
  285. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
  286. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +0 -0
  287. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
  288. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
  289. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/emergent_swarm.py +0 -0
  290. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/enhancement_proposal_feature.py +0 -0
  291. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
  292. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
  293. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/forge_evolve_session.py +0 -0
  294. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
  295. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/forge_loop_session.py +0 -0
  296. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/forge_metrics_feature.py +0 -0
  297. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
  298. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/graft_feature.py +0 -0
  299. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/guard_install.py +0 -0
  300. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/handoff_feature.py +0 -0
  301. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/hive_sync.py +0 -0
  302. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
  303. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/materialize_feature.py +0 -0
  304. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/mcp_server.py +0 -0
  305. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/nexus_bridge.py +0 -0
  306. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/relay_daemon.py +0 -0
  307. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
  308. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/surface_export.py +0 -0
  309. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/tool_factory.py +0 -0
  310. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/welcome_feature.py +0 -0
  311. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/wisdom_feature.py +0 -0
  312. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
  313. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
  314. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
  315. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
  316. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/__init__.py +0 -0
  317. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/_registry.py +0 -0
  318. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/absorb.py +0 -0
  319. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/audit.py +0 -0
  320. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/chat.py +0 -0
  321. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/commandsmith.py +0 -0
  322. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/config_cmd.py +0 -0
  323. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/create.py +0 -0
  324. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/demo.py +0 -0
  325. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/emergent.py +0 -0
  326. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/emergent_swarm.py +0 -0
  327. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
  328. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/enhancement.py +0 -0
  329. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/evolve.py +0 -0
  330. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
  331. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
  332. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/graft.py +0 -0
  333. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/guard_install.py +0 -0
  334. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/handoff.py +0 -0
  335. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/harvest.py +0 -0
  336. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/hive.py +0 -0
  337. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/iterate.py +0 -0
  338. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/materialize.py +0 -0
  339. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/metrics.py +0 -0
  340. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/recon_swarm.py +0 -0
  341. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/relay.py +0 -0
  342. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/surface.py +0 -0
  343. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/synergy.py +0 -0
  344. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
  345. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/welcome.py +0 -0
  346. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/wisdom.py +0 -0
  347. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
  348. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
  349. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge.egg-info/requires.txt +0 -0
  350. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/src/atomadic_forge.egg-info/top_level.txt +0 -0
  351. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_aaaa_nexus_client.py +0 -0
  352. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_abstract_method_repair.py +0 -0
  353. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_agent_hire_protocol.py +0 -0
  354. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_agent_plan.py +0 -0
  355. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_agent_plan_pkg_label.py +0 -0
  356. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_agent_summary.py +0 -0
  357. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_ast_scope_lock.py +0 -0
  358. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_audit_verb.py +0 -0
  359. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_body_extractor_repairs.py +0 -0
  360. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_call_graph_summary.py +0 -0
  361. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_capability_scout.py +0 -0
  362. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_card_renderer.py +0 -0
  363. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_certify_operational_axis.py +0 -0
  364. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_chat.py +0 -0
  365. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_cherry_pick.py +0 -0
  366. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_classify_tier.py +0 -0
  367. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_classify_tier_ast_signals.py +0 -0
  368. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_cli_smoke.py +0 -0
  369. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_cli_swarm_aliases.py +0 -0
  370. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_codex_5_complete.py +0 -0
  371. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_codex_6_enforce_polyglot.py +0 -0
  372. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_commandsmith.py +0 -0
  373. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_compiler_feedback.py +0 -0
  374. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_compliance_checker.py +0 -0
  375. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_config.py +0 -0
  376. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_copilots_copilot.py +0 -0
  377. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_cost_circuit_breaker.py +0 -0
  378. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_create_feature.py +0 -0
  379. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_cs1_renderer.py +0 -0
  380. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_custom_provider.py +0 -0
  381. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_dead_code_check.py +0 -0
  382. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_dedup_engine.py +0 -0
  383. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_demo.py +0 -0
  384. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_emergent_compose.py +0 -0
  385. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_emergent_signature_extract.py +0 -0
  386. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_emergent_synthesize_imports.py +0 -0
  387. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_enhancement_proposal.py +0 -0
  388. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_error_codes.py +0 -0
  389. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_error_hints.py +0 -0
  390. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_evolve_js.py +0 -0
  391. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_exported_api_check.py +0 -0
  392. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_finalize_scaffold.py +0 -0
  393. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_forge_action.py +0 -0
  394. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_forge_auth_a1.py +0 -0
  395. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_forge_auth_a2.py +0 -0
  396. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_forge_enforce.py +0 -0
  397. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_generation_quality.py +0 -0
  398. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_git_churn.py +0 -0
  399. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_graft_feature.py +0 -0
  400. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_handoff.py +0 -0
  401. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_harvest_concept_bridge.py +0 -0
  402. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_harvest_source_warnings.py +0 -0
  403. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_hierarchical_memory.py +0 -0
  404. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_hive_sync.py +0 -0
  405. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_ignore_and_docs.py +0 -0
  406. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_import_smoke.py +0 -0
  407. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_iterate_evolve.py +0 -0
  408. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_js_certify.py +0 -0
  409. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_js_parser.py +0 -0
  410. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_js_recon.py +0 -0
  411. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_js_wire.py +0 -0
  412. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_lineage_chain.py +0 -0
  413. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_ling_provider.py +0 -0
  414. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_local_signer.py +0 -0
  415. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_lsp_protocol.py +0 -0
  416. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_maintainability_index.py +0 -0
  417. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_manifest_diff.py +0 -0
  418. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_materialize_feature.py +0 -0
  419. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_mcp_lazy_bootstrap.py +0 -0
  420. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_mcp_protocol.py +0 -0
  421. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_nexus_bridge.py +0 -0
  422. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_ollama_client.py +0 -0
  423. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_pipeline.py +0 -0
  424. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_plan_apply.py +0 -0
  425. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_polyglot_cli_mcp.py +0 -0
  426. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_polyglot_full_pipeline.py +0 -0
  427. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_polyglot_hardening.py +0 -0
  428. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_polyglot_swift_kotlin_go.py +0 -0
  429. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_polyglot_symbol_parity.py +0 -0
  430. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_pre_audit_smoke.py +0 -0
  431. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_precommit_hooks.py +0 -0
  432. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_progress_reporter.py +0 -0
  433. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_receipt_emitter.py +0 -0
  434. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_receipt_schema.py +0 -0
  435. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_receipt_signer.py +0 -0
  436. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_remote_seed_store.py +0 -0
  437. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_repo_public_surface.py +0 -0
  438. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_response_enricher.py +0 -0
  439. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_roi_calculator.py +0 -0
  440. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_sbom_cmd_text_summary.py +0 -0
  441. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_sbom_emitter.py +0 -0
  442. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_scaffold.py +0 -0
  443. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_sidecar.py +0 -0
  444. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_sidecar_validate.py +0 -0
  445. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_smell_score_formula.py +0 -0
  446. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_stagnation.py +0 -0
  447. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_steersman_pack.py +0 -0
  448. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_stub_detector.py +0 -0
  449. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_surface_export.py +0 -0
  450. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_surface_gap_check.py +0 -0
  451. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_synergy.py +0 -0
  452. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_test_runner.py +0 -0
  453. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_tier_init_rebuild.py +0 -0
  454. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_trust_gate_response.py +0 -0
  455. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_verify_suggested_recipe.py +0 -0
  456. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_welcome.py +0 -0
  457. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_whoami_cmd.py +0 -0
  458. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_wire_certify.py +0 -0
  459. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_wire_stubs_gen.py +0 -0
  460. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_wire_suggest_repairs.py +0 -0
  461. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_wire_type_checking.py +0 -0
  462. {atomadic_forge-0.76.0 → atomadic_forge-0.78.0}/tests/test_wisdom.py +0 -0
@@ -2,6 +2,17 @@
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
+
10
+ ## v0.77.0 — 2026-05-08
11
+
12
+ - fix(forge): cherry-pick — collapse Class.method explosion (root-cause)
13
+ - feat(doc-update): auto-update 6 previously missed doc files on release
14
+
15
+
5
16
  ## v0.76.0 — 2026-05-08
6
17
 
7
18
  - feat(forge): graft — surgical single-symbol cross-repo capability transfer
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atomadic-forge
3
- Version: 0.76.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 | **1578 passing** across **114 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 | **1578 passing** across **114 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 |
@@ -46,7 +46,7 @@ jobs:
46
46
  run: |
47
47
  pip install atomadic-forge # PyPI (preferred)
48
48
  # Or pin to an exact tag:
49
- # pip install "git+https://github.com/atomadictech/atomadic-forge@v0.60.0"
49
+ # pip install "git+https://github.com/atomadictech/atomadic-forge@v0.77.0"
50
50
  # Or vendor wheels: pip install --no-index --find-links wheels/ atomadic-forge
51
51
 
52
52
  - name: Wire scan (upward-import discipline)
@@ -97,7 +97,7 @@ forge-certify:
97
97
  image: python:3.11-slim
98
98
  timeout: 10 minutes
99
99
  before_script:
100
- - pip install "git+https://github.com/atomadictech/atomadic-forge@v0.60.0"
100
+ - pip install "git+https://github.com/atomadictech/atomadic-forge@v0.77.0"
101
101
  script:
102
102
  - forge wire src/your_package --fail-on-violations --json > wire.json
103
103
  - forge certify . --package your_package --fail-under 75 --json > certify.json
@@ -156,7 +156,7 @@ Then in **the consuming repo's** `.pre-commit-config.yaml`:
156
156
  ```yaml
157
157
  repos:
158
158
  - repo: https://github.com/atomadictech/atomadic-forge
159
- rev: v0.60.0
159
+ rev: v0.77.0
160
160
  hooks:
161
161
  - id: forge-wire
162
162
  - id: forge-certify
@@ -1,6 +1,6 @@
1
1
  # Atomadic Forge — Command Reference
2
2
 
3
- All verbs available in the `forge` CLI as of 0.60.0.
3
+ All verbs available in the `forge` CLI as of 0.77.0
4
4
 
5
5
  > For the structured per-verb reference (with options, examples, and
6
6
  > output samples), see [02-commands.md](02-commands.md). This page is
@@ -39,7 +39,7 @@ Forge certify scores out of **100** in two layers:
39
39
  JS / TS packages cap at **60/100** today: they earn the four
40
40
  structural axes, but the +25 runtime-import smoke and +30 behavioural
41
41
  pytest are Python-only. Wiring `npm test` / Vitest into the
42
- behavioural axis is on the post-v0.60.0 roadmap.
42
+ behavioural axis is on the post-v0.77.0 roadmap.
43
43
 
44
44
  ---
45
45
 
@@ -131,7 +131,7 @@ runtime dependency makes the package unusable.
131
131
 
132
132
  **Why JS/TS does not get this gate yet.** AAM §5.4 (Threats to
133
133
  Validity) explicitly flags polyglot runtime gating as a roadmap
134
- item (post-v0.60.0): the equivalent for JS would be an `npm test`
134
+ item (post-v0.77.0): the equivalent for JS would be an `npm test`
135
135
  invocation, which requires a Node toolchain we do not yet bundle.
136
136
 
137
137
  **Citation.** AAM §5.1 (Core Pipeline Pseudocode); AAM §5.4 (Threats
@@ -1,6 +1,6 @@
1
1
  # Forge MCP Tools Reference
2
2
 
3
- Forge ships a Model Context Protocol server exposing **10 tools dispatching 112 registry-callable actions**. Counts are auto-synced from `forge_metrics.json` by `doc-update`.
3
+ Forge ships a Model Context Protocol server exposing **10 tools dispatching 116 registry-callable actions**. Counts are auto-synced from `forge_metrics.json` by `doc-update`.
4
4
  The per-tool table below lists the primary dispatch actions; the headline total also includes compatibility routes that keep older callers working.
5
5
  All legacy tool names redirect automatically — existing callers keep working.
6
6
 
@@ -17,7 +17,7 @@ All legacy tool names redirect automatically — existing callers keep working.
17
17
  | Tool | Actions | Purpose |
18
18
  |------|---------|---------|
19
19
  | [`welcome`](#welcome) | — | Session onboarding: scan, score, narrative, capability tour |
20
- | [`explore`](#explore) | 16 | Analyze and understand a codebase — recon, call graphs, smells, harvest, discovery |
20
+ | [`explore`](#explore) | 17 | Analyze and understand a codebase — recon, call graphs, smells, harvest, discovery |
21
21
  | [`audit`](#audit) | 23 | Quality gates, change safety, trust verification |
22
22
  | [`plan`](#plan) | 10 | Dev orientation and utilities — context packs, recipes, commit messages, steersman packs |
23
23
  | [`transmute`](#transmute) | 3 | **FLAGSHIP** spaghetti-to-certified pipeline |
@@ -30,7 +30,7 @@ referenced from the Receipt.
30
30
  {
31
31
  "schema_version": "atomadic-forge.receipt/v1",
32
32
  "generated_at_utc": "2026-04-28T17:42:11Z",
33
- "forge_version": "0.60.0",
33
+ "forge_version": "0.77.0",
34
34
  "verdict": "PASS",
35
35
  "project": { ... },
36
36
  "certify": { ... },
@@ -108,7 +108,7 @@ cited:
108
108
  {
109
109
  "schema_version": "atomadic-forge.receipt/v1",
110
110
  "generated_at_utc": "2026-04-28T17:42:11Z",
111
- "forge_version": "0.60.0",
111
+ "forge_version": "0.77.0",
112
112
  "verdict": "PASS",
113
113
 
114
114
  "project": {
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "atomadic-forge"
7
- version = "0.76.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
  )
@@ -62,6 +62,7 @@ def select_items(scout_report: dict, *, names: Iterable[str] | None = None,
62
62
  "confidence": _confidence_of(s),
63
63
  "reasons": _reasons_for(s),
64
64
  })
65
+ items = _dedup_methods_under_class(items)
65
66
  return {
66
67
  "schema_version": "atomadic-forge.cherry/v1",
67
68
  "source_repo": scout_report.get("repo", ""),
@@ -69,6 +70,32 @@ def select_items(scout_report: dict, *, names: Iterable[str] | None = None,
69
70
  }
70
71
 
71
72
 
73
+ def _dedup_methods_under_class(items: list[dict]) -> list[dict]:
74
+ """Collapse ``Class.method`` items when ``Class`` is already selected.
75
+
76
+ The 47-file class explosion fix: scout enumerates a class plus every
77
+ public method as separate symbols (``IndexStore`` and
78
+ ``IndexStore.add``, ``IndexStore.search``, ...). Without this filter,
79
+ finalize copies the same source file once per qualname under
80
+ different slugs, exploding a single class into N near-identical files.
81
+
82
+ When the parent class is in the manifest, we drop its methods —
83
+ they ride along inside the class body. When the parent is absent
84
+ (rare; scout dropped it), we keep the methods so capability isn't
85
+ lost.
86
+ """
87
+ class_quals = {it["qualname"] for it in items if "." not in it["qualname"]}
88
+ out: list[dict] = []
89
+ for it in items:
90
+ qual = it["qualname"]
91
+ if "." in qual:
92
+ parent = qual.rsplit(".", 1)[0]
93
+ if parent in class_quals:
94
+ continue
95
+ out.append(it)
96
+ return out
97
+
98
+
72
99
  def _confidence_of(symbol: dict) -> float:
73
100
  # High confidence when name tokens drove the decision; lower when we fell
74
101
  # back to the kind-default (function→a1, class→a2). Cheap proxy: complexity
@@ -2,9 +2,11 @@
2
2
 
3
3
  Zero LLM tokens. Reads forge_metrics.json, inspects MCP enum lists and CLI
4
4
  command decorators, then rewrites bounded sections in README.md, CHANGELOG.md,
5
- docs/IDE_INTEGRATION.md, WHITEPAPER.md, and docs/AGENTS_GUIDE.md
6
- programmatically. Every value is derived from live code or the metrics artifact
7
- no human-authored prose is touched.
5
+ docs/IDE_INTEGRATION.md, WHITEPAPER.md, docs/AGENTS_GUIDE.md,
6
+ tests/README.md, docs/CI_CD.md, docs/COMMANDS.md, docs/RECEIPT.md,
7
+ docs/FORMALIZATION.md, and docs/MCP_TOOLS.md programmatically. Every value
8
+ is derived from live code or the metrics artifact — no human-authored prose
9
+ is touched.
8
10
 
9
11
  Updateable sections
10
12
  -------------------
@@ -29,6 +31,26 @@ WHITEPAPER.md
29
31
  docs/AGENTS_GUIDE.md
30
32
  • Summary table rows matching ``| explore | NN actions |`` pattern (if present).
31
33
 
34
+ tests/README.md
35
+ • "NN test files covering N,NNN passing tests" line.
36
+
37
+ docs/CI_CD.md
38
+ • Git-pinned install URLs ``atomadic-forge@vX.Y.Z`` → current version.
39
+ • Pre-commit ``rev: vX.Y.Z`` pin → current version.
40
+
41
+ docs/COMMANDS.md
42
+ • "as of X.Y.Z" version anchor in header.
43
+
44
+ docs/RECEIPT.md
45
+ • ``"forge_version": "X.Y.Z"`` in example JSON payloads.
46
+
47
+ docs/FORMALIZATION.md
48
+ • ``post-vX.Y.Z`` roadmap anchors.
49
+
50
+ docs/MCP_TOOLS.md
51
+ • Header line ``NN tools dispatching NN registry-callable actions``.
52
+ • Per-tool action counts in the summary table.
53
+
32
54
  Pure: no subprocess unless git is requested. No writes when dry_run=True.
33
55
  """
34
56
  from __future__ import annotations
@@ -78,6 +100,33 @@ _DRIFT_TOOLS_RE = re.compile(r'(\d+)\s+MCP\s+tools')
78
100
  _DRIFT_ACTIONS_RE = re.compile(r'dispatching\s+(\d+)\s+actions')
79
101
  _DRIFT_TESTS_RE = re.compile(r'([\d,]+)\s+passing\s+tests')
80
102
 
103
+ # ── version-anchor regexes (update_version_anchors) ───────────────────────────
104
+ # tests/README.md: "NN test files covering N,NNN passing tests"
105
+ _TESTS_README_RE = re.compile(r'\d+ test files covering [\d,]+ passing tests')
106
+
107
+ # docs/CI_CD.md: git-pinned install URL and pre-commit rev pin
108
+ _CICD_GIT_URL_RE = re.compile(r'(atomadic-forge@)v[\d.]+')
109
+ _CICD_REV_RE = re.compile(r'(rev:\s*)v[\d.]+')
110
+
111
+ # docs/COMMANDS.md: "as of X.Y.Z" header anchor
112
+ _COMMANDS_VER_RE = re.compile(r'(as of )[\d.]+')
113
+
114
+ # docs/RECEIPT.md: forge_version in example JSON blocks (both occurrences)
115
+ _RECEIPT_VER_RE = re.compile(r'("forge_version":\s*")[\d.]+(")')
116
+
117
+ # docs/FORMALIZATION.md: "post-vX.Y.Z" roadmap anchors
118
+ _FORMALIZATION_POST_VER_RE = re.compile(r'post-v[\d.]+')
119
+
120
+ # docs/MCP_TOOLS.md: header count line
121
+ _MCP_TOOLS_HEADER_RE = re.compile(
122
+ r'\d+ tools dispatching \d+ registry-callable actions'
123
+ )
124
+ # docs/MCP_TOOLS.md: per-tool summary table rows
125
+ # Matches: | [`toolname`](#anchor) | NN | description |
126
+ _MCP_TOOLS_ROW_RE = re.compile(
127
+ r'(\|\s*\[`(?P<tool>[^`]+)`\]\(#[^)]+\)\s*\|\s*)(?P<count>\d+)(\s*\|)'
128
+ )
129
+
81
130
 
82
131
  # ── helpers ───────────────────────────────────────────────────────────────────
83
132
 
@@ -602,12 +651,146 @@ def detect_doc_drift(project_root: Path) -> dict[str, Any]:
602
651
  }
603
652
 
604
653
 
654
+ # ── version-anchor updater ────────────────────────────────────────────────────
655
+
656
+ def update_version_anchors(
657
+ project_root: Path,
658
+ *,
659
+ dry_run: bool = False,
660
+ ) -> dict[str, Any]:
661
+ """Rewrite version-pinned strings in docs that drift on every release.
662
+
663
+ Covers tests/README.md, docs/CI_CD.md, docs/COMMANDS.md, docs/RECEIPT.md,
664
+ docs/FORMALIZATION.md, and docs/MCP_TOOLS.md. Each pattern is keyed to
665
+ live forge_metrics.json so no version string needs manual updating.
666
+ """
667
+ metrics = _load_metrics(project_root)
668
+ if not metrics:
669
+ return {
670
+ "schema_version": SCHEMA_VERSION_DOC_AUTO_UPDATE_V1,
671
+ "available": False,
672
+ "reason": "forge_metrics.json not found or empty",
673
+ "changes": [],
674
+ "dry_run": dry_run,
675
+ }
676
+
677
+ version = metrics.get("package_version", "")
678
+ test_files = metrics.get("test_files", "?")
679
+ test_functions = metrics.get("test_functions", "?")
680
+ mcp_tools = metrics.get("mcp_tools", "?")
681
+ mcp_actions = metrics.get("mcp_actions", "?")
682
+ changes: list[str] = []
683
+
684
+ # ── tests/README.md ───────────────────────────────────────────────────────
685
+ tests_readme = project_root / "tests" / "README.md"
686
+ if tests_readme.exists():
687
+ text = tests_readme.read_text(encoding="utf-8")
688
+ new_text = _TESTS_README_RE.sub(
689
+ f"{test_files} test files covering {test_functions} passing tests",
690
+ text,
691
+ )
692
+ if new_text != text:
693
+ if not dry_run:
694
+ tests_readme.write_text(new_text, encoding="utf-8")
695
+ changes.append(
696
+ f"tests/README.md: test counts → {test_files} files / {test_functions} tests"
697
+ )
698
+
699
+ if not version:
700
+ return {
701
+ "schema_version": SCHEMA_VERSION_DOC_AUTO_UPDATE_V1,
702
+ "available": True,
703
+ "changes": changes,
704
+ "warnings": ["package_version missing — skipped version-pinned files"],
705
+ "dry_run": dry_run,
706
+ }
707
+
708
+ # ── docs/CI_CD.md ─────────────────────────────────────────────────────────
709
+ cicd_path = project_root / "docs" / "CI_CD.md"
710
+ if cicd_path.exists():
711
+ text = cicd_path.read_text(encoding="utf-8")
712
+ new_text = _CICD_GIT_URL_RE.sub(rf"\g<1>v{version}", text)
713
+ new_text = _CICD_REV_RE.sub(rf"\g<1>v{version}", new_text)
714
+ if new_text != text:
715
+ if not dry_run:
716
+ cicd_path.write_text(new_text, encoding="utf-8")
717
+ changes.append(f"docs/CI_CD.md: pinned version → v{version}")
718
+
719
+ # ── docs/COMMANDS.md ──────────────────────────────────────────────────────
720
+ commands_path = project_root / "docs" / "COMMANDS.md"
721
+ if commands_path.exists():
722
+ text = commands_path.read_text(encoding="utf-8")
723
+ new_text = _COMMANDS_VER_RE.sub(rf"\g<1>{version}", text)
724
+ if new_text != text:
725
+ if not dry_run:
726
+ commands_path.write_text(new_text, encoding="utf-8")
727
+ changes.append(f"docs/COMMANDS.md: version anchor → {version}")
728
+
729
+ # ── docs/RECEIPT.md ───────────────────────────────────────────────────────
730
+ receipt_path = project_root / "docs" / "RECEIPT.md"
731
+ if receipt_path.exists():
732
+ text = receipt_path.read_text(encoding="utf-8")
733
+ new_text = _RECEIPT_VER_RE.sub(rf'\g<1>{version}\g<2>', text)
734
+ if new_text != text:
735
+ if not dry_run:
736
+ receipt_path.write_text(new_text, encoding="utf-8")
737
+ changes.append(f"docs/RECEIPT.md: forge_version → {version}")
738
+
739
+ # ── docs/FORMALIZATION.md ─────────────────────────────────────────────────
740
+ formalization_path = project_root / "docs" / "FORMALIZATION.md"
741
+ if formalization_path.exists():
742
+ text = formalization_path.read_text(encoding="utf-8")
743
+ new_text = _FORMALIZATION_POST_VER_RE.sub(f"post-v{version}", text)
744
+ if new_text != text:
745
+ if not dry_run:
746
+ formalization_path.write_text(new_text, encoding="utf-8")
747
+ changes.append(f"docs/FORMALIZATION.md: post-version anchors → post-v{version}")
748
+
749
+ # ── docs/MCP_TOOLS.md ─────────────────────────────────────────────────────
750
+ mcp_tools_path = project_root / "docs" / "MCP_TOOLS.md"
751
+ if mcp_tools_path.exists() and mcp_tools != "?" and mcp_actions != "?":
752
+ text = mcp_tools_path.read_text(encoding="utf-8")
753
+ # Header line
754
+ new_text = _MCP_TOOLS_HEADER_RE.sub(
755
+ f"{mcp_tools} tools dispatching {mcp_actions} registry-callable actions",
756
+ text,
757
+ )
758
+ # Per-tool summary table rows
759
+ action_counts = _count_mcp_actions_per_tool(project_root)
760
+
761
+ def _replace_mcp_tools_row(match: re.Match[str]) -> str:
762
+ tool = match.group("tool")
763
+ if tool not in action_counts:
764
+ return match.group(0)
765
+ new_count = str(action_counts[tool])
766
+ if match.group("count") == new_count:
767
+ return match.group(0)
768
+ return match.group(1) + new_count + match.group(4)
769
+
770
+ new_text = _MCP_TOOLS_ROW_RE.sub(_replace_mcp_tools_row, new_text)
771
+ if new_text != text:
772
+ if not dry_run:
773
+ mcp_tools_path.write_text(new_text, encoding="utf-8")
774
+ changes.append(
775
+ f"docs/MCP_TOOLS.md: header/rows → {mcp_tools} tools / {mcp_actions} actions"
776
+ )
777
+
778
+ return {
779
+ "schema_version": SCHEMA_VERSION_DOC_AUTO_UPDATE_V1,
780
+ "available": True,
781
+ "changes": changes,
782
+ "dry_run": dry_run,
783
+ }
784
+
785
+
605
786
  # ── main entry point ──────────────────────────────────────────────────────────
606
787
 
607
788
  def run_doc_auto_update(
608
789
  project_root: Path,
609
790
  *,
610
- sections: tuple[str, ...] = ("readme", "changelog", "extended_docs"),
791
+ sections: tuple[str, ...] = (
792
+ "readme", "changelog", "extended_docs", "version_anchors"
793
+ ),
611
794
  dry_run: bool = False,
612
795
  ) -> dict[str, Any]:
613
796
  """Run all doc auto-update passes.
@@ -615,9 +798,13 @@ def run_doc_auto_update(
615
798
  Args:
616
799
  project_root: Repository root.
617
800
  sections: Which sections to update — any combination of
618
- ``"readme"``, ``"changelog"``, and ``"extended_docs"``.
619
- Defaults to all three. ``"extended_docs"`` patches
620
- IDE_INTEGRATION.md, WHITEPAPER.md, and AGENTS_GUIDE.md.
801
+ ``"readme"``, ``"changelog"``, ``"extended_docs"``, and
802
+ ``"version_anchors"``. Defaults to all four.
803
+ ``"extended_docs"`` patches IDE_INTEGRATION.md,
804
+ WHITEPAPER.md, and AGENTS_GUIDE.md.
805
+ ``"version_anchors"`` patches tests/README.md,
806
+ docs/CI_CD.md, docs/COMMANDS.md, docs/RECEIPT.md,
807
+ docs/FORMALIZATION.md, and docs/MCP_TOOLS.md.
621
808
  dry_run: If True, return what would change without writing.
622
809
 
623
810
  Returns dict with ``schema_version``, ``results`` per section,
@@ -642,6 +829,11 @@ def run_doc_auto_update(
642
829
  results["extended_docs"] = r
643
830
  total += len(r.get("changes", []))
644
831
 
832
+ if "version_anchors" in sections:
833
+ r = update_version_anchors(root, dry_run=dry_run)
834
+ results["version_anchors"] = r
835
+ total += len(r.get("changes", []))
836
+
645
837
  # Self-verify: residual drift after all writes confirms every pattern fired.
646
838
  post_drift = detect_doc_drift(root) if not dry_run else {"drift_count": 0}
647
839
 
@@ -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.76.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 | **1578 passing** across **114 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 |