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