atomadic-forge 0.79.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.79.0 → atomadic_forge-0.80.0}/CHANGELOG.md +5 -0
  2. {atomadic_forge-0.79.0/src/atomadic_forge.egg-info → atomadic_forge-0.80.0}/PKG-INFO +3 -3
  3. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/README.md +2 -2
  4. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/pyproject.toml +1 -1
  5. atomadic_forge-0.80.0/src/atomadic_forge/a1_at_functions/ifwc_fuzz.py +158 -0
  6. atomadic_forge-0.80.0/src/atomadic_forge/a1_at_functions/monadic_laws.py +235 -0
  7. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a4_sy_orchestration/cli.py +12 -0
  8. atomadic_forge-0.80.0/src/atomadic_forge/commands/_monadic_laws_shared.py +46 -0
  9. atomadic_forge-0.80.0/src/atomadic_forge/commands/aiom_check.py +44 -0
  10. atomadic_forge-0.80.0/src/atomadic_forge/commands/fingerprint.py +39 -0
  11. atomadic_forge-0.80.0/src/atomadic_forge/commands/fuzz.py +79 -0
  12. atomadic_forge-0.80.0/src/atomadic_forge/commands/mcb_check.py +44 -0
  13. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0/src/atomadic_forge.egg-info}/PKG-INFO +3 -3
  14. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge.egg-info/SOURCES.txt +9 -0
  15. atomadic_forge-0.80.0/tests/test_ifwc_fuzz.py +42 -0
  16. atomadic_forge-0.80.0/tests/test_monadic_laws.py +96 -0
  17. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/.github/FUNDING.yml +0 -0
  18. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  19. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  20. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  21. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/.github/actions/forge-action/README.md +0 -0
  22. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/.github/actions/forge-action/action.yml +0 -0
  23. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/.github/dependabot.yml +0 -0
  24. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/.github/pull_request_template.md +0 -0
  25. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/.github/workflows/ci.yml +0 -0
  26. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/.github/workflows/customer-refactor.yml +0 -0
  27. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/.github/workflows/forge-self-certify.yml +0 -0
  28. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/.github/workflows/mcp-registry-publish.yml +0 -0
  29. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/.github/workflows/metrics-auto-regen.yml +0 -0
  30. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/.github/workflows/metrics-drift.yml +0 -0
  31. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/.github/workflows/publish-on-tag.yml +0 -0
  32. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/.github/workflows/release-readiness.yml +0 -0
  33. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/.github/workflows/release.yml +0 -0
  34. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/.github/workflows/surface-drift.yml +0 -0
  35. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/.github/workflows/uptime.yml +0 -0
  36. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/ARCHITECTURE.md +0 -0
  37. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/CONTRIBUTING.md +0 -0
  38. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/LICENSE +0 -0
  39. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/MANIFEST.in +0 -0
  40. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/SECURITY.md +0 -0
  41. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/assets/Atomadic-Forge-01.png +0 -0
  42. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/01-getting-started.md +0 -0
  43. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/02-commands.md +0 -0
  44. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/03-tutorial.md +0 -0
  45. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/04-llm-loops.md +0 -0
  46. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/05-faq.md +0 -0
  47. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/AGENTS_GUIDE.md +0 -0
  48. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/AIR_GAPPED.md +0 -0
  49. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/CI_CD.md +0 -0
  50. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/CODEX_WALKTHROUGH.md +0 -0
  51. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/COMMANDS.md +0 -0
  52. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/FIRST_10_MINUTES.md +0 -0
  53. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/FORMALIZATION.md +0 -0
  54. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/HIVE_PRIMITIVES.md +0 -0
  55. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/HIVE_STATUS.md +0 -0
  56. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/IDE_INTEGRATION.md +0 -0
  57. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/LANDSCAPE.md +0 -0
  58. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/MARKET_POSITIONING.md +0 -0
  59. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/MCP_TOOLS.md +0 -0
  60. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/MIGRATION.md +0 -0
  61. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/MULTI_REPO.md +0 -0
  62. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/PROVIDERS.md +0 -0
  63. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/README.md +0 -0
  64. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/RECEIPT.md +0 -0
  65. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/RELAY_PROTOCOL.md +0 -0
  66. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/RELEASE_CHECKLIST.md +0 -0
  67. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/RELEASE_MESSAGING.md +0 -0
  68. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/ROADMAP.md +0 -0
  69. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/SHOWCASE.md +0 -0
  70. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/SIDECAR.md +0 -0
  71. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/STUDIO.md +0 -0
  72. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/TOOL_FACTORY_WALKTHROUGH.md +0 -0
  73. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/V0.46.0_JUSTIFICATION_REPORT.md +0 -0
  74. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/V0.47.0_SELF_TEST_REPORT.md +0 -0
  75. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/WHY_NOW.md +0 -0
  76. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/WORKER_VS_LOCAL_MCP.md +0 -0
  77. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/WORLD_COLLISION.md +0 -0
  78. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/INDEX.md +0 -0
  79. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/absorb.md +0 -0
  80. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/audit.md +0 -0
  81. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/chat.md +0 -0
  82. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/commandsmith.md +0 -0
  83. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/config.md +0 -0
  84. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/create.md +0 -0
  85. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/demo.md +0 -0
  86. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/emergent-swarm.md +0 -0
  87. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/emergent-then-synergy.md +0 -0
  88. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/emergent.md +0 -0
  89. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/enhancement.md +0 -0
  90. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/evolve-then-iterate.md +0 -0
  91. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/evolve.md +0 -0
  92. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/feature-then-emergent.md +0 -0
  93. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/guard-install.md +0 -0
  94. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/handoff.md +0 -0
  95. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/harvest.md +0 -0
  96. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/hive.md +0 -0
  97. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/iterate.md +0 -0
  98. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/materialize.md +0 -0
  99. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/metrics.md +0 -0
  100. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/recon-swarm.md +0 -0
  101. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/relay.md +0 -0
  102. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/surface.md +0 -0
  103. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/synergy-then-emergent.md +0 -0
  104. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/synergy.md +0 -0
  105. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/welcome.md +0 -0
  106. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/commands/wisdom.md +0 -0
  107. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
  108. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/compliance/CS-1.md +0 -0
  109. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
  110. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
  111. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/compliance/SR_11-7_MAPPING.md +0 -0
  112. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/handoffs/WORKER_AUTO_DEPLOY_2026-05-06.md +0 -0
  113. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/tutorials/01-quickstart.md +0 -0
  114. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/tutorials/02-your-first-package.md +0 -0
  115. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/tutorials/03-the-five-tier-law.md +0 -0
  116. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/tutorials/04-plug-in-llms.md +0 -0
  117. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/tutorials/05-multi-repo-absorb.md +0 -0
  118. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/docs/tutorials/06-javascript-quickstart.md +0 -0
  119. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/setup.cfg +0 -0
  120. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/__init__.py +0 -0
  121. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/__main__.py +0 -0
  122. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
  123. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
  124. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
  125. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
  126. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
  127. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
  128. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/enhancement_proposal_constants.py +0 -0
  129. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
  130. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
  131. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
  132. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/handoff_constants.py +0 -0
  133. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/hive_constants.py +0 -0
  134. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +0 -0
  135. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/lifetime_savings_constants.py +0 -0
  136. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/materialize_types.py +0 -0
  137. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +0 -0
  138. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/nexus_constants.py +0 -0
  139. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
  140. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
  141. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/response_enrichment.py +0 -0
  142. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
  143. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +0 -0
  144. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
  145. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
  146. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
  147. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
  148. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/welcome_constants.py +0 -0
  149. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/wisdom_constants.py +0 -0
  150. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
  151. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/abstract_method_repair.py +0 -0
  152. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +0 -0
  153. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
  154. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
  155. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
  156. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/ast_scope_lock.py +0 -0
  157. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
  158. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/call_graph.py +0 -0
  159. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/capability_scout.py +0 -0
  160. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
  161. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/certify_checks.py +0 -0
  162. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
  163. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
  164. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
  165. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/code_signature.py +0 -0
  166. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
  167. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
  168. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
  169. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
  170. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
  171. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/cosine_similarity.py +0 -0
  172. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
  173. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/custom_provider_client.py +0 -0
  174. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/dead_code_check.py +0 -0
  175. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/doc_auto_update.py +0 -0
  176. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
  177. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
  178. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
  179. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
  180. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
  181. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
  182. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/enhancement_proposal_builder.py +0 -0
  183. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
  184. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
  185. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/exported_api_check.py +0 -0
  186. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
  187. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
  188. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/forge_locate.py +0 -0
  189. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/forge_metrics.py +0 -0
  190. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
  191. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/git_churn.py +0 -0
  192. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/graft_extract.py +0 -0
  193. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/handoff_builder.py +0 -0
  194. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/harvest_absorb.py +0 -0
  195. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/harvest_concept_bridge.py +0 -0
  196. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/hive_consensus_math.py +0 -0
  197. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/hive_io.py +0 -0
  198. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
  199. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
  200. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/intent_similarity.py +0 -0
  201. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
  202. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/lifetime_savings.py +0 -0
  203. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
  204. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
  205. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
  206. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
  207. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
  208. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/maintainability_index.py +0 -0
  209. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
  210. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +0 -0
  211. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
  212. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
  213. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
  214. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/polyglot_classify.py +0 -0
  215. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/polyglot_imports.py +0 -0
  216. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/polyglot_surface.py +0 -0
  217. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
  218. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
  219. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
  220. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
  221. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
  222. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
  223. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
  224. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/repo_public_surface.py +0 -0
  225. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +0 -0
  226. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/response_enricher.py +0 -0
  227. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
  228. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
  229. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
  230. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
  231. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/scaffold_polyglot.py +0 -0
  232. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
  233. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
  234. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/scout_walk.py +0 -0
  235. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
  236. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
  237. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/smell_scan.py +0 -0
  238. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/steersman_pack.py +0 -0
  239. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
  240. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/surface_gap_check.py +0 -0
  241. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
  242. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
  243. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
  244. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
  245. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/test_selector.py +0 -0
  246. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
  247. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
  248. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
  249. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +0 -0
  250. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/validation_commands.py +0 -0
  251. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/welcome_narrator.py +0 -0
  252. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/wire_check.py +0 -0
  253. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/wire_stubs_gen.py +0 -0
  254. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/wisdom_capture.py +0 -0
  255. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/wisdom_io.py +0 -0
  256. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/wisdom_promote.py +0 -0
  257. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/wisdom_recall.py +0 -0
  258. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/worktree_status.py +0 -0
  259. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
  260. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +0 -0
  261. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +0 -0
  262. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/evolve_session_store.py +0 -0
  263. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
  264. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +0 -0
  265. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/iterate_session_store.py +0 -0
  266. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
  267. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
  268. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/nexus_client.py +0 -0
  269. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
  270. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
  271. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/remote_seed_store.py +0 -0
  272. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/repo_public_surface_sync.py +0 -0
  273. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
  274. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/absorb_feature.py +0 -0
  275. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +0 -0
  276. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/cherry_hunter.py +0 -0
  277. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/cna_check.py +0 -0
  278. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
  279. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/commit_compose.py +0 -0
  280. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/create_feature.py +0 -0
  281. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/dedup_engine.py +0 -0
  282. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +0 -0
  283. {atomadic_forge-0.79.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
  284. {atomadic_forge-0.79.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
  285. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
  286. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +0 -0
  287. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
  288. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
  289. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
  290. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/emergent_swarm.py +0 -0
  291. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/enhancement_proposal_feature.py +0 -0
  292. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
  293. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
  294. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/forge_evolve_session.py +0 -0
  295. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
  296. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/forge_loop_session.py +0 -0
  297. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/forge_metrics_feature.py +0 -0
  298. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/forge_pipeline.py +0 -0
  299. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
  300. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/graft_feature.py +0 -0
  301. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/guard_install.py +0 -0
  302. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/handoff_feature.py +0 -0
  303. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/hive_sync.py +0 -0
  304. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
  305. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/materialize_feature.py +0 -0
  306. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/mcp_server.py +0 -0
  307. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/nexus_bridge.py +0 -0
  308. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/recipe_replay.py +0 -0
  309. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/relay_daemon.py +0 -0
  310. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
  311. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/surface_export.py +0 -0
  312. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
  313. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/tool_factory.py +0 -0
  314. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/verify_umbrella.py +0 -0
  315. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/welcome_feature.py +0 -0
  316. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/wisdom_feature.py +0 -0
  317. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
  318. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
  319. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
  320. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
  321. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/__init__.py +0 -0
  322. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/_registry.py +0 -0
  323. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/absorb.py +0 -0
  324. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/audit.py +0 -0
  325. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/chat.py +0 -0
  326. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/commandsmith.py +0 -0
  327. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/config_cmd.py +0 -0
  328. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/create.py +0 -0
  329. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/demo.py +0 -0
  330. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/emergent.py +0 -0
  331. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/emergent_swarm.py +0 -0
  332. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
  333. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/enhancement.py +0 -0
  334. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/evolve.py +0 -0
  335. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
  336. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
  337. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/graft.py +0 -0
  338. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/guard_install.py +0 -0
  339. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/handoff.py +0 -0
  340. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/harvest.py +0 -0
  341. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/hive.py +0 -0
  342. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/iterate.py +0 -0
  343. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/materialize.py +0 -0
  344. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/metrics.py +0 -0
  345. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/recon_swarm.py +0 -0
  346. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/relay.py +0 -0
  347. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/replay.py +0 -0
  348. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/surface.py +0 -0
  349. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/synergy.py +0 -0
  350. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
  351. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/token_savings.py +0 -0
  352. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/welcome.py +0 -0
  353. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/wisdom.py +0 -0
  354. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
  355. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
  356. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge.egg-info/requires.txt +0 -0
  357. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/src/atomadic_forge.egg-info/top_level.txt +0 -0
  358. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_aaaa_nexus_client.py +0 -0
  359. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_abstract_method_repair.py +0 -0
  360. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_agent_hire_protocol.py +0 -0
  361. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_agent_plan.py +0 -0
  362. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_agent_plan_pkg_label.py +0 -0
  363. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_agent_summary.py +0 -0
  364. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_ast_scope_lock.py +0 -0
  365. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_audit_verb.py +0 -0
  366. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_body_extractor_repairs.py +0 -0
  367. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_call_graph_summary.py +0 -0
  368. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_capability_scout.py +0 -0
  369. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_card_renderer.py +0 -0
  370. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_certify_operational_axis.py +0 -0
  371. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_chat.py +0 -0
  372. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_cherry_dedup_class_methods.py +0 -0
  373. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_cherry_pick.py +0 -0
  374. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_classify_tier.py +0 -0
  375. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_classify_tier_ast_signals.py +0 -0
  376. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_cli_smoke.py +0 -0
  377. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_cli_swarm_aliases.py +0 -0
  378. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_codex_5_complete.py +0 -0
  379. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_codex_6_enforce_polyglot.py +0 -0
  380. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_commandsmith.py +0 -0
  381. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_compiler_feedback.py +0 -0
  382. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_compliance_checker.py +0 -0
  383. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_config.py +0 -0
  384. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_copilots_copilot.py +0 -0
  385. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_cost_circuit_breaker.py +0 -0
  386. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_create_feature.py +0 -0
  387. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_cs1_renderer.py +0 -0
  388. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_custom_provider.py +0 -0
  389. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_dead_code_check.py +0 -0
  390. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_dedup_engine.py +0 -0
  391. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_demo.py +0 -0
  392. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_doc_auto_update.py +0 -0
  393. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_emergent_compose.py +0 -0
  394. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_emergent_signature_extract.py +0 -0
  395. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_emergent_synthesize_imports.py +0 -0
  396. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_enhancement_proposal.py +0 -0
  397. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_error_codes.py +0 -0
  398. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_error_hints.py +0 -0
  399. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_evolve_js.py +0 -0
  400. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_exported_api_check.py +0 -0
  401. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_finalize_scaffold.py +0 -0
  402. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_forge_action.py +0 -0
  403. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_forge_auth_a1.py +0 -0
  404. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_forge_auth_a2.py +0 -0
  405. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_forge_enforce.py +0 -0
  406. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_generation_quality.py +0 -0
  407. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_git_churn.py +0 -0
  408. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_graft_feature.py +0 -0
  409. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_handoff.py +0 -0
  410. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_harvest_concept_bridge.py +0 -0
  411. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_harvest_source_warnings.py +0 -0
  412. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_hierarchical_memory.py +0 -0
  413. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_hive_sync.py +0 -0
  414. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_ignore_and_docs.py +0 -0
  415. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_import_smoke.py +0 -0
  416. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_iterate_evolve.py +0 -0
  417. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_js_certify.py +0 -0
  418. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_js_parser.py +0 -0
  419. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_js_recon.py +0 -0
  420. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_js_wire.py +0 -0
  421. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_lineage_chain.py +0 -0
  422. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_ling_provider.py +0 -0
  423. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_local_signer.py +0 -0
  424. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_lsp_protocol.py +0 -0
  425. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_maintainability_index.py +0 -0
  426. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_manifest_diff.py +0 -0
  427. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_materialize_feature.py +0 -0
  428. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_mcp_lazy_bootstrap.py +0 -0
  429. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_mcp_protocol.py +0 -0
  430. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_nexus_bridge.py +0 -0
  431. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_ollama_client.py +0 -0
  432. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_pipeline.py +0 -0
  433. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_plan_apply.py +0 -0
  434. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_polyglot_cli_mcp.py +0 -0
  435. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_polyglot_full_pipeline.py +0 -0
  436. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_polyglot_hardening.py +0 -0
  437. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_polyglot_swift_kotlin_go.py +0 -0
  438. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_polyglot_symbol_parity.py +0 -0
  439. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_pre_audit_smoke.py +0 -0
  440. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_precommit_hooks.py +0 -0
  441. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_progress_reporter.py +0 -0
  442. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_receipt_emitter.py +0 -0
  443. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_receipt_schema.py +0 -0
  444. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_receipt_signer.py +0 -0
  445. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_recipe_replay.py +0 -0
  446. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_remote_seed_store.py +0 -0
  447. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_repo_public_surface.py +0 -0
  448. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_response_enricher.py +0 -0
  449. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_roi_calculator.py +0 -0
  450. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_sbom_cmd_text_summary.py +0 -0
  451. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_sbom_emitter.py +0 -0
  452. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_scaffold.py +0 -0
  453. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_sidecar.py +0 -0
  454. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_sidecar_validate.py +0 -0
  455. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_smell_score_formula.py +0 -0
  456. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_stagnation.py +0 -0
  457. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_steersman_pack.py +0 -0
  458. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_stub_detector.py +0 -0
  459. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_surface_export.py +0 -0
  460. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_surface_gap_check.py +0 -0
  461. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_synergy.py +0 -0
  462. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_test_runner.py +0 -0
  463. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_tier_init_rebuild.py +0 -0
  464. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_token_savings_ledger.py +0 -0
  465. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_trust_gate_response.py +0 -0
  466. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_verify_suggested_recipe.py +0 -0
  467. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_welcome.py +0 -0
  468. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_welcome_enhancements.py +0 -0
  469. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_whoami_cmd.py +0 -0
  470. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_wire_certify.py +0 -0
  471. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_wire_stubs_gen.py +0 -0
  472. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_wire_suggest_repairs.py +0 -0
  473. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_wire_type_checking.py +0 -0
  474. {atomadic_forge-0.79.0 → atomadic_forge-0.80.0}/tests/test_wisdom.py +0 -0
@@ -2,6 +2,11 @@
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
+
5
10
  ## v0.79.0 — 2026-05-08
6
11
 
7
12
  - feat(forge): replay — deterministic golden-recipe execution
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atomadic-forge
3
- Version: 0.79.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 | **235** (~47K LOC) |
229
- | Tests | **1597 passing** across **117 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 | **235** (~47K LOC) |
197
- | Tests | **1597 passing** across **117 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 |
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "atomadic-forge"
7
- version = "0.79.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"
@@ -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
+ ]
@@ -2744,6 +2744,18 @@ def _register_specialty_apps() -> None:
2744
2744
  # otherwise spend planning + dispatching each command.
2745
2745
  ("atomadic_forge.commands.replay", "replay",
2746
2746
  "Replay a golden recipe's validation_gate deterministically."),
2747
+ # v0.80.0 — Monadic Laws (additive, advisory by default).
2748
+ # Four read-only AST scanners that surface the v7.0 blueprint
2749
+ # laws without breaking existing repos. Promote to default
2750
+ # enforcement only after audit.
2751
+ ("atomadic_forge.commands.mcb_check", "mcb-check",
2752
+ "Surface MCB violations: unbounded `while`/recursion in a1."),
2753
+ ("atomadic_forge.commands.aiom_check", "aiom-check",
2754
+ "Surface AIOM violations: forbidden I/O imports in a1."),
2755
+ ("atomadic_forge.commands.fingerprint", "fingerprint",
2756
+ "Emit AHLP SHA-256 of every a1 module's normalized AST."),
2757
+ ("atomadic_forge.commands.fuzz", "fuzz",
2758
+ "IFWC-lite fuzzer: hypothesis cases on a1 __invariants__."),
2747
2759
  ("atomadic_forge.commands.emergent_swarm", "emergent-swarm",
2748
2760
  "Round-5: cross-repo emergent composition discovery."),
2749
2761
  ("atomadic_forge.commands.emergent_swarm", "emergent_swarm",
@@ -0,0 +1,46 @@
1
+ """Shared print/ledger helper for v0.80 monadic-law CLI verbs."""
2
+ from __future__ import annotations
3
+
4
+ import json
5
+ from pathlib import Path
6
+
7
+ import typer
8
+
9
+ from atomadic_forge.a1_at_functions.lifetime_savings import append_savings
10
+
11
+ TOKENS_SAVED_PER_A1_FILE = 40
12
+
13
+
14
+ def emit_report(report: dict, *, json_out: bool, header: str,
15
+ project: Path, tool: str) -> None:
16
+ """Print a human or JSON report and log token savings to the ledger."""
17
+ file_count = (len(report.get("fingerprints") or [])
18
+ if "fingerprints" in report
19
+ else len(report.get("files") or []))
20
+ saved = file_count * TOKENS_SAVED_PER_A1_FILE
21
+ if saved > 0:
22
+ append_savings(project_root=project, tool=tool, tokens_saved=saved)
23
+ report["tokens_saved_estimate"] = saved
24
+ if json_out:
25
+ typer.echo(json.dumps(report, indent=2, default=str))
26
+ return
27
+ typer.echo("")
28
+ typer.echo(header)
29
+ typer.echo("-" * 60)
30
+ if "verdict" in report:
31
+ typer.echo(f" verdict: {report['verdict']}")
32
+ typer.echo(f" violations: {report.get('violation_count', 0)}")
33
+ for f in report.get("files", [])[:20]:
34
+ typer.echo(f" • {f['file']}:")
35
+ for v in f["findings"][:5]:
36
+ line = v.get("line", "?")
37
+ detail = v.get("detail") or v.get("module") or v.get("kind")
38
+ typer.echo(f" L{line} {detail}")
39
+ else:
40
+ typer.echo(f" count: {report['count']}")
41
+ for fp in report["fingerprints"][:10]:
42
+ typer.echo(f" {fp['sha256'][:16]}… {fp['file']}")
43
+ if report["count"] > 10:
44
+ typer.echo(f" … and {report['count'] - 10} more")
45
+ if "tokens_saved_estimate" in report:
46
+ typer.echo(f" tokens saved: ~{report['tokens_saved_estimate']:,}")
@@ -0,0 +1,44 @@
1
+ """Tier a4 — `forge aiom-check` CLI: surface AIOM violations in tier-a1.
2
+
3
+ Advisory by default; pass ``--fail-on-violations`` to enforce.
4
+ """
5
+ from __future__ import annotations
6
+
7
+ from pathlib import Path
8
+ from typing import Annotated
9
+
10
+ import typer
11
+
12
+ from atomadic_forge.a1_at_functions.monadic_laws import scan_aiom
13
+ from atomadic_forge.commands._monadic_laws_shared import emit_report
14
+
15
+ COMMAND_NAME = "aiom-check"
16
+ COMMAND_HELP = (
17
+ "Surface AIOM (Algebraic I/O Monad) violations: forbidden network / "
18
+ "subprocess / socket imports in tier-a1 pure functions."
19
+ )
20
+
21
+ app = typer.Typer(no_args_is_help=False, help=COMMAND_HELP)
22
+
23
+
24
+ @app.callback(invoke_without_command=True)
25
+ def run(
26
+ project: Annotated[Path, typer.Option(
27
+ "--project", "-p",
28
+ exists=True, file_okay=False, dir_okay=True,
29
+ resolve_path=True)] = Path("."),
30
+ package: Annotated[str, typer.Option(
31
+ "--package",
32
+ help="Importable package under src/.")] = "atomadic_forge",
33
+ fail_on_violations: Annotated[bool, typer.Option(
34
+ "--fail-on-violations",
35
+ help="Exit non-zero when violations exist.")] = False,
36
+ json_out: Annotated[bool, typer.Option("--json")] = False,
37
+ ) -> None:
38
+ """Scan tier-a1 for forbidden I/O imports."""
39
+ pkg_root = project / "src" / package
40
+ report = scan_aiom(pkg_root)
41
+ emit_report(report, json_out=json_out, header=f"AIOM — {package}",
42
+ project=project, tool="aiom-check")
43
+ if fail_on_violations and report["verdict"] != "PASS":
44
+ raise typer.Exit(1)
@@ -0,0 +1,39 @@
1
+ """Tier a4 — `forge fingerprint` CLI: AHLP SHA-256 of every a1 module's
2
+ normalized AST. Tamper-evident receipts foundation.
3
+ """
4
+ from __future__ import annotations
5
+
6
+ from pathlib import Path
7
+ from typing import Annotated
8
+
9
+ import typer
10
+
11
+ from atomadic_forge.a1_at_functions.monadic_laws import fingerprint_a1
12
+ from atomadic_forge.commands._monadic_laws_shared import emit_report
13
+
14
+ COMMAND_NAME = "fingerprint"
15
+ COMMAND_HELP = (
16
+ "Emit AHLP SHA-256 fingerprints per a1 module's normalized AST. "
17
+ "Stable across whitespace/comments; sensitive to logic changes."
18
+ )
19
+
20
+ app = typer.Typer(no_args_is_help=False, help=COMMAND_HELP)
21
+
22
+
23
+ @app.callback(invoke_without_command=True)
24
+ def run(
25
+ project: Annotated[Path, typer.Option(
26
+ "--project", "-p",
27
+ exists=True, file_okay=False, dir_okay=True,
28
+ resolve_path=True)] = Path("."),
29
+ package: Annotated[str, typer.Option(
30
+ "--package",
31
+ help="Importable package under src/.")] = "atomadic_forge",
32
+ json_out: Annotated[bool, typer.Option("--json")] = False,
33
+ ) -> None:
34
+ """Print SHA-256 fingerprints of every a1 module's normalized AST."""
35
+ pkg_root = project / "src" / package
36
+ report = fingerprint_a1(pkg_root)
37
+ emit_report(report, json_out=json_out,
38
+ header=f"AHLP fingerprint — {package}",
39
+ project=project, tool="fingerprint")
@@ -0,0 +1,79 @@
1
+ """Tier a4 — `forge fuzz` CLI: IFWC-lite property-based fuzzer.
2
+
3
+ Targets any tier-a1 callable carrying ``__invariants__`` metadata.
4
+ Each fuzz pass logs ``examples_run × ~5`` tokens to the lifetime
5
+ ledger as ``fuzz/<module>`` (these are LLM round-trips a manual
6
+ property-test campaign would have spent).
7
+ """
8
+ from __future__ import annotations
9
+
10
+ import json
11
+ from pathlib import Path
12
+ from typing import Annotated
13
+
14
+ import typer
15
+
16
+ from atomadic_forge.a1_at_functions.ifwc_fuzz import fuzz_module
17
+ from atomadic_forge.a1_at_functions.lifetime_savings import append_savings
18
+
19
+ COMMAND_NAME = "fuzz"
20
+ COMMAND_HELP = (
21
+ "Fuzz tier-a1 callables that carry an `__invariants__` marker. "
22
+ "Pure-stdlib + hypothesis. Opt-in per function."
23
+ )
24
+
25
+ app = typer.Typer(no_args_is_help=False, help=COMMAND_HELP)
26
+
27
+
28
+ @app.callback(invoke_without_command=True)
29
+ def run(
30
+ module: Annotated[str, typer.Argument(
31
+ help="Importable module to fuzz, e.g. atomadic_forge.a1_at_functions.foo")],
32
+ project: Annotated[Path, typer.Option(
33
+ "--project", "-p",
34
+ exists=True, file_okay=False, dir_okay=True,
35
+ resolve_path=True)] = Path("."),
36
+ max_examples: Annotated[int, typer.Option(
37
+ "--max-examples", "-n",
38
+ help="Hypothesis examples per function.")] = 100,
39
+ json_out: Annotated[bool, typer.Option("--json")] = False,
40
+ ) -> None:
41
+ """Fuzz every callable in ``module`` that exposes ``__invariants__``."""
42
+ try:
43
+ report = fuzz_module(module, max_examples=max_examples)
44
+ except (ImportError, ModuleNotFoundError) as exc:
45
+ typer.secho(f"forge fuzz: cannot import {module}: {exc}",
46
+ fg="red", err=True)
47
+ raise typer.Exit(2) from exc
48
+
49
+ # Each example survived ≈ 5 tokens of LLM property-reasoning saved.
50
+ examples_total = sum(int(r.get("examples_run", 0))
51
+ for r in report.get("results", []))
52
+ saved = examples_total * 5
53
+ if saved > 0:
54
+ append_savings(project_root=project, tool=f"fuzz/{module}",
55
+ tokens_saved=saved)
56
+ report["tokens_saved_estimate"] = saved
57
+
58
+ if json_out:
59
+ typer.echo(json.dumps(report, indent=2, default=str))
60
+ if report["verdict"] == "FAIL":
61
+ raise typer.Exit(1)
62
+ return
63
+
64
+ typer.echo("")
65
+ typer.echo(f"IFWC fuzz — {module}")
66
+ typer.echo("-" * 60)
67
+ typer.echo(f" verdict: {report['verdict']}")
68
+ typer.echo(f" functions: {report['function_count']} "
69
+ f"(pass {report['pass_count']} / fail {report['fail_count']})")
70
+ for r in report.get("results", []):
71
+ line = f" • {r['function']} [{r['verdict']}] ({r.get('examples_run', 0)} cases)"
72
+ typer.echo(line)
73
+ if r["verdict"] == "FAIL" and r.get("falsifying_example") is not None:
74
+ typer.secho(f" falsifying: {r['falsifying_example']}",
75
+ fg="red")
76
+ if "tokens_saved_estimate" in report:
77
+ typer.echo(f" tokens saved: ~{report['tokens_saved_estimate']:,}")
78
+ if report["verdict"] == "FAIL":
79
+ raise typer.Exit(1)