atomadic-forge 0.78.0__tar.gz → 0.80.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 (474) hide show
  1. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/workflows/metrics-auto-regen.yml +1 -1
  2. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/CHANGELOG.md +16 -0
  3. {atomadic_forge-0.78.0/src/atomadic_forge.egg-info → atomadic_forge-0.80.0}/PKG-INFO +3 -3
  4. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/README.md +2 -2
  5. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/CI_CD.md +3 -3
  6. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/COMMANDS.md +1 -1
  7. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/FORMALIZATION.md +2 -2
  8. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/RECEIPT.md +2 -2
  9. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/pyproject.toml +1 -1
  10. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/doc_auto_update.py +2 -2
  11. atomadic_forge-0.80.0/src/atomadic_forge/a1_at_functions/ifwc_fuzz.py +158 -0
  12. atomadic_forge-0.80.0/src/atomadic_forge/a1_at_functions/monadic_laws.py +235 -0
  13. atomadic_forge-0.80.0/src/atomadic_forge/a3_og_features/recipe_replay.py +158 -0
  14. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a4_sy_orchestration/cli.py +17 -0
  15. atomadic_forge-0.80.0/src/atomadic_forge/commands/_monadic_laws_shared.py +46 -0
  16. atomadic_forge-0.80.0/src/atomadic_forge/commands/aiom_check.py +44 -0
  17. atomadic_forge-0.80.0/src/atomadic_forge/commands/fingerprint.py +39 -0
  18. atomadic_forge-0.80.0/src/atomadic_forge/commands/fuzz.py +79 -0
  19. atomadic_forge-0.80.0/src/atomadic_forge/commands/mcb_check.py +44 -0
  20. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/metrics.py +8 -13
  21. atomadic_forge-0.80.0/src/atomadic_forge/commands/replay.py +101 -0
  22. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0/src/atomadic_forge.egg-info}/PKG-INFO +3 -3
  23. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge.egg-info/SOURCES.txt +12 -0
  24. atomadic_forge-0.80.0/tests/test_ifwc_fuzz.py +42 -0
  25. atomadic_forge-0.80.0/tests/test_monadic_laws.py +96 -0
  26. atomadic_forge-0.80.0/tests/test_recipe_replay.py +88 -0
  27. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/FUNDING.yml +0 -0
  28. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  29. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  30. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  31. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/actions/forge-action/README.md +0 -0
  32. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/actions/forge-action/action.yml +0 -0
  33. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/dependabot.yml +0 -0
  34. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/pull_request_template.md +0 -0
  35. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/workflows/ci.yml +0 -0
  36. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/workflows/customer-refactor.yml +0 -0
  37. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/workflows/forge-self-certify.yml +0 -0
  38. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/workflows/mcp-registry-publish.yml +0 -0
  39. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/workflows/metrics-drift.yml +0 -0
  40. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/workflows/publish-on-tag.yml +0 -0
  41. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/workflows/release-readiness.yml +0 -0
  42. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/workflows/release.yml +0 -0
  43. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/workflows/surface-drift.yml +0 -0
  44. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/workflows/uptime.yml +0 -0
  45. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/ARCHITECTURE.md +0 -0
  46. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/CONTRIBUTING.md +0 -0
  47. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/LICENSE +0 -0
  48. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/MANIFEST.in +0 -0
  49. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/SECURITY.md +0 -0
  50. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/assets/Atomadic-Forge-01.png +0 -0
  51. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/01-getting-started.md +0 -0
  52. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/02-commands.md +0 -0
  53. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/03-tutorial.md +0 -0
  54. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/04-llm-loops.md +0 -0
  55. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/05-faq.md +0 -0
  56. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/AGENTS_GUIDE.md +0 -0
  57. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/AIR_GAPPED.md +0 -0
  58. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/CODEX_WALKTHROUGH.md +0 -0
  59. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/FIRST_10_MINUTES.md +0 -0
  60. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/HIVE_PRIMITIVES.md +0 -0
  61. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/HIVE_STATUS.md +0 -0
  62. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/IDE_INTEGRATION.md +0 -0
  63. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/LANDSCAPE.md +0 -0
  64. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/MARKET_POSITIONING.md +0 -0
  65. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/MCP_TOOLS.md +0 -0
  66. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/MIGRATION.md +0 -0
  67. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/MULTI_REPO.md +0 -0
  68. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/PROVIDERS.md +0 -0
  69. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/README.md +0 -0
  70. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/RELAY_PROTOCOL.md +0 -0
  71. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/RELEASE_CHECKLIST.md +0 -0
  72. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/RELEASE_MESSAGING.md +0 -0
  73. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/ROADMAP.md +0 -0
  74. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/SHOWCASE.md +0 -0
  75. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/SIDECAR.md +0 -0
  76. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/STUDIO.md +0 -0
  77. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/TOOL_FACTORY_WALKTHROUGH.md +0 -0
  78. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/V0.46.0_JUSTIFICATION_REPORT.md +0 -0
  79. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/V0.47.0_SELF_TEST_REPORT.md +0 -0
  80. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/WHY_NOW.md +0 -0
  81. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/WORKER_VS_LOCAL_MCP.md +0 -0
  82. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/WORLD_COLLISION.md +0 -0
  83. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/INDEX.md +0 -0
  84. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/absorb.md +0 -0
  85. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/audit.md +0 -0
  86. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/chat.md +0 -0
  87. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/commandsmith.md +0 -0
  88. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/config.md +0 -0
  89. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/create.md +0 -0
  90. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/demo.md +0 -0
  91. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/emergent-swarm.md +0 -0
  92. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/emergent-then-synergy.md +0 -0
  93. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/emergent.md +0 -0
  94. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/enhancement.md +0 -0
  95. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/evolve-then-iterate.md +0 -0
  96. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/evolve.md +0 -0
  97. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/feature-then-emergent.md +0 -0
  98. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/guard-install.md +0 -0
  99. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/handoff.md +0 -0
  100. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/harvest.md +0 -0
  101. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/hive.md +0 -0
  102. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/iterate.md +0 -0
  103. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/materialize.md +0 -0
  104. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/metrics.md +0 -0
  105. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/recon-swarm.md +0 -0
  106. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/relay.md +0 -0
  107. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/surface.md +0 -0
  108. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/synergy-then-emergent.md +0 -0
  109. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/synergy.md +0 -0
  110. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/welcome.md +0 -0
  111. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/wisdom.md +0 -0
  112. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
  113. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/compliance/CS-1.md +0 -0
  114. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
  115. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
  116. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/compliance/SR_11-7_MAPPING.md +0 -0
  117. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/handoffs/WORKER_AUTO_DEPLOY_2026-05-06.md +0 -0
  118. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/tutorials/01-quickstart.md +0 -0
  119. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/tutorials/02-your-first-package.md +0 -0
  120. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/tutorials/03-the-five-tier-law.md +0 -0
  121. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/tutorials/04-plug-in-llms.md +0 -0
  122. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/tutorials/05-multi-repo-absorb.md +0 -0
  123. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/tutorials/06-javascript-quickstart.md +0 -0
  124. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/setup.cfg +0 -0
  125. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/__init__.py +0 -0
  126. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/__main__.py +0 -0
  127. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
  128. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
  129. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
  130. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
  131. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
  132. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
  133. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/enhancement_proposal_constants.py +0 -0
  134. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
  135. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
  136. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
  137. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/handoff_constants.py +0 -0
  138. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/hive_constants.py +0 -0
  139. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +0 -0
  140. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/lifetime_savings_constants.py +0 -0
  141. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/materialize_types.py +0 -0
  142. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +0 -0
  143. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/nexus_constants.py +0 -0
  144. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
  145. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
  146. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/response_enrichment.py +0 -0
  147. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
  148. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +0 -0
  149. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
  150. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
  151. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
  152. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
  153. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/welcome_constants.py +0 -0
  154. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/wisdom_constants.py +0 -0
  155. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
  156. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/abstract_method_repair.py +0 -0
  157. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +0 -0
  158. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
  159. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
  160. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
  161. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/ast_scope_lock.py +0 -0
  162. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
  163. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/call_graph.py +0 -0
  164. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/capability_scout.py +0 -0
  165. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
  166. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/certify_checks.py +0 -0
  167. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
  168. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
  169. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
  170. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/code_signature.py +0 -0
  171. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
  172. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
  173. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
  174. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
  175. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
  176. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/cosine_similarity.py +0 -0
  177. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
  178. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/custom_provider_client.py +0 -0
  179. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/dead_code_check.py +0 -0
  180. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
  181. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
  182. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
  183. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
  184. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
  185. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
  186. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/enhancement_proposal_builder.py +0 -0
  187. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
  188. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
  189. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/exported_api_check.py +0 -0
  190. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
  191. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
  192. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/forge_locate.py +0 -0
  193. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/forge_metrics.py +0 -0
  194. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
  195. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/git_churn.py +0 -0
  196. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/graft_extract.py +0 -0
  197. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/handoff_builder.py +0 -0
  198. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/harvest_absorb.py +0 -0
  199. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/harvest_concept_bridge.py +0 -0
  200. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/hive_consensus_math.py +0 -0
  201. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/hive_io.py +0 -0
  202. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
  203. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
  204. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/intent_similarity.py +0 -0
  205. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
  206. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/lifetime_savings.py +0 -0
  207. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
  208. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
  209. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
  210. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
  211. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
  212. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/maintainability_index.py +0 -0
  213. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
  214. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +0 -0
  215. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
  216. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
  217. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
  218. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/polyglot_classify.py +0 -0
  219. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/polyglot_imports.py +0 -0
  220. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/polyglot_surface.py +0 -0
  221. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
  222. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
  223. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
  224. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
  225. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
  226. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
  227. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
  228. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/repo_public_surface.py +0 -0
  229. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +0 -0
  230. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/response_enricher.py +0 -0
  231. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
  232. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
  233. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
  234. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
  235. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/scaffold_polyglot.py +0 -0
  236. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
  237. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
  238. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/scout_walk.py +0 -0
  239. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
  240. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
  241. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/smell_scan.py +0 -0
  242. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/steersman_pack.py +0 -0
  243. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
  244. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/surface_gap_check.py +0 -0
  245. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
  246. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
  247. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
  248. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
  249. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/test_selector.py +0 -0
  250. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
  251. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
  252. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
  253. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +0 -0
  254. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/validation_commands.py +0 -0
  255. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/welcome_narrator.py +0 -0
  256. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/wire_check.py +0 -0
  257. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/wire_stubs_gen.py +0 -0
  258. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/wisdom_capture.py +0 -0
  259. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/wisdom_io.py +0 -0
  260. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/wisdom_promote.py +0 -0
  261. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/wisdom_recall.py +0 -0
  262. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/worktree_status.py +0 -0
  263. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
  264. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +0 -0
  265. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +0 -0
  266. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/evolve_session_store.py +0 -0
  267. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
  268. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +0 -0
  269. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/iterate_session_store.py +0 -0
  270. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
  271. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
  272. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/nexus_client.py +0 -0
  273. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
  274. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
  275. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/remote_seed_store.py +0 -0
  276. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/repo_public_surface_sync.py +0 -0
  277. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
  278. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/absorb_feature.py +0 -0
  279. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +0 -0
  280. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/cherry_hunter.py +0 -0
  281. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/cna_check.py +0 -0
  282. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
  283. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/commit_compose.py +0 -0
  284. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/create_feature.py +0 -0
  285. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/dedup_engine.py +0 -0
  286. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +0 -0
  287. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a0_qk_constants/__init__.py +0 -0
  288. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a1_at_functions/__init__.py +0 -0
  289. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
  290. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +0 -0
  291. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
  292. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
  293. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
  294. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/emergent_swarm.py +0 -0
  295. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/enhancement_proposal_feature.py +0 -0
  296. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
  297. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
  298. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/forge_evolve_session.py +0 -0
  299. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
  300. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/forge_loop_session.py +0 -0
  301. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/forge_metrics_feature.py +0 -0
  302. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/forge_pipeline.py +0 -0
  303. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
  304. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/graft_feature.py +0 -0
  305. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/guard_install.py +0 -0
  306. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/handoff_feature.py +0 -0
  307. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/hive_sync.py +0 -0
  308. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
  309. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/materialize_feature.py +0 -0
  310. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/mcp_server.py +0 -0
  311. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/nexus_bridge.py +0 -0
  312. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/relay_daemon.py +0 -0
  313. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
  314. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/surface_export.py +0 -0
  315. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
  316. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/tool_factory.py +0 -0
  317. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/verify_umbrella.py +0 -0
  318. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/welcome_feature.py +0 -0
  319. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/wisdom_feature.py +0 -0
  320. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
  321. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
  322. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
  323. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
  324. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/__init__.py +0 -0
  325. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/_registry.py +0 -0
  326. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/absorb.py +0 -0
  327. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/audit.py +0 -0
  328. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/chat.py +0 -0
  329. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/commandsmith.py +0 -0
  330. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/config_cmd.py +0 -0
  331. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/create.py +0 -0
  332. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/demo.py +0 -0
  333. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/emergent.py +0 -0
  334. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/emergent_swarm.py +0 -0
  335. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
  336. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/enhancement.py +0 -0
  337. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/evolve.py +0 -0
  338. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
  339. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
  340. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/graft.py +0 -0
  341. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/guard_install.py +0 -0
  342. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/handoff.py +0 -0
  343. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/harvest.py +0 -0
  344. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/hive.py +0 -0
  345. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/iterate.py +0 -0
  346. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/materialize.py +0 -0
  347. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/recon_swarm.py +0 -0
  348. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/relay.py +0 -0
  349. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/surface.py +0 -0
  350. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/synergy.py +0 -0
  351. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
  352. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/token_savings.py +0 -0
  353. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/welcome.py +0 -0
  354. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/wisdom.py +0 -0
  355. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
  356. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
  357. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge.egg-info/requires.txt +0 -0
  358. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge.egg-info/top_level.txt +0 -0
  359. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_aaaa_nexus_client.py +0 -0
  360. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_abstract_method_repair.py +0 -0
  361. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_agent_hire_protocol.py +0 -0
  362. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_agent_plan.py +0 -0
  363. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_agent_plan_pkg_label.py +0 -0
  364. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_agent_summary.py +0 -0
  365. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_ast_scope_lock.py +0 -0
  366. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_audit_verb.py +0 -0
  367. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_body_extractor_repairs.py +0 -0
  368. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_call_graph_summary.py +0 -0
  369. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_capability_scout.py +0 -0
  370. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_card_renderer.py +0 -0
  371. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_certify_operational_axis.py +0 -0
  372. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_chat.py +0 -0
  373. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_cherry_dedup_class_methods.py +0 -0
  374. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_cherry_pick.py +0 -0
  375. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_classify_tier.py +0 -0
  376. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_classify_tier_ast_signals.py +0 -0
  377. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_cli_smoke.py +0 -0
  378. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_cli_swarm_aliases.py +0 -0
  379. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_codex_5_complete.py +0 -0
  380. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_codex_6_enforce_polyglot.py +0 -0
  381. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_commandsmith.py +0 -0
  382. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_compiler_feedback.py +0 -0
  383. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_compliance_checker.py +0 -0
  384. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_config.py +0 -0
  385. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_copilots_copilot.py +0 -0
  386. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_cost_circuit_breaker.py +0 -0
  387. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_create_feature.py +0 -0
  388. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_cs1_renderer.py +0 -0
  389. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_custom_provider.py +0 -0
  390. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_dead_code_check.py +0 -0
  391. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_dedup_engine.py +0 -0
  392. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_demo.py +0 -0
  393. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_doc_auto_update.py +0 -0
  394. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_emergent_compose.py +0 -0
  395. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_emergent_signature_extract.py +0 -0
  396. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_emergent_synthesize_imports.py +0 -0
  397. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_enhancement_proposal.py +0 -0
  398. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_error_codes.py +0 -0
  399. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_error_hints.py +0 -0
  400. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_evolve_js.py +0 -0
  401. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_exported_api_check.py +0 -0
  402. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_finalize_scaffold.py +0 -0
  403. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_forge_action.py +0 -0
  404. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_forge_auth_a1.py +0 -0
  405. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_forge_auth_a2.py +0 -0
  406. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_forge_enforce.py +0 -0
  407. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_generation_quality.py +0 -0
  408. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_git_churn.py +0 -0
  409. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_graft_feature.py +0 -0
  410. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_handoff.py +0 -0
  411. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_harvest_concept_bridge.py +0 -0
  412. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_harvest_source_warnings.py +0 -0
  413. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_hierarchical_memory.py +0 -0
  414. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_hive_sync.py +0 -0
  415. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_ignore_and_docs.py +0 -0
  416. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_import_smoke.py +0 -0
  417. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_iterate_evolve.py +0 -0
  418. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_js_certify.py +0 -0
  419. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_js_parser.py +0 -0
  420. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_js_recon.py +0 -0
  421. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_js_wire.py +0 -0
  422. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_lineage_chain.py +0 -0
  423. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_ling_provider.py +0 -0
  424. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_local_signer.py +0 -0
  425. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_lsp_protocol.py +0 -0
  426. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_maintainability_index.py +0 -0
  427. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_manifest_diff.py +0 -0
  428. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_materialize_feature.py +0 -0
  429. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_mcp_lazy_bootstrap.py +0 -0
  430. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_mcp_protocol.py +0 -0
  431. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_nexus_bridge.py +0 -0
  432. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_ollama_client.py +0 -0
  433. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_pipeline.py +0 -0
  434. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_plan_apply.py +0 -0
  435. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_polyglot_cli_mcp.py +0 -0
  436. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_polyglot_full_pipeline.py +0 -0
  437. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_polyglot_hardening.py +0 -0
  438. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_polyglot_swift_kotlin_go.py +0 -0
  439. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_polyglot_symbol_parity.py +0 -0
  440. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_pre_audit_smoke.py +0 -0
  441. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_precommit_hooks.py +0 -0
  442. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_progress_reporter.py +0 -0
  443. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_receipt_emitter.py +0 -0
  444. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_receipt_schema.py +0 -0
  445. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_receipt_signer.py +0 -0
  446. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_remote_seed_store.py +0 -0
  447. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_repo_public_surface.py +0 -0
  448. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_response_enricher.py +0 -0
  449. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_roi_calculator.py +0 -0
  450. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_sbom_cmd_text_summary.py +0 -0
  451. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_sbom_emitter.py +0 -0
  452. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_scaffold.py +0 -0
  453. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_sidecar.py +0 -0
  454. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_sidecar_validate.py +0 -0
  455. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_smell_score_formula.py +0 -0
  456. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_stagnation.py +0 -0
  457. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_steersman_pack.py +0 -0
  458. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_stub_detector.py +0 -0
  459. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_surface_export.py +0 -0
  460. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_surface_gap_check.py +0 -0
  461. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_synergy.py +0 -0
  462. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_test_runner.py +0 -0
  463. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_tier_init_rebuild.py +0 -0
  464. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_token_savings_ledger.py +0 -0
  465. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_trust_gate_response.py +0 -0
  466. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_verify_suggested_recipe.py +0 -0
  467. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_welcome.py +0 -0
  468. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_welcome_enhancements.py +0 -0
  469. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_whoami_cmd.py +0 -0
  470. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_wire_certify.py +0 -0
  471. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_wire_stubs_gen.py +0 -0
  472. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_wire_suggest_repairs.py +0 -0
  473. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_wire_type_checking.py +0 -0
  474. {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_wisdom.py +0 -0
@@ -33,7 +33,7 @@ jobs:
33
33
  regen:
34
34
  runs-on: ubuntu-latest
35
35
  timeout-minutes: 8
36
- if: ${{ !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, 'chore(metrics): auto-regenerate') }}
36
+ if: ${{ !contains(github.event.head_commit.message || '', '[skip ci]') && !contains(github.event.head_commit.message || '', 'chore(metrics): auto-regenerate') }}
37
37
  steps:
38
38
  - uses: actions/checkout@v4
39
39
  with:
@@ -2,6 +2,22 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## v0.80.0 — 2026-05-08
6
+
7
+ - feat(forge): v0.80 Monadic Laws — MCB / AHLP / AIOM / IFWC-lite
8
+
9
+
10
+ ## v0.79.0 — 2026-05-08
11
+
12
+ - feat(forge): replay — deterministic golden-recipe execution
13
+ - fix(compat): replace datetime.UTC with timezone.utc for Python 3.10 compat
14
+ - fix(ci): null-safe head_commit.message in metrics-auto-regen if condition
15
+ - chore(metrics): sync forge_metrics.json after cli_verb_count method change
16
+ - fix(surface): regenerate surface.json with package_version 0.78.0
17
+ - fix(metrics): replace upward a4 import in _live_cli_verb_count with file scan
18
+ - chore(release): sync artifacts + doc anchors for v0.78.0
19
+
20
+
5
21
  ## v0.78.0 — 2026-05-08
6
22
 
7
23
  - feat(forge): token-savings auto-ledger across every enriched verb
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atomadic-forge
3
- Version: 0.78.0
3
+ Version: 0.80.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 | **233** (~47K LOC) |
229
- | Tests | **1592 passing** across **116 test files** |
228
+ | Source files | **242** (~48K LOC) |
229
+ | Tests | **1608 passing** across **119 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 | **233** (~47K LOC) |
197
- | Tests | **1592 passing** across **116 test files** |
196
+ | Source files | **242** (~48K LOC) |
197
+ | Tests | **1608 passing** across **119 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.77.0"
49
+ # pip install "git+https://github.com/atomadictech/atomadic-forge@v0.78.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.77.0"
100
+ - pip install "git+https://github.com/atomadictech/atomadic-forge@v0.78.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.77.0
159
+ rev: v0.78.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.77.0
3
+ All verbs available in the `forge` CLI as of 0.78.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.77.0 roadmap.
42
+ behavioural axis is on the post-v0.78.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.77.0): the equivalent for JS would be an `npm test`
134
+ item (post-v0.78.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
@@ -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.77.0",
33
+ "forge_version": "0.78.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.77.0",
111
+ "forge_version": "0.78.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.78.0"
7
+ version = "0.80.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"
@@ -58,7 +58,7 @@ from __future__ import annotations
58
58
  import json
59
59
  import re
60
60
  import subprocess
61
- from datetime import UTC, datetime
61
+ from datetime import datetime, timezone
62
62
  from pathlib import Path
63
63
  from typing import Any
64
64
 
@@ -318,7 +318,7 @@ def _build_metrics_table(metrics: dict[str, Any]) -> str:
318
318
 
319
319
  def _build_changelog_block(version: str, log_lines: list[str]) -> str:
320
320
  """Generate a CHANGELOG section for the given version."""
321
- today = datetime.now(UTC).strftime("%Y-%m-%d")
321
+ today = datetime.now(timezone.utc).strftime("%Y-%m-%d")
322
322
  items = "\n".join(f"- {line}" for line in log_lines[:20]) if log_lines else "- (see git log)"
323
323
  return (
324
324
  f"## v{version} — {today}\n\n"
@@ -0,0 +1,158 @@
1
+ """Tier a1 — IFWC-lite property-based fuzzer.
2
+
3
+ Any callable carrying an ``__invariants__`` dict is fair game:
4
+
5
+ def add(a: int, b: int) -> int:
6
+ return a + b
7
+ add.__invariants__ = {
8
+ "args": {"a": "integers", "b": "integers"},
9
+ "post": "lambda r, a, b: r == a + b",
10
+ }
11
+
12
+ ``args`` maps parameter name → hypothesis strategy name (or ``"any"``).
13
+ ``post`` is a string lambda evaluated with ``(result, **kwargs)``;
14
+ returning False (or raising) ⇒ falsifying example captured.
15
+
16
+ Pure stdlib + ``hypothesis`` (already a Forge dev dep). No I/O.
17
+ """
18
+ from __future__ import annotations
19
+
20
+ import importlib
21
+ import inspect
22
+ from collections.abc import Callable
23
+ from typing import Any
24
+
25
+ SCHEMA_VERSION_IFWC_V1 = "atomadic-forge.ifwc/v1"
26
+
27
+
28
+ _STRATEGY_MAP: dict[str, str] = {
29
+ "integers": "integers",
30
+ "floats": "floats",
31
+ "text": "text",
32
+ "booleans": "booleans",
33
+ "none": "none",
34
+ "any": "integers", # default fallback
35
+ }
36
+
37
+
38
+ def _build_strategies(args_spec: dict[str, str]) -> dict[str, Any]:
39
+ """Translate ``{"a": "integers"}`` → ``{"a": st.integers()}``."""
40
+ try:
41
+ from hypothesis import strategies as st
42
+ except ImportError as exc: # pragma: no cover - dev dep
43
+ raise RuntimeError(
44
+ "hypothesis not installed; `pip install hypothesis`"
45
+ ) from exc
46
+ out: dict[str, Any] = {}
47
+ for name, strat_name in args_spec.items():
48
+ key = _STRATEGY_MAP.get(strat_name, "integers")
49
+ out[name] = getattr(st, key)()
50
+ return out
51
+
52
+
53
+ def fuzz_callable(
54
+ fn: Callable[..., Any],
55
+ *,
56
+ max_examples: int = 100,
57
+ ) -> dict[str, Any]:
58
+ """Run hypothesis against ``fn`` using its ``__invariants__`` spec.
59
+
60
+ Returns ``{verdict, examples_run, falsifying_example|None,
61
+ error|None, function}``.
62
+ """
63
+ spec = getattr(fn, "__invariants__", None)
64
+ if not spec:
65
+ return {
66
+ "schema_version": SCHEMA_VERSION_IFWC_V1,
67
+ "function": fn.__name__,
68
+ "verdict": "SKIP",
69
+ "reason": "no __invariants__ marker",
70
+ "examples_run": 0,
71
+ }
72
+
73
+ try:
74
+ from hypothesis import given, settings
75
+ except ImportError:
76
+ return {
77
+ "schema_version": SCHEMA_VERSION_IFWC_V1,
78
+ "function": fn.__name__,
79
+ "verdict": "ERROR",
80
+ "reason": "hypothesis not installed",
81
+ "examples_run": 0,
82
+ }
83
+
84
+ args_spec = dict(spec.get("args") or {})
85
+ post = spec.get("post")
86
+ strategies = _build_strategies(args_spec)
87
+ counter = {"n": 0}
88
+ failure = {"example": None, "error": None}
89
+
90
+ @settings(max_examples=int(max_examples), deadline=None)
91
+ @given(**strategies)
92
+ def _runner(**kwargs: Any) -> None:
93
+ counter["n"] += 1
94
+ result = fn(**kwargs)
95
+ if post:
96
+ ok = False
97
+ try:
98
+ check = eval(post) if isinstance(post, str) else post # noqa: S307
99
+ ok = bool(check(result, **kwargs))
100
+ except Exception as exc: # noqa: BLE001
101
+ failure["example"] = kwargs
102
+ failure["error"] = str(exc)
103
+ raise AssertionError(
104
+ f"post-condition raised: {exc}"
105
+ ) from exc
106
+ if not ok:
107
+ failure["example"] = kwargs
108
+ raise AssertionError(
109
+ f"post-condition False on {kwargs} -> {result!r}",
110
+ )
111
+
112
+ try:
113
+ _runner()
114
+ except Exception as exc: # noqa: BLE001
115
+ return {
116
+ "schema_version": SCHEMA_VERSION_IFWC_V1,
117
+ "function": fn.__name__,
118
+ "verdict": "FAIL",
119
+ "examples_run": counter["n"],
120
+ "falsifying_example": failure["example"],
121
+ "error": str(exc),
122
+ }
123
+ return {
124
+ "schema_version": SCHEMA_VERSION_IFWC_V1,
125
+ "function": fn.__name__,
126
+ "verdict": "PASS",
127
+ "examples_run": counter["n"],
128
+ "falsifying_example": None,
129
+ }
130
+
131
+
132
+ def fuzz_module(
133
+ module_name: str,
134
+ *,
135
+ max_examples: int = 100,
136
+ ) -> dict[str, Any]:
137
+ """Import ``module_name`` and fuzz every callable carrying invariants."""
138
+ mod = importlib.import_module(module_name)
139
+ results: list[dict[str, Any]] = []
140
+ for _name, obj in inspect.getmembers(mod):
141
+ if callable(obj) and hasattr(obj, "__invariants__"):
142
+ results.append(fuzz_callable(obj, max_examples=max_examples))
143
+ pass_n = sum(1 for r in results if r["verdict"] == "PASS")
144
+ fail_n = sum(1 for r in results if r["verdict"] == "FAIL")
145
+ return {
146
+ "schema_version": SCHEMA_VERSION_IFWC_V1,
147
+ "module": module_name,
148
+ "function_count": len(results),
149
+ "pass_count": pass_n,
150
+ "fail_count": fail_n,
151
+ "verdict": "PASS" if fail_n == 0 and pass_n > 0 else (
152
+ "FAIL" if fail_n else "EMPTY"
153
+ ),
154
+ "results": results,
155
+ }
156
+
157
+
158
+ __all__ = ["SCHEMA_VERSION_IFWC_V1", "fuzz_callable", "fuzz_module"]
@@ -0,0 +1,235 @@
1
+ """Tier a1 — Monadic Laws (v0.80): MCB / AHLP / AIOM checkers.
2
+
3
+ Three pure deterministic AST scanners that surface the v7.0 blueprint
4
+ laws without breaking existing repos:
5
+
6
+ * :func:`scan_mcb` — Monadic Compute Bounding: ban ``while`` and
7
+ recursion in tier-a1 modules.
8
+ * :func:`fingerprint_a1` — AHLP-style SHA-256 of normalized AST
9
+ per a1 module. Tamper-evident receipts foundation.
10
+ * :func:`scan_aiom` — Algebraic I/O Monad enforcer: forbid network /
11
+ process / socket imports from tier-a1 (the pure layer).
12
+
13
+ All three are pure: AST-in, dict-out, no side effects.
14
+ """
15
+ from __future__ import annotations
16
+
17
+ import ast
18
+ import hashlib
19
+ from pathlib import Path
20
+ from typing import Any
21
+
22
+ SCHEMA_VERSION_MCB_V1 = "atomadic-forge.mcb/v1"
23
+ SCHEMA_VERSION_AHLP_V1 = "atomadic-forge.ahlp.fingerprint/v1"
24
+ SCHEMA_VERSION_AIOM_V1 = "atomadic-forge.aiom/v1"
25
+
26
+ # Modules forbidden in tier-a1 (the pure mathematical layer).
27
+ # Keep this list conservative — anything that talks to the OS,
28
+ # network, or a subprocess. ``pathlib``/``json`` are allowed:
29
+ # they're stdlib data shapers, not effect carriers.
30
+ _AIOM_FORBIDDEN: frozenset[str] = frozenset({
31
+ "requests", "urllib", "urllib3", "httpx", "aiohttp",
32
+ "http", "socket", "smtplib", "ftplib", "telnetlib",
33
+ "subprocess", "multiprocessing",
34
+ "os.system", "os.popen", "shutil.move", # checked via attribute walk
35
+ })
36
+
37
+ _AIOM_FORBIDDEN_PREFIX: tuple[str, ...] = (
38
+ "requests", "urllib", "urllib3", "httpx", "aiohttp",
39
+ "http.", "socket", "smtplib", "ftplib", "telnetlib",
40
+ "subprocess", "multiprocessing.",
41
+ )
42
+
43
+ A1_TIER_DIR = "a1_at_functions"
44
+
45
+
46
+ # ── MCB ─────────────────────────────────────────────────────────────
47
+
48
+
49
+ def _scan_one_for_while_recursion(path: Path) -> list[dict[str, Any]]:
50
+ """Return MCB violations in one file (empty list ⇒ clean)."""
51
+ findings: list[dict[str, Any]] = []
52
+ try:
53
+ tree = ast.parse(path.read_text(encoding="utf-8"))
54
+ except (OSError, SyntaxError):
55
+ return findings
56
+ func_names = {
57
+ n.name for n in ast.walk(tree)
58
+ if isinstance(n, ast.FunctionDef | ast.AsyncFunctionDef)
59
+ }
60
+ for node in ast.walk(tree):
61
+ if isinstance(node, ast.While):
62
+ findings.append({
63
+ "kind": "while_loop",
64
+ "line": node.lineno,
65
+ "detail": "unbounded `while` in pure-tier function",
66
+ })
67
+ elif isinstance(node, ast.Call):
68
+ # Direct recursion: `foo(...)` inside `def foo`.
69
+ f = node.func
70
+ if isinstance(f, ast.Name) and f.id in func_names:
71
+ # Walk up: are we inside a function with the same name?
72
+ # Cheap textual heuristic: only flag when name matches.
73
+ findings.append({
74
+ "kind": "self_call",
75
+ "line": node.lineno,
76
+ "detail": f"possible recursion via `{f.id}(...)`",
77
+ })
78
+ return findings
79
+
80
+
81
+ def scan_mcb(package_root: Path) -> dict[str, Any]:
82
+ """Scan ``<package_root>/a1_at_functions/`` for MCB violations.
83
+
84
+ Returns a structured report with verdict PASS / FAIL and the list
85
+ of files + findings. The report is advisory unless the caller
86
+ enforces it (e.g. ``forge wire --strict-mcb``).
87
+ """
88
+ pkg = Path(package_root)
89
+ a1_dir = pkg / A1_TIER_DIR
90
+ files: list[dict[str, Any]] = []
91
+ if a1_dir.is_dir():
92
+ for f in sorted(a1_dir.glob("*.py")):
93
+ if f.name == "__init__.py":
94
+ continue
95
+ findings = _scan_one_for_while_recursion(f)
96
+ if findings:
97
+ files.append({
98
+ "file": str(f.relative_to(pkg)),
99
+ "findings": findings,
100
+ })
101
+ total = sum(len(it["findings"]) for it in files)
102
+ return {
103
+ "schema_version": SCHEMA_VERSION_MCB_V1,
104
+ "package_root": str(pkg),
105
+ "violation_count": total,
106
+ "files": files,
107
+ "verdict": "PASS" if total == 0 else "FAIL",
108
+ }
109
+
110
+
111
+ # ── AHLP fingerprint ────────────────────────────────────────────────
112
+
113
+
114
+ def _normalized_ast_bytes(path: Path) -> bytes:
115
+ """Return a stable byte representation of the file's AST.
116
+
117
+ ``ast.dump`` with ``annotate_fields=True, include_attributes=False``
118
+ is reproducible across runs and stable to whitespace / comment
119
+ edits — which is exactly what we want for a tamper-evident
120
+ fingerprint of *logic*, not formatting.
121
+ """
122
+ try:
123
+ tree = ast.parse(path.read_text(encoding="utf-8"))
124
+ except (OSError, SyntaxError):
125
+ return b""
126
+ return ast.dump(tree, annotate_fields=True,
127
+ include_attributes=False).encode("utf-8")
128
+
129
+
130
+ def fingerprint_a1(package_root: Path) -> dict[str, Any]:
131
+ """SHA-256 every a1 module's normalized AST.
132
+
133
+ Returns ``{schema_version, package_root, count, fingerprints[]}``.
134
+ Each fingerprint entry: ``{file, sha256, ast_bytes_len}``.
135
+ """
136
+ pkg = Path(package_root)
137
+ a1_dir = pkg / A1_TIER_DIR
138
+ out: list[dict[str, Any]] = []
139
+ if a1_dir.is_dir():
140
+ for f in sorted(a1_dir.glob("*.py")):
141
+ if f.name == "__init__.py":
142
+ continue
143
+ ast_bytes = _normalized_ast_bytes(f)
144
+ if not ast_bytes:
145
+ continue
146
+ digest = hashlib.sha256(ast_bytes).hexdigest()
147
+ out.append({
148
+ "file": str(f.relative_to(pkg)),
149
+ "sha256": digest,
150
+ "ast_bytes_len": len(ast_bytes),
151
+ })
152
+ return {
153
+ "schema_version": SCHEMA_VERSION_AHLP_V1,
154
+ "package_root": str(pkg),
155
+ "count": len(out),
156
+ "fingerprints": out,
157
+ }
158
+
159
+
160
+ # ── AIOM ────────────────────────────────────────────────────────────
161
+
162
+
163
+ def _scan_one_for_io_imports(path: Path) -> list[dict[str, Any]]:
164
+ findings: list[dict[str, Any]] = []
165
+ try:
166
+ tree = ast.parse(path.read_text(encoding="utf-8"))
167
+ except (OSError, SyntaxError):
168
+ return findings
169
+ for node in ast.walk(tree):
170
+ if isinstance(node, ast.Import):
171
+ for alias in node.names:
172
+ if _is_forbidden(alias.name):
173
+ findings.append({
174
+ "kind": "import",
175
+ "module": alias.name,
176
+ "line": node.lineno,
177
+ })
178
+ elif isinstance(node, ast.ImportFrom):
179
+ mod = node.module or ""
180
+ if _is_forbidden(mod):
181
+ findings.append({
182
+ "kind": "from_import",
183
+ "module": mod,
184
+ "line": node.lineno,
185
+ })
186
+ return findings
187
+
188
+
189
+ def _is_forbidden(modname: str) -> bool:
190
+ if not modname:
191
+ return False
192
+ if modname in _AIOM_FORBIDDEN:
193
+ return True
194
+ return any(modname == p.rstrip(".") or modname.startswith(p)
195
+ for p in _AIOM_FORBIDDEN_PREFIX)
196
+
197
+
198
+ def scan_aiom(package_root: Path) -> dict[str, Any]:
199
+ """Scan ``<package_root>/a1_at_functions/`` for forbidden I/O imports.
200
+
201
+ Pure-tier modules cannot reach the network, processes, sockets, or
202
+ SMTP. The blocklist is conservative — ``pathlib``, ``json``,
203
+ ``hashlib`` etc. remain allowed because they're data shapers.
204
+ """
205
+ pkg = Path(package_root)
206
+ a1_dir = pkg / A1_TIER_DIR
207
+ files: list[dict[str, Any]] = []
208
+ if a1_dir.is_dir():
209
+ for f in sorted(a1_dir.glob("*.py")):
210
+ if f.name == "__init__.py":
211
+ continue
212
+ findings = _scan_one_for_io_imports(f)
213
+ if findings:
214
+ files.append({
215
+ "file": str(f.relative_to(pkg)),
216
+ "findings": findings,
217
+ })
218
+ total = sum(len(it["findings"]) for it in files)
219
+ return {
220
+ "schema_version": SCHEMA_VERSION_AIOM_V1,
221
+ "package_root": str(pkg),
222
+ "violation_count": total,
223
+ "files": files,
224
+ "verdict": "PASS" if total == 0 else "FAIL",
225
+ }
226
+
227
+
228
+ __all__ = [
229
+ "SCHEMA_VERSION_AHLP_V1",
230
+ "SCHEMA_VERSION_AIOM_V1",
231
+ "SCHEMA_VERSION_MCB_V1",
232
+ "fingerprint_a1",
233
+ "scan_aiom",
234
+ "scan_mcb",
235
+ ]