atomadic-forge 0.19.0__tar.gz → 0.50.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 (402) hide show
  1. atomadic_forge-0.50.0/.github/workflows/metrics-auto-regen.yml +96 -0
  2. atomadic_forge-0.50.0/.github/workflows/metrics-drift.yml +61 -0
  3. atomadic_forge-0.50.0/.github/workflows/publish-on-tag.yml +104 -0
  4. atomadic_forge-0.50.0/.github/workflows/uptime.yml +72 -0
  5. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/CHANGELOG.md +288 -0
  6. {atomadic_forge-0.19.0/src/atomadic_forge.egg-info → atomadic_forge-0.50.0}/PKG-INFO +39 -12
  7. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/README.md +38 -11
  8. atomadic_forge-0.50.0/docs/V0.46.0_JUSTIFICATION_REPORT.md +148 -0
  9. atomadic_forge-0.50.0/docs/V0.47.0_SELF_TEST_REPORT.md +167 -0
  10. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/pyproject.toml +1 -1
  11. atomadic_forge-0.50.0/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +114 -0
  12. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +18 -0
  13. atomadic_forge-0.50.0/src/atomadic_forge/a1_at_functions/forge_metrics.py +257 -0
  14. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +1394 -1793
  15. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/commit_compose.py +2 -0
  16. atomadic_forge-0.50.0/src/atomadic_forge/a3_og_features/forge_metrics_feature.py +192 -0
  17. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/mcp_server.py +94 -10
  18. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/surface_export.py +89 -9
  19. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a4_sy_orchestration/cli.py +33 -25
  20. atomadic_forge-0.50.0/src/atomadic_forge/commands/metrics.py +126 -0
  21. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0/src/atomadic_forge.egg-info}/PKG-INFO +39 -12
  22. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge.egg-info/SOURCES.txt +9 -0
  23. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_agent_summary.py +6 -6
  24. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_codex_5_complete.py +19 -15
  25. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_copilots_copilot.py +11 -8
  26. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_enhancement_proposal.py +5 -5
  27. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_handoff.py +5 -5
  28. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_mcp_protocol.py +175 -181
  29. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_plan_apply.py +9 -6
  30. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_trust_gate_response.py +12 -8
  31. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_welcome.py +2 -2
  32. atomadic_forge-0.19.0/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +0 -146
  33. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/.github/FUNDING.yml +0 -0
  34. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  35. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  36. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  37. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/.github/actions/forge-action/README.md +0 -0
  38. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/.github/actions/forge-action/action.yml +0 -0
  39. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/.github/dependabot.yml +0 -0
  40. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/.github/pull_request_template.md +0 -0
  41. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/.github/workflows/ci.yml +0 -0
  42. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/.github/workflows/customer-refactor.yml +0 -0
  43. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/.github/workflows/forge-self-certify.yml +0 -0
  44. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/.github/workflows/release.yml +0 -0
  45. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/.github/workflows/surface-drift.yml +0 -0
  46. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/ARCHITECTURE.md +0 -0
  47. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/CONTRIBUTING.md +0 -0
  48. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/LICENSE +0 -0
  49. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/MANIFEST.in +0 -0
  50. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/SECURITY.md +0 -0
  51. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/assets/Atomadic-Forge-01.png +0 -0
  52. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/01-getting-started.md +0 -0
  53. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/02-commands.md +0 -0
  54. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/03-tutorial.md +0 -0
  55. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/04-llm-loops.md +0 -0
  56. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/05-faq.md +0 -0
  57. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/AGENTS_GUIDE.md +0 -0
  58. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/AIR_GAPPED.md +0 -0
  59. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/CI_CD.md +0 -0
  60. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/CODEX_WALKTHROUGH.md +0 -0
  61. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/COMMANDS.md +0 -0
  62. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/FIRST_10_MINUTES.md +0 -0
  63. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/FORMALIZATION.md +0 -0
  64. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/HIVE_PRIMITIVES.md +0 -0
  65. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/HIVE_STATUS.md +0 -0
  66. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/IDE_INTEGRATION.md +0 -0
  67. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/LANDSCAPE.md +0 -0
  68. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/MARKET_POSITIONING.md +0 -0
  69. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/MIGRATION.md +0 -0
  70. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/MULTI_REPO.md +0 -0
  71. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/PROVIDERS.md +0 -0
  72. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/README.md +0 -0
  73. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/RECEIPT.md +0 -0
  74. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/RELAY_PROTOCOL.md +0 -0
  75. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/RELEASE_CHECKLIST.md +0 -0
  76. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/RELEASE_MESSAGING.md +0 -0
  77. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/ROADMAP.md +0 -0
  78. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/SHOWCASE.md +0 -0
  79. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/SIDECAR.md +0 -0
  80. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/STUDIO.md +0 -0
  81. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/TOOL_FACTORY_WALKTHROUGH.md +0 -0
  82. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/WHY_NOW.md +0 -0
  83. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/WORKER_VS_LOCAL_MCP.md +0 -0
  84. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/WORLD_COLLISION.md +0 -0
  85. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/commands/INDEX.md +0 -0
  86. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/commands/chat.md +0 -0
  87. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/commands/commandsmith.md +0 -0
  88. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/commands/config.md +0 -0
  89. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/commands/demo.md +0 -0
  90. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/commands/emergent-then-synergy.md +0 -0
  91. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/commands/emergent.md +0 -0
  92. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/commands/evolve-then-iterate.md +0 -0
  93. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/commands/evolve.md +0 -0
  94. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/commands/feature-then-emergent.md +0 -0
  95. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/commands/iterate.md +0 -0
  96. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/commands/synergy-then-emergent.md +0 -0
  97. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/commands/synergy.md +0 -0
  98. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
  99. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/compliance/CS-1.md +0 -0
  100. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
  101. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
  102. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/compliance/SR_11-7_MAPPING.md +0 -0
  103. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/handoffs/WORKER_AUTO_DEPLOY_2026-05-06.md +0 -0
  104. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/tutorials/01-quickstart.md +0 -0
  105. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/tutorials/02-your-first-package.md +0 -0
  106. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/tutorials/03-the-five-tier-law.md +0 -0
  107. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/tutorials/04-plug-in-llms.md +0 -0
  108. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/tutorials/05-multi-repo-absorb.md +0 -0
  109. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/tutorials/06-javascript-quickstart.md +0 -0
  110. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/setup.cfg +0 -0
  111. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/__init__.py +0 -0
  112. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/__main__.py +0 -0
  113. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
  114. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
  115. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
  116. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
  117. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
  118. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
  119. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/enhancement_proposal_constants.py +0 -0
  120. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
  121. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
  122. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
  123. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/handoff_constants.py +0 -0
  124. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/hive_constants.py +0 -0
  125. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +0 -0
  126. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/lifetime_savings_constants.py +0 -0
  127. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/materialize_types.py +0 -0
  128. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +0 -0
  129. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/nexus_constants.py +0 -0
  130. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
  131. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
  132. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/response_enrichment.py +0 -0
  133. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
  134. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
  135. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
  136. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
  137. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
  138. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/welcome_constants.py +0 -0
  139. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/wisdom_constants.py +0 -0
  140. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
  141. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
  142. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
  143. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
  144. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
  145. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/call_graph.py +0 -0
  146. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
  147. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/certify_checks.py +0 -0
  148. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
  149. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
  150. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
  151. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/code_signature.py +0 -0
  152. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
  153. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
  154. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
  155. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
  156. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
  157. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
  158. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/custom_provider_client.py +0 -0
  159. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
  160. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
  161. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
  162. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
  163. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
  164. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
  165. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/enhancement_proposal_builder.py +0 -0
  166. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
  167. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
  168. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/exported_api_check.py +0 -0
  169. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
  170. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
  171. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/forge_locate.py +0 -0
  172. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
  173. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/handoff_builder.py +0 -0
  174. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/hive_consensus_math.py +0 -0
  175. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/hive_io.py +0 -0
  176. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
  177. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
  178. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/intent_similarity.py +0 -0
  179. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
  180. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/lifetime_savings.py +0 -0
  181. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
  182. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
  183. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
  184. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
  185. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
  186. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
  187. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
  188. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
  189. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
  190. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/polyglot_classify.py +0 -0
  191. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/polyglot_imports.py +0 -0
  192. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/polyglot_surface.py +0 -0
  193. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
  194. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
  195. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
  196. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
  197. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
  198. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
  199. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
  200. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +0 -0
  201. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/response_enricher.py +0 -0
  202. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
  203. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
  204. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
  205. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
  206. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/scaffold_polyglot.py +0 -0
  207. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
  208. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
  209. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/scout_walk.py +0 -0
  210. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
  211. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
  212. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/smell_scan.py +0 -0
  213. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
  214. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
  215. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
  216. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
  217. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
  218. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/test_selector.py +0 -0
  219. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
  220. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
  221. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
  222. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +0 -0
  223. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/validation_commands.py +0 -0
  224. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/welcome_narrator.py +0 -0
  225. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/wire_check.py +0 -0
  226. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/wisdom_capture.py +0 -0
  227. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/wisdom_io.py +0 -0
  228. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/wisdom_promote.py +0 -0
  229. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/wisdom_recall.py +0 -0
  230. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/worktree_status.py +0 -0
  231. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
  232. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +0 -0
  233. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +0 -0
  234. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/evolve_session_store.py +0 -0
  235. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
  236. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +0 -0
  237. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/iterate_session_store.py +0 -0
  238. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
  239. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
  240. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/nexus_client.py +0 -0
  241. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
  242. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
  243. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
  244. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +0 -0
  245. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/cherry_hunter.py +0 -0
  246. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/cna_check.py +0 -0
  247. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
  248. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/create_feature.py +0 -0
  249. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/dedup_engine.py +0 -0
  250. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +0 -0
  251. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a0_qk_constants/__init__.py +0 -0
  252. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a1_at_functions/__init__.py +0 -0
  253. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
  254. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +0 -0
  255. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
  256. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
  257. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
  258. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/emergent_swarm.py +0 -0
  259. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/enhancement_proposal_feature.py +0 -0
  260. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
  261. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
  262. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_evolve_session.py +0 -0
  263. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
  264. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_loop_session.py +0 -0
  265. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_pipeline.py +0 -0
  266. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
  267. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/guard_install.py +0 -0
  268. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/handoff_feature.py +0 -0
  269. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/hive_sync.py +0 -0
  270. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
  271. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/materialize_feature.py +0 -0
  272. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/nexus_bridge.py +0 -0
  273. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/relay_daemon.py +0 -0
  274. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
  275. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
  276. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/tool_factory.py +0 -0
  277. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/verify_umbrella.py +0 -0
  278. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/welcome_feature.py +0 -0
  279. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/wisdom_feature.py +0 -0
  280. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
  281. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
  282. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
  283. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
  284. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/__init__.py +0 -0
  285. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/_registry.py +0 -0
  286. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/audit.py +0 -0
  287. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/chat.py +0 -0
  288. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/commandsmith.py +0 -0
  289. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/config_cmd.py +0 -0
  290. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/create.py +0 -0
  291. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/demo.py +0 -0
  292. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/emergent.py +0 -0
  293. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/emergent_swarm.py +0 -0
  294. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
  295. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/enhancement.py +0 -0
  296. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/evolve.py +0 -0
  297. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
  298. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
  299. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/guard_install.py +0 -0
  300. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/handoff.py +0 -0
  301. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/harvest.py +0 -0
  302. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/hive.py +0 -0
  303. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/iterate.py +0 -0
  304. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/materialize.py +0 -0
  305. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/recon_swarm.py +0 -0
  306. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/relay.py +0 -0
  307. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/surface.py +0 -0
  308. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/synergy.py +0 -0
  309. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
  310. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/welcome.py +0 -0
  311. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/wisdom.py +0 -0
  312. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
  313. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
  314. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge.egg-info/requires.txt +0 -0
  315. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge.egg-info/top_level.txt +0 -0
  316. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_aaaa_nexus_client.py +0 -0
  317. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_agent_hire_protocol.py +0 -0
  318. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_agent_plan.py +0 -0
  319. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_agent_plan_pkg_label.py +0 -0
  320. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_audit_verb.py +0 -0
  321. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_body_extractor_repairs.py +0 -0
  322. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_card_renderer.py +0 -0
  323. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_certify_operational_axis.py +0 -0
  324. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_chat.py +0 -0
  325. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_classify_tier.py +0 -0
  326. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_classify_tier_ast_signals.py +0 -0
  327. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_cli_smoke.py +0 -0
  328. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_cli_swarm_aliases.py +0 -0
  329. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_codex_6_enforce_polyglot.py +0 -0
  330. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_commandsmith.py +0 -0
  331. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_compiler_feedback.py +0 -0
  332. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_compliance_checker.py +0 -0
  333. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_config.py +0 -0
  334. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_cost_circuit_breaker.py +0 -0
  335. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_create_feature.py +0 -0
  336. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_cs1_renderer.py +0 -0
  337. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_custom_provider.py +0 -0
  338. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_dedup_engine.py +0 -0
  339. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_demo.py +0 -0
  340. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_emergent_compose.py +0 -0
  341. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_emergent_signature_extract.py +0 -0
  342. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_emergent_synthesize_imports.py +0 -0
  343. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_error_codes.py +0 -0
  344. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_error_hints.py +0 -0
  345. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_evolve_js.py +0 -0
  346. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_exported_api_check.py +0 -0
  347. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_forge_action.py +0 -0
  348. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_forge_auth_a1.py +0 -0
  349. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_forge_auth_a2.py +0 -0
  350. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_forge_enforce.py +0 -0
  351. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_generation_quality.py +0 -0
  352. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_hierarchical_memory.py +0 -0
  353. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_hive_sync.py +0 -0
  354. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_ignore_and_docs.py +0 -0
  355. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_import_smoke.py +0 -0
  356. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_iterate_evolve.py +0 -0
  357. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_js_certify.py +0 -0
  358. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_js_parser.py +0 -0
  359. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_js_recon.py +0 -0
  360. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_js_wire.py +0 -0
  361. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_lineage_chain.py +0 -0
  362. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_ling_provider.py +0 -0
  363. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_local_signer.py +0 -0
  364. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_lsp_protocol.py +0 -0
  365. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_manifest_diff.py +0 -0
  366. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_materialize_feature.py +0 -0
  367. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_mcp_lazy_bootstrap.py +0 -0
  368. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_nexus_bridge.py +0 -0
  369. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_ollama_client.py +0 -0
  370. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_pipeline.py +0 -0
  371. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_polyglot_cli_mcp.py +0 -0
  372. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_polyglot_full_pipeline.py +0 -0
  373. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_polyglot_hardening.py +0 -0
  374. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_polyglot_swift_kotlin_go.py +0 -0
  375. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_polyglot_symbol_parity.py +0 -0
  376. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_pre_audit_smoke.py +0 -0
  377. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_precommit_hooks.py +0 -0
  378. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_progress_reporter.py +0 -0
  379. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_receipt_emitter.py +0 -0
  380. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_receipt_schema.py +0 -0
  381. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_receipt_signer.py +0 -0
  382. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_response_enricher.py +0 -0
  383. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_roi_calculator.py +0 -0
  384. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_sbom_cmd_text_summary.py +0 -0
  385. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_sbom_emitter.py +0 -0
  386. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_scaffold.py +0 -0
  387. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_sidecar.py +0 -0
  388. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_sidecar_validate.py +0 -0
  389. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_smell_score_formula.py +0 -0
  390. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_stagnation.py +0 -0
  391. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_stub_detector.py +0 -0
  392. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_surface_export.py +0 -0
  393. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_synergy.py +0 -0
  394. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_test_runner.py +0 -0
  395. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_tier_init_rebuild.py +0 -0
  396. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_verify_suggested_recipe.py +0 -0
  397. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_welcome_enhancements.py +0 -0
  398. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_whoami_cmd.py +0 -0
  399. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_wire_certify.py +0 -0
  400. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_wire_suggest_repairs.py +0 -0
  401. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_wire_type_checking.py +0 -0
  402. {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_wisdom.py +0 -0
@@ -0,0 +1,96 @@
1
+ name: Metrics Auto-Regenerate
2
+
3
+ # Single-source-of-truth pipeline. On every push to main, recomputes the
4
+ # canonical forge_metrics.json artifact and pushes a follow-up commit if
5
+ # the artifact drifted from what the source tree should produce.
6
+ #
7
+ # Together with metrics-drift.yml (CI gate on PRs), this means:
8
+ # - PRs are blocked on stale metrics.
9
+ # - Direct pushes to main self-heal automatically.
10
+ # - Public surfaces (atomadic.tech, shields.io endpoints proxied by
11
+ # the worker) always read live numbers from the same JSON.
12
+ #
13
+ # Lean theorem count requires the IP-protected mhed-codex repo. The
14
+ # FORGE_MHED_CODEX_REPO secret (org-level) provides a deploy-key URL;
15
+ # without it the lean_theorems block is preserved from the prior commit
16
+ # (see surgical merge step below) so this workflow never destroys real
17
+ # numbers when running without the IP repo attached.
18
+
19
+ on:
20
+ push:
21
+ branches: [main]
22
+ paths:
23
+ - "src/atomadic_forge/**"
24
+ - "tests/**"
25
+ - "pyproject.toml"
26
+ - "src/atomadic_forge/a1_at_functions/forge_metrics.py"
27
+ - "src/atomadic_forge/a3_og_features/forge_metrics_feature.py"
28
+
29
+ permissions:
30
+ contents: write
31
+
32
+ jobs:
33
+ regen:
34
+ runs-on: ubuntu-latest
35
+ timeout-minutes: 8
36
+ if: ${{ !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, 'chore(metrics): auto-regenerate') }}
37
+ steps:
38
+ - uses: actions/checkout@v4
39
+ with:
40
+ fetch-depth: 0
41
+ token: ${{ secrets.GITHUB_TOKEN }}
42
+ - uses: actions/setup-python@v5
43
+ with:
44
+ python-version: "3.12"
45
+ - name: Install package
46
+ run: pip install -e . --quiet
47
+ - name: Run pytest to count live passing
48
+ id: pytest
49
+ run: |
50
+ set +e
51
+ out=$(python -m pytest tests/ -q --no-header 2>&1 | tail -3)
52
+ echo "$out"
53
+ passed=$(echo "$out" | grep -oE '[0-9]+ passed' | head -1 | grep -oE '[0-9]+')
54
+ echo "passed=${passed:-0}" >> "$GITHUB_OUTPUT"
55
+ - name: Optionally clone IP-protected mhed-codex (preserves lean count)
56
+ if: ${{ env.MHED_CODEX_DEPLOY_KEY != '' }}
57
+ env:
58
+ MHED_CODEX_DEPLOY_KEY: ${{ secrets.MHED_CODEX_DEPLOY_KEY }}
59
+ run: |
60
+ mkdir -p ~/.ssh && chmod 700 ~/.ssh
61
+ echo "$MHED_CODEX_DEPLOY_KEY" > ~/.ssh/mhed_key && chmod 600 ~/.ssh/mhed_key
62
+ GIT_SSH_COMMAND="ssh -i ~/.ssh/mhed_key -o StrictHostKeyChecking=no" \
63
+ git clone --depth 1 git@github.com:atomadictech/mhed-codex.git /tmp/mhed-codex
64
+ echo "FORGE_MHED_CODEX=/tmp/mhed-codex" >> "$GITHUB_ENV"
65
+ - name: Regenerate forge_metrics.json
66
+ run: |
67
+ # Save the previous lean_theorems block so we can preserve it
68
+ # when no mhed-codex is attached (avoid zeroing the public
69
+ # number on a routine source-only push).
70
+ python -c "import json; d=json.load(open('forge_metrics.json')); print(json.dumps(d.get('lean_theorems', {})))" > /tmp/prev_lean.json
71
+ forge metrics --apply --tests-passing ${{ steps.pytest.outputs.passed }}
72
+ # If no mhed-codex was attached this run, restore prior lean block.
73
+ if [ -z "${FORGE_MHED_CODEX:-}" ]; then
74
+ python <<'PY'
75
+ import json, pathlib
76
+ p = pathlib.Path("forge_metrics.json")
77
+ d = json.loads(p.read_text())
78
+ prev = json.loads(pathlib.Path("/tmp/prev_lean.json").read_text())
79
+ # Only restore if the freshly-computed block reports found=False
80
+ # (i.e. mhed-codex unavailable) AND the prior had a real count.
81
+ if not d.get("lean_theorems", {}).get("found") and prev.get("count"):
82
+ d["lean_theorems"] = prev
83
+ p.write_text(json.dumps(d, indent=2, sort_keys=True) + "\n")
84
+ PY
85
+ fi
86
+ - name: Commit if drifted
87
+ run: |
88
+ git config user.name "atomadic-bot"
89
+ git config user.email "bot@atomadic.tech"
90
+ if git diff --quiet -- forge_metrics.json; then
91
+ echo "metrics already current — no commit"
92
+ exit 0
93
+ fi
94
+ git add forge_metrics.json
95
+ git commit -m "chore(metrics): auto-regenerate forge_metrics.json [skip ci]"
96
+ git push origin main
@@ -0,0 +1,61 @@
1
+ name: Metrics Drift Gate
2
+
3
+ # CI gate that keeps forge_metrics.json in sync with the live forge surface.
4
+ # Any PR that changes TOOLS, CLI registry, source/test counts, or
5
+ # pyproject.toml WITHOUT regenerating forge_metrics.json fails this check.
6
+ #
7
+ # Lean theorem count is recomputed only when the FORGE_MHED_CODEX repo is
8
+ # accessible (CI env var). When not set, the lean_theorems block is
9
+ # preserved from the in-tree forge_metrics.json so PRs that don't touch
10
+ # mhed-codex don't get blocked here.
11
+ #
12
+ # Fix when this fails: forge metrics --apply && git add forge_metrics.json
13
+
14
+ on:
15
+ pull_request:
16
+ paths:
17
+ - "src/atomadic_forge/a0_qk_constants/schema_version_registry.py"
18
+ - "src/atomadic_forge/a1_at_functions/mcp_protocol.py"
19
+ - "src/atomadic_forge/a1_at_functions/forge_metrics.py"
20
+ - "src/atomadic_forge/a3_og_features/forge_metrics_feature.py"
21
+ - "src/atomadic_forge/a4_sy_orchestration/cli.py"
22
+ - "src/atomadic_forge/commands/**"
23
+ - "pyproject.toml"
24
+ - "forge_metrics.json"
25
+ push:
26
+ branches: [main]
27
+
28
+ jobs:
29
+ metrics-drift:
30
+ runs-on: ubuntu-latest
31
+ timeout-minutes: 5
32
+ steps:
33
+ - uses: actions/checkout@v4
34
+ - uses: actions/setup-python@v5
35
+ with:
36
+ python-version: "3.12"
37
+ - name: Install package (editable)
38
+ run: pip install -e . --quiet
39
+ - name: Compute live metrics + diff vs. checked-in artifact
40
+ run: |
41
+ set -euo pipefail
42
+ # Save committed copy.
43
+ cp forge_metrics.json /tmp/forge_metrics.committed.json
44
+ # Recompute (Lean count zero in CI unless FORGE_MHED_CODEX is wired).
45
+ forge metrics --apply
46
+ # If the only delta is the timestamp, that's expected — strip it
47
+ # before diffing so we only fail on substantive drift.
48
+ jq 'del(.generated_at_utc)' /tmp/forge_metrics.committed.json > /tmp/a.json
49
+ jq 'del(.generated_at_utc)' forge_metrics.json > /tmp/b.json
50
+ # If FORGE_MHED_CODEX is not set, also ignore the lean_theorems
51
+ # block (will be 0 in CI but the committed artifact has the real
52
+ # count from the IP repo).
53
+ if [ -z "${FORGE_MHED_CODEX:-}" ]; then
54
+ jq 'del(.lean_theorems)' /tmp/a.json > /tmp/a2.json && mv /tmp/a2.json /tmp/a.json
55
+ jq 'del(.lean_theorems)' /tmp/b.json > /tmp/b2.json && mv /tmp/b2.json /tmp/b.json
56
+ fi
57
+ if ! diff -u /tmp/a.json /tmp/b.json; then
58
+ echo "::error::forge_metrics.json is stale. Run 'forge metrics --apply' and commit the result."
59
+ exit 1
60
+ fi
61
+ echo "metrics drift check: OK"
@@ -0,0 +1,104 @@
1
+ name: Publish on tag
2
+
3
+ # v0.50.0 — single tag → full publish chain.
4
+ #
5
+ # Pushing a v* tag fires this workflow, which:
6
+ # 1. Verifies forge_metrics.json is current at the tag (no stale numbers
7
+ # shipping to PyPI / atomadic.tech / shields.io).
8
+ # 2. Creates a GitHub Release using the matching CHANGELOG section.
9
+ # The GH-Release event triggers release.yml which builds + publishes
10
+ # to PyPI.
11
+ # 3. Fires a `repository_dispatch` to atomadic-forge-cloudflare-workers
12
+ # so the MCP worker redeploys with the same version. Public
13
+ # surfaces (badges, metrics.json proxy, MCP endpoint) are then in
14
+ # lockstep with the PyPI release.
15
+ #
16
+ # Required secrets:
17
+ # GH_TOKEN — automatic (github.token)
18
+ # WORKER_DEPLOY_PAT — PAT with `repo` scope on the worker repo;
19
+ # grants permission to fire repository_dispatch. If unset, the
20
+ # cross-repo dispatch is skipped (worker can be redeployed
21
+ # manually via its own workflow_dispatch).
22
+
23
+ on:
24
+ push:
25
+ tags:
26
+ - 'v*'
27
+
28
+ permissions:
29
+ contents: write
30
+
31
+ jobs:
32
+ publish:
33
+ name: Publish chain (metrics → GH Release → worker dispatch)
34
+ runs-on: ubuntu-latest
35
+ timeout-minutes: 10
36
+ steps:
37
+ - name: Check out repository
38
+ uses: actions/checkout@v4
39
+ with:
40
+ fetch-depth: 0
41
+
42
+ - name: Extract version from tag
43
+ id: version
44
+ run: echo "version=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"
45
+
46
+ - uses: actions/setup-python@v5
47
+ with:
48
+ python-version: "3.12"
49
+
50
+ - name: Install package
51
+ run: pip install -e . --quiet
52
+
53
+ - name: Verify forge_metrics.json is current at this tag
54
+ run: |
55
+ set -euo pipefail
56
+ # Save the in-tree artifact, recompute, diff (ignoring
57
+ # generated_at_utc and lean_theorems — Lean count requires
58
+ # the IP-protected mhed-codex repo, not present in CI).
59
+ cp forge_metrics.json /tmp/forge_metrics.committed.json
60
+ # Use the most recent passing test count from the suite.
61
+ set +e
62
+ ptout=$(python -m pytest tests/ -q --no-header 2>&1 | tail -3)
63
+ set -e
64
+ passed=$(echo "$ptout" | grep -oE '[0-9]+ passed' | head -1 | grep -oE '[0-9]+')
65
+ forge metrics --apply --tests-passing "${passed:-0}"
66
+ jq 'del(.generated_at_utc) | del(.lean_theorems) | del(.tests_passing)' \
67
+ /tmp/forge_metrics.committed.json > /tmp/a.json
68
+ jq 'del(.generated_at_utc) | del(.lean_theorems) | del(.tests_passing)' \
69
+ forge_metrics.json > /tmp/b.json
70
+ if ! diff -u /tmp/a.json /tmp/b.json; then
71
+ echo "::error::forge_metrics.json is stale at tag ${GITHUB_REF_NAME}. Re-run \`forge metrics --apply\` and re-tag."
72
+ exit 1
73
+ fi
74
+
75
+ - name: Extract changelog for this version
76
+ id: changelog
77
+ run: |
78
+ version="${{ steps.version.outputs.version }}"
79
+ changelog=$(sed -n "/^## .*${version}/,/^## /{/^## .*${version}/d;/^## /d;p}" CHANGELOG.md | head -100)
80
+ if [ -z "$changelog" ]; then
81
+ changelog="Release v${version}"
82
+ fi
83
+ echo "$changelog" > /tmp/release_notes.md
84
+
85
+ - name: Create GitHub Release
86
+ env:
87
+ GH_TOKEN: ${{ github.token }}
88
+ run: |
89
+ gh release create "${{ github.ref_name }}" \
90
+ --title "Atomadic Forge ${{ github.ref_name }}" \
91
+ --notes-file /tmp/release_notes.md
92
+
93
+ - name: Dispatch worker redeploy
94
+ if: ${{ secrets.WORKER_DEPLOY_PAT != '' }}
95
+ env:
96
+ PAT: ${{ secrets.WORKER_DEPLOY_PAT }}
97
+ run: |
98
+ curl -fsS -X POST \
99
+ -H "Accept: application/vnd.github+json" \
100
+ -H "Authorization: Bearer ${PAT}" \
101
+ -H "X-GitHub-Api-Version: 2022-11-28" \
102
+ https://api.github.com/repos/atomadictech/atomadic-forge-cloudflare-workers/dispatches \
103
+ -d "{\"event_type\":\"forge-released\",\"client_payload\":{\"version\":\"${{ steps.version.outputs.version }}\"}}"
104
+ echo "dispatched forge-released v${{ steps.version.outputs.version }} → worker repo"
@@ -0,0 +1,72 @@
1
+ name: Uptime monitor
2
+
3
+ # Runs every 30 minutes. Pings all Atomadic services and opens an
4
+ # issue if any are down. Free uptime monitoring via GitHub Actions.
5
+
6
+ on:
7
+ schedule:
8
+ - cron: '*/30 * * * *'
9
+ workflow_dispatch:
10
+
11
+ permissions:
12
+ contents: read
13
+ issues: write
14
+
15
+ jobs:
16
+ check:
17
+ name: Health check
18
+ runs-on: ubuntu-latest
19
+ timeout-minutes: 3
20
+ steps:
21
+ - name: Ping all services
22
+ id: ping
23
+ run: |
24
+ failed=""
25
+ for entry in \
26
+ "forge.atomadic.tech|https://forge.atomadic.tech" \
27
+ "forge-mcp|https://forge.atomadic.tech/mcp" \
28
+ "chat.atomadic.tech|https://chat.atomadic.tech" \
29
+ "forge-auth|https://forge-auth.atomadic.tech" \
30
+ ; do
31
+ name="${entry%%|*}"
32
+ url="${entry##*|}"
33
+ status=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "$url" 2>/dev/null || echo "000")
34
+ # 200, 401, 405 are all "alive" responses for various endpoints
35
+ if [[ "$status" =~ ^(200|301|302|401|403|405)$ ]]; then
36
+ echo "OK $status $name"
37
+ else
38
+ echo "ERR $status $name"
39
+ failed="$failed $name($status)"
40
+ fi
41
+ done
42
+
43
+ if [ -n "$failed" ]; then
44
+ echo "failed=$failed" >> "$GITHUB_OUTPUT"
45
+ echo "has_failure=true" >> "$GITHUB_OUTPUT"
46
+ else
47
+ echo "has_failure=false" >> "$GITHUB_OUTPUT"
48
+ fi
49
+
50
+ - name: Open issue if services are down
51
+ if: steps.ping.outputs.has_failure == 'true'
52
+ uses: actions/checkout@v6
53
+
54
+ - name: Create or update issue
55
+ if: steps.ping.outputs.has_failure == 'true'
56
+ env:
57
+ GH_TOKEN: ${{ github.token }}
58
+ run: |
59
+ title="Uptime alert: services down"
60
+ body="The following services are unreachable: ${{ steps.ping.outputs.failed }}
61
+
62
+ Detected at $(date -u +'%Y-%m-%d %H:%M UTC')
63
+
64
+ Run \`make uptime\` locally to verify."
65
+
66
+ # Check if an open uptime issue already exists
67
+ existing=$(gh issue list --label uptime --state open --json number -q '.[0].number' 2>/dev/null || true)
68
+ if [ -n "$existing" ]; then
69
+ gh issue comment "$existing" --body "$body"
70
+ else
71
+ gh issue create --title "$title" --body "$body" --label uptime
72
+ fi
@@ -2,6 +2,294 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## v0.50.0 — 2026-05-07 — one tag publishes everywhere
6
+
7
+ ### feat: full single-tag publish chain (PyPI + worker + badges in lockstep)
8
+
9
+ Pushing a single `vX.Y.Z` tag now drives the whole pipeline:
10
+
11
+ 1. `publish-on-tag.yml` verifies `forge_metrics.json` is current at the
12
+ tag (fail-loud if stale — no shipping wrong numbers to public surfaces).
13
+ 2. GitHub Release is created from the matching CHANGELOG section.
14
+ 3. `release.yml` builds + publishes to PyPI.
15
+ 4. `repository_dispatch` fires `forge-released` to the worker repo,
16
+ which redeploys via `wrangler deploy` with the matching version env.
17
+
18
+ Public surfaces (atomadic.tech, shields.io badges, MCP endpoint, doctor
19
+ response, package version banner) all reflect the same tag within ~30s.
20
+
21
+ ### feat: shields.io endpoint badges
22
+
23
+ The Cloudflare Worker now serves shields.io v1 endpoint badges:
24
+
25
+ ```
26
+ https://img.shields.io/endpoint?url=https://forge.atomadic.tech/badge/<metric>
27
+ ```
28
+
29
+ Available metrics: `mcp_tools`, `mcp_actions`, `cli_verbs`, `tests_passing`,
30
+ `test_files`, `test_functions`, `source_files`, `source_lines`,
31
+ `monadic_tiers`, `lean_theorems`, `package_version`.
32
+
33
+ Each badge reads `forge_metrics.json` (5-min edge cache). Drop one in any
34
+ README, docs site, or status page — the number updates without anyone
35
+ editing the file.
36
+
37
+ README header gained a row of live badges: tools, actions, CLI verbs,
38
+ tests passing, source files, Lean4 theorem count. Static "100/100
39
+ certify" badge retired in favor of dynamic numbers.
40
+
41
+ ### feat: auto-regen on every push to main
42
+
43
+ `metrics-auto-regen.yml`: any push to `main` that touches source, tests,
44
+ or `pyproject.toml` triggers a regeneration. If the artifact drifted, a
45
+ follow-up `chore(metrics): auto-regenerate [skip ci]` commit is pushed
46
+ back to main. Stale numbers self-heal — no human intervention.
47
+
48
+ When the `MHED_CODEX_DEPLOY_KEY` org secret is configured, the
49
+ auto-regen also clones the IP-protected mhed-codex over deploy-key
50
+ SSH and refreshes the Lean theorem count. Without the secret, the prior
51
+ lean count is preserved (never zeroed by a routine push).
52
+
53
+ ### chore: corrected misnamed metric units
54
+
55
+ Earlier responses cited "1,493 passing" alongside "test_files: 96" and
56
+ "124/124 passed" — three different units (full-suite passes, file count,
57
+ targeted-subset passes). The artifact now carries all three explicitly:
58
+ `test_files`, `test_functions`, `tests_passing`.
59
+
60
+ ## v0.49.0 — 2026-05-07 — single source of truth: `forge_metrics.json`
61
+
62
+ ### feat: canonical metrics artifact for every public surface
63
+
64
+ Every public number Forge claims about itself — MCP tool count, action
65
+ count, CLI verb count, source/test files, lines of code, and the count
66
+ of formally-verified Lean4 theorems in the IP-protected mhed-codex
67
+ moat — now lives in one canonical artifact: `forge_metrics.json` at the
68
+ repo root, regenerated on every push by `forge metrics --apply`.
69
+
70
+ Public surfaces (README, CHANGELOG badges, the welcome handshake, the
71
+ Cloudflare Worker, shields.io endpoints, atomadic.tech site) read from
72
+ this file. CI gate (`metrics-drift.yml`) fails any PR that lets the
73
+ artifact drift out of sync with the live forge surface.
74
+
75
+ **Live numbers (this commit):**
76
+ - 10 MCP tools · 64 actions
77
+ - 71 CLI verbs
78
+ - 211 source files · ~40,110 LOC
79
+ - 96 test files
80
+ - **886 Lean4 theorems across 38 files** (mhed-codex moat)
81
+ - monadic tiers = 5
82
+
83
+ ### feat(cli/mcp): `forge metrics` verb — print or write the artifact
84
+
85
+ ```
86
+ forge metrics # print live metrics summary
87
+ forge metrics --apply # rewrite forge_metrics.json
88
+ forge metrics --json # machine-readable JSON to stdout
89
+ forge metrics --self-cert # also embed certify score (slower)
90
+ ```
91
+
92
+ The verb composes a pure tier-a1 aggregator (`forge_metrics.py`) with
93
+ the live MCP TOOLS dict and CLI registry. Source paths from the
94
+ IP-protected mhed-codex repo are NEVER written into the public
95
+ artifact — only aggregate counts. Path resolution is via the
96
+ `FORGE_MHED_CODEX` env var; gitignore protects `mhed-codex/` from
97
+ ever being checked in.
98
+
99
+ ### chore: corrected stale README numbers
100
+
101
+ The "By the Numbers" table previously cited Lean4=624 (stale by 262)
102
+ and source files=193 (stale by 18). Now derived live from
103
+ `forge_metrics.json` and verified against the IP repo.
104
+
105
+ ## v0.48.0 — 2026-05-07 — flagship `transmute` + `loop` split out of plan (8→10 tools)
106
+
107
+ ### refactor(mcp): surface the flagship pipeline; reduce plan overload
108
+
109
+ The v0.46.0 consolidation buried the flagship `auto` pipeline inside
110
+ `plan(action='auto')` — semantically wrong (`plan` means *planning*, not
111
+ *executing the absorption pipeline*) and bad for discoverability (agents
112
+ reading `tools/list` couldn't see "auto" at all).
113
+
114
+ **v0.48.0 splits two semantic clusters back out:**
115
+
116
+ - **`transmute` (3 actions)** — the spaghetti→certified flagship:
117
+ `auto` (single-shot scout→cherry→assimilate→wire→certify) ·
118
+ `cherry` (produce cherry.json manifest) ·
119
+ `finalize` (materialize a cherry.json into a package).
120
+ This is the headline Forge capability and now appears at the top level
121
+ of `tools/list` again.
122
+
123
+ - **`loop` (4 actions)** — LLM-driven iteration sessions:
124
+ `iterate` · `resume` · `evolve` · `evolve_step`.
125
+ Distinct from `plan` because these REQUIRE an external LLM client —
126
+ Forge has no embedded LLM. Splitting clarifies that contract.
127
+
128
+ **`plan` (16 → 9 actions)** — now cleanly scoped to "orient + dev utilities":
129
+ context, compose, policy, recipes, generate, apply, locate, commit, scaffold.
130
+
131
+ **Backward compat:** every legacy name still works.
132
+ `LEGACY_ENDPOINT_MAP` updated: `auto/cherry/finalize/transmute → transmute`,
133
+ `iterate/evolve/loop → loop`. Schema bumps: `transmute → /v2`, `loop → /v2`,
134
+ `plan → /v6` (action enum changed). Total tool count: **10**.
135
+
136
+ ### chore: schema registry & surface map updated
137
+
138
+ `transmute` → `/v2`, `loop` → `/v2` restored in registry. `plan` schema bumped
139
+ implicitly via action enum change.
140
+
141
+ ## v0.47.0 — 2026-05-07 — `create` exposed as MCP tool (7→8 tools)
142
+
143
+ ### feat(mcp): forge create now callable over MCP
144
+
145
+ `create` was previously CLI-only. Exposes `create_from_intent` (intent + seed_repos → pip package)
146
+ as a standalone MCP tool — runs the full Phase 1 pipeline (emergent_swarm cross-repo composition
147
+ discovery → materialize top-N candidates → optional certify). Returns the create receipt with
148
+ scan_summary, materialize report, and scan_report_path for re-runs without re-scanning.
149
+
150
+ Schema: `atomadic-forge.create/v1`. Total tool count: **8**.
151
+
152
+ ## v0.46.0 — 2026-05-07 — MCP Surface Redesign: 66→7 tools, 64 actions
153
+
154
+ ### feat(mcp): complete tool surface consolidation with action-dispatch architecture
155
+
156
+ Reduced the MCP tool count from **66 to 7** by consolidating related operations
157
+ under action-dispatch. Each of the 66 original tool names redirects automatically
158
+ via `LEGACY_ENDPOINT_MAP` — zero callers broken, zero migrations required.
159
+
160
+ **Measured token savings: ~8,630 tokens per `tools/list` call (−51%)** vs the prior
161
+ 66-tool surface (`tools/list` payload dropped from 67.7 KB → 33.2 KB, measured
162
+ on v0.23.0 vs v0.47.0 by dispatching the actual JSON-RPC call). Per-session
163
+ savings depend on how many `tools/list` calls a client issues — typically
164
+ ~8.6K–26K tokens. The earlier draft of these notes claimed ~250K tokens/session
165
+ and ~99 KB → ~25 KB; both were estimates that didn't survive measurement.
166
+ Response-size caps across high-volume tools (smell_scan, wisdom_list, etc.)
167
+ saved an additional ~189 KB per heavy round-trip — those numbers were
168
+ verified directly and stand.
169
+
170
+ **Final 7-tool surface (64 actions):**
171
+
172
+ | Tool | Actions | Scope |
173
+ |------|---------|-------|
174
+ | `welcome` | — | RECOMMENDED FIRST CALL: onboarding scan, score, narrative, safety net |
175
+ | `explore` | 9 | Codebase analysis & discovery: `recon` · `explain` · `call_graph` · `smell_scan` · `lineage` · `harvest` · `synergy` · `scan` · `swarm` |
176
+ | `audit` | 14 | Quality gates & change safety: `certify` · `wire` · `enforce` · `validate` · `guard` · `composite` · `gate` · `health` · `check` · `score` · `tests` · `cna` · `rollback` · `diff` |
177
+ | `plan` | 16 | Orient + plan + execute: `context` · `compose` · `policy` · `recipes` · `generate` · `apply` · `locate` · `commit` · `iterate` · `resume` · `evolve` · `evolve_step` · `auto` · `cherry` · `finalize` · `scaffold` |
178
+ | `hive` | 13 | Multi-agent coordination: `register` · `list` · `deactivate` · `observe` · `propose` · `vote` · `needs_vote` · `result` · `recap` · `handoff_create` · `handoff_list` · `enhance_propose` · `enhance_list` |
179
+ | `wisdom` | 5 | Institutional memory DB: `record` · `query` · `list` · `recall` · `promote` |
180
+ | `nexus` | 7 | AAAA-Nexus auth primitives (via `op=`): `identity_verify` · `federation_mint` · `authorize_action` · `sys_trust_gate` · `contract_verify` · `lineage_record` · `ratchet_register` |
181
+
182
+ Each tool uses `action=` dispatch; `nexus` uses `op=` to avoid collision with
183
+ `authorize_action`'s pass-through `action` parameter.
184
+
185
+ ### perf: response-size caps across high-volume tools
186
+
187
+ Default payload sizes reduced at the source so agents never receive multi-KB
188
+ responses they didn't ask for:
189
+
190
+ | Tool | Before | After | Mechanism |
191
+ |------|--------|-------|-----------|
192
+ | `emergent_scan` | 32 KB | 7.5 KB | `top_n` 25→10, optional `include_chains` |
193
+ | `synergy_scan` | 14 KB | 5.7 KB | `top_n` 25→10, optional `include_details` |
194
+ | `smell_scan` | 61 KB | 12 KB | `top_n_findings=20` cap, always emits `*_count` |
195
+ | `wisdom_list` | 71 KB | ~5 KB | `limit=20` default, `limit=0` for full dump |
196
+ | `wisdom_promote` | 46 KB | 5 KB | `include_bodies=false` default |
197
+
198
+ Full detail always recoverable via the respective opt-in params.
199
+
200
+ ## v0.23.0 — 2026-05-07 — wisdom_promote body trim (46 KB → 5 KB)
201
+
202
+ ### perf(wisdom_promote): strip draft_markdown bodies from default response
203
+
204
+ `wisdom_promote` response was 46 KB (3 drafts × full markdown). Default now
205
+ returns metadata only — `body_chars`, `body_omitted: true` — at ~5 KB.
206
+
207
+ - `include_bodies=true` restores full markdown in the response.
208
+ - `write=true` also implicitly includes bodies (you're persisting them anyway).
209
+ - Added `hint` field explaining the param when bodies are omitted.
210
+
211
+ Response reduction: 46,352 → 4,759 bytes (90%).
212
+
213
+ ## v0.22.0 — 2026-05-07 — plan maintenance hints, CLI map completions, description fixes
214
+
215
+ ### feat(plan): inject maintenance_hints when repo already passes at 100/100
216
+
217
+ When `certify=100` and `wire=PASS`, the `plan` tool now emits `maintenance_hints`
218
+ — top-5 CC complexity hotspots from `smell_scan` — so agents always have an
219
+ actionable next step even on a clean repo. Adds `maintenance_hint_count` field.
220
+ No change to existing fields; no impact on repos with real actions to take.
221
+
222
+ ### fix(CLI map): complete _CLI_FALLBACKS for 15 previously missing tools
223
+
224
+ `trust_gate_response` was incorrectly listed as "MCP-only" — the CLI is
225
+ `forge trust-gate`. Added correct CLI equivalents (or intentional MCP-only
226
+ annotations) for: `guard_install`, `tool_factory`, `iterate_start`,
227
+ `iterate_continue`, `evolve_start`, `evolve_step`, `lineage`, `harvest`,
228
+ and all 9 hive subtools.
229
+
230
+ ### fix(lineage): add CLI equivalent to description
231
+
232
+ Description now notes `forge surface list/show/log` as the CLI counterpart,
233
+ fixing the gap where agents had no way to discover the CLI equivalent.
234
+
235
+ ## v0.21.0 — 2026-05-07 — wisdom_list limit, commit_compose prefix fix
236
+
237
+ ### perf(wisdom_list): cap default response at 20 entries (71 KB → ~5 KB)
238
+
239
+ New `limit` parameter (default 20) prevents `wisdom_list` from dumping the
240
+ entire wisdom DB in one call. Always emits:
241
+
242
+ - `total_count` — full entry count regardless of cap.
243
+ - `returned_count` — entries actually returned.
244
+ - `truncated: true` + `hint` string when the DB exceeds the limit.
245
+
246
+ Pass `limit=0` to retrieve all entries. Mirrors the `top_n_findings` pattern
247
+ added to `smell_scan` in v0.20.0.
248
+
249
+ ### fix(commit_compose): strip duplicate conventional-commit prefix from intent
250
+
251
+ `commit_compose` now strips any leading `TYPE:` or `TYPE(scope):` prefix from
252
+ `intent` before prepending the `commit_type` label. Prevents double-prefix
253
+ subjects like `fix: fix(scope): add param` when callers pass a
254
+ conventionally-formatted intent string.
255
+
256
+ ## v0.20.0 — 2026-05-07 — context_pack synthesis, synergy_scan fix, smell_scan token reduction
257
+
258
+ ### feat(context_pack): embed policy + workflow_recipe — replaces two extra tool calls
259
+
260
+ `context_pack` now returns two new fields on every call:
261
+
262
+ - **`policy`** — the full `[tool.forge.agent]` policy dict (`protected_files`,
263
+ `max_files_per_patch`, `require_human_review_for`). Agents no longer need a
264
+ separate `load_policy` call on first connect.
265
+ - **`workflow_recipe`** — when `intent` is provided, `compose_tools` is run
266
+ automatically and the matched recipe (step-by-step tool sequence) is embedded.
267
+ Agents that pass `intent` get both grounding and a workflow plan in one call.
268
+
269
+ `load_policy` and `compose_tools` remain available as standalone tools for
270
+ targeted use. Their descriptions updated to note the context_pack embedding.
271
+
272
+ Extracted `_build_policy` and `_build_workflow_recipe` helpers, keeping
273
+ `emit_context_pack` CC below the 10-threshold flagged by smell_scan.
274
+
275
+ ### fix(synergy_scan): MCP returned 0 candidates vs 20 from CLI
276
+
277
+ `_bound_synergy_scan` in `mcp_server.py` was passing `project_root` as
278
+ `src_root` to `SynergyScan`. The scanner expects the `src/` directory, not the
279
+ repo root. Fixed: now uses `root/"src"` when that directory exists, falling back
280
+ to `root`. Result: 0 → 20 synergy candidates in MCP calls (parity with CLI).
281
+
282
+ ### perf(smell_scan): response slimmed from 61.6 KB to ~12 KB
283
+
284
+ New `top_n_findings` parameter (default 20) caps the findings arrays returned
285
+ while always emitting `*_count` summary fields so agents see the full totals:
286
+
287
+ - `complexity_findings_count`, `long_function_findings_count`,
288
+ `duplication_findings_count` — always present regardless of cap.
289
+ - Returned findings are sorted by worst score (highest CC / longest LOC).
290
+ - `findings_capped_at` field indicates the cap in effect.
291
+ - `top_n_findings: 0` disables the cap entirely for full reports.
292
+
5
293
  ## v0.19.0 — 2026-05-07 — MCP/CLI parity sweep: 8 tool fixes, call_graph overhaul, smell improvements
6
294
 
7
295
  ### fix(recon): MCP recon now returns prior_wisdom