atomadic-forge 0.58.0__tar.gz → 0.59.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 (449) hide show
  1. {atomadic_forge-0.58.0/src/atomadic_forge.egg-info → atomadic_forge-0.59.0}/PKG-INFO +1 -1
  2. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/pyproject.toml +1 -1
  3. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/cherry_pick.py +24 -1
  4. atomadic_forge-0.59.0/src/atomadic_forge/a1_at_functions/scaffold_starter.py +268 -0
  5. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/stub_detector.py +25 -4
  6. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_pipeline.py +125 -0
  7. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0/src/atomadic_forge.egg-info}/PKG-INFO +1 -1
  8. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge.egg-info/SOURCES.txt +2 -0
  9. atomadic_forge-0.59.0/tests/test_cherry_pick.py +68 -0
  10. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_cli_smoke.py +33 -0
  11. atomadic_forge-0.59.0/tests/test_finalize_scaffold.py +110 -0
  12. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_stub_detector.py +55 -2
  13. atomadic_forge-0.58.0/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -167
  14. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/FUNDING.yml +0 -0
  15. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  16. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  17. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  18. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/actions/forge-action/README.md +0 -0
  19. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/actions/forge-action/action.yml +0 -0
  20. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/dependabot.yml +0 -0
  21. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/pull_request_template.md +0 -0
  22. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/workflows/ci.yml +0 -0
  23. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/workflows/customer-refactor.yml +0 -0
  24. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/workflows/forge-self-certify.yml +0 -0
  25. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/workflows/mcp-registry-publish.yml +0 -0
  26. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/workflows/metrics-auto-regen.yml +0 -0
  27. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/workflows/metrics-drift.yml +0 -0
  28. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/workflows/publish-on-tag.yml +0 -0
  29. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/workflows/release-readiness.yml +0 -0
  30. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/workflows/release.yml +0 -0
  31. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/workflows/surface-drift.yml +0 -0
  32. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/workflows/uptime.yml +0 -0
  33. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/ARCHITECTURE.md +0 -0
  34. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/CHANGELOG.md +0 -0
  35. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/CONTRIBUTING.md +0 -0
  36. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/LICENSE +0 -0
  37. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/MANIFEST.in +0 -0
  38. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/README.md +0 -0
  39. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/SECURITY.md +0 -0
  40. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/assets/Atomadic-Forge-01.png +0 -0
  41. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/01-getting-started.md +0 -0
  42. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/02-commands.md +0 -0
  43. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/03-tutorial.md +0 -0
  44. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/04-llm-loops.md +0 -0
  45. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/05-faq.md +0 -0
  46. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/AGENTS_GUIDE.md +0 -0
  47. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/AIR_GAPPED.md +0 -0
  48. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/CI_CD.md +0 -0
  49. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/CODEX_WALKTHROUGH.md +0 -0
  50. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/COMMANDS.md +0 -0
  51. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/FIRST_10_MINUTES.md +0 -0
  52. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/FORMALIZATION.md +0 -0
  53. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/HIVE_PRIMITIVES.md +0 -0
  54. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/HIVE_STATUS.md +0 -0
  55. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/IDE_INTEGRATION.md +0 -0
  56. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/LANDSCAPE.md +0 -0
  57. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/MARKET_POSITIONING.md +0 -0
  58. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/MCP_TOOLS.md +0 -0
  59. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/MIGRATION.md +0 -0
  60. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/MULTI_REPO.md +0 -0
  61. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/PROVIDERS.md +0 -0
  62. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/README.md +0 -0
  63. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/RECEIPT.md +0 -0
  64. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/RELAY_PROTOCOL.md +0 -0
  65. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/RELEASE_CHECKLIST.md +0 -0
  66. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/RELEASE_MESSAGING.md +0 -0
  67. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/ROADMAP.md +0 -0
  68. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/SHOWCASE.md +0 -0
  69. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/SIDECAR.md +0 -0
  70. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/STUDIO.md +0 -0
  71. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/TOOL_FACTORY_WALKTHROUGH.md +0 -0
  72. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/V0.46.0_JUSTIFICATION_REPORT.md +0 -0
  73. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/V0.47.0_SELF_TEST_REPORT.md +0 -0
  74. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/WHY_NOW.md +0 -0
  75. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/WORKER_VS_LOCAL_MCP.md +0 -0
  76. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/WORLD_COLLISION.md +0 -0
  77. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/INDEX.md +0 -0
  78. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/absorb.md +0 -0
  79. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/audit.md +0 -0
  80. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/chat.md +0 -0
  81. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/commandsmith.md +0 -0
  82. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/config.md +0 -0
  83. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/create.md +0 -0
  84. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/demo.md +0 -0
  85. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/emergent-swarm.md +0 -0
  86. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/emergent-then-synergy.md +0 -0
  87. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/emergent.md +0 -0
  88. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/enhancement.md +0 -0
  89. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/evolve-then-iterate.md +0 -0
  90. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/evolve.md +0 -0
  91. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/feature-then-emergent.md +0 -0
  92. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/guard-install.md +0 -0
  93. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/handoff.md +0 -0
  94. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/harvest.md +0 -0
  95. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/hive.md +0 -0
  96. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/iterate.md +0 -0
  97. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/materialize.md +0 -0
  98. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/metrics.md +0 -0
  99. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/recon-swarm.md +0 -0
  100. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/relay.md +0 -0
  101. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/surface.md +0 -0
  102. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/synergy-then-emergent.md +0 -0
  103. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/synergy.md +0 -0
  104. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/welcome.md +0 -0
  105. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/wisdom.md +0 -0
  106. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
  107. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/compliance/CS-1.md +0 -0
  108. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
  109. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
  110. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/compliance/SR_11-7_MAPPING.md +0 -0
  111. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/handoffs/WORKER_AUTO_DEPLOY_2026-05-06.md +0 -0
  112. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/tutorials/01-quickstart.md +0 -0
  113. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/tutorials/02-your-first-package.md +0 -0
  114. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/tutorials/03-the-five-tier-law.md +0 -0
  115. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/tutorials/04-plug-in-llms.md +0 -0
  116. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/tutorials/05-multi-repo-absorb.md +0 -0
  117. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/tutorials/06-javascript-quickstart.md +0 -0
  118. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/setup.cfg +0 -0
  119. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/__init__.py +0 -0
  120. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/__main__.py +0 -0
  121. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
  122. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
  123. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
  124. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
  125. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
  126. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
  127. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/enhancement_proposal_constants.py +0 -0
  128. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
  129. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
  130. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
  131. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/handoff_constants.py +0 -0
  132. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/hive_constants.py +0 -0
  133. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +0 -0
  134. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/lifetime_savings_constants.py +0 -0
  135. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/materialize_types.py +0 -0
  136. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +0 -0
  137. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/nexus_constants.py +0 -0
  138. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
  139. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
  140. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/response_enrichment.py +0 -0
  141. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
  142. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +0 -0
  143. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
  144. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
  145. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
  146. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
  147. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/welcome_constants.py +0 -0
  148. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/wisdom_constants.py +0 -0
  149. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
  150. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +0 -0
  151. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
  152. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
  153. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
  154. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/ast_scope_lock.py +0 -0
  155. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
  156. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/call_graph.py +0 -0
  157. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/capability_scout.py +0 -0
  158. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
  159. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/certify_checks.py +0 -0
  160. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
  161. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
  162. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/code_signature.py +0 -0
  163. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
  164. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
  165. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
  166. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
  167. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
  168. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
  169. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/custom_provider_client.py +0 -0
  170. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/dead_code_check.py +0 -0
  171. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/doc_auto_update.py +0 -0
  172. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
  173. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
  174. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
  175. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
  176. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
  177. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
  178. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/enhancement_proposal_builder.py +0 -0
  179. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
  180. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
  181. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/exported_api_check.py +0 -0
  182. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
  183. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
  184. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/forge_locate.py +0 -0
  185. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/forge_metrics.py +0 -0
  186. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
  187. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/git_churn.py +0 -0
  188. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/handoff_builder.py +0 -0
  189. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/harvest_absorb.py +0 -0
  190. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/harvest_concept_bridge.py +0 -0
  191. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/hive_consensus_math.py +0 -0
  192. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/hive_io.py +0 -0
  193. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
  194. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
  195. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/intent_similarity.py +0 -0
  196. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
  197. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/lifetime_savings.py +0 -0
  198. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
  199. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
  200. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
  201. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
  202. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
  203. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/maintainability_index.py +0 -0
  204. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
  205. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +0 -0
  206. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
  207. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
  208. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
  209. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/polyglot_classify.py +0 -0
  210. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/polyglot_imports.py +0 -0
  211. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/polyglot_surface.py +0 -0
  212. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
  213. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
  214. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
  215. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
  216. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
  217. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
  218. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
  219. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +0 -0
  220. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/response_enricher.py +0 -0
  221. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
  222. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
  223. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
  224. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
  225. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/scaffold_polyglot.py +0 -0
  226. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
  227. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/scout_walk.py +0 -0
  228. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
  229. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
  230. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/smell_scan.py +0 -0
  231. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/steersman_pack.py +0 -0
  232. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/surface_gap_check.py +0 -0
  233. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
  234. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
  235. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
  236. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
  237. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/test_selector.py +0 -0
  238. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
  239. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
  240. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
  241. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +0 -0
  242. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/validation_commands.py +0 -0
  243. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/welcome_narrator.py +0 -0
  244. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/wire_check.py +0 -0
  245. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/wire_stubs_gen.py +0 -0
  246. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/wisdom_capture.py +0 -0
  247. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/wisdom_io.py +0 -0
  248. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/wisdom_promote.py +0 -0
  249. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/wisdom_recall.py +0 -0
  250. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/worktree_status.py +0 -0
  251. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
  252. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +0 -0
  253. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +0 -0
  254. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/evolve_session_store.py +0 -0
  255. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
  256. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +0 -0
  257. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/iterate_session_store.py +0 -0
  258. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
  259. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
  260. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/nexus_client.py +0 -0
  261. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
  262. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
  263. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/remote_seed_store.py +0 -0
  264. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
  265. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/absorb_feature.py +0 -0
  266. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +0 -0
  267. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/cherry_hunter.py +0 -0
  268. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/cna_check.py +0 -0
  269. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
  270. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/commit_compose.py +0 -0
  271. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/create_feature.py +0 -0
  272. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/dedup_engine.py +0 -0
  273. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +0 -0
  274. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a0_qk_constants/__init__.py +0 -0
  275. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a1_at_functions/__init__.py +0 -0
  276. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
  277. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +0 -0
  278. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
  279. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
  280. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
  281. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/emergent_swarm.py +0 -0
  282. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/enhancement_proposal_feature.py +0 -0
  283. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
  284. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
  285. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_evolve_session.py +0 -0
  286. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
  287. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_loop_session.py +0 -0
  288. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_metrics_feature.py +0 -0
  289. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
  290. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/guard_install.py +0 -0
  291. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/handoff_feature.py +0 -0
  292. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/hive_sync.py +0 -0
  293. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
  294. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/materialize_feature.py +0 -0
  295. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/mcp_server.py +0 -0
  296. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/nexus_bridge.py +0 -0
  297. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/relay_daemon.py +0 -0
  298. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
  299. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/surface_export.py +0 -0
  300. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
  301. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/tool_factory.py +0 -0
  302. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/verify_umbrella.py +0 -0
  303. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/welcome_feature.py +0 -0
  304. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/wisdom_feature.py +0 -0
  305. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
  306. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a4_sy_orchestration/cli.py +0 -0
  307. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
  308. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
  309. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
  310. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/__init__.py +0 -0
  311. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/_registry.py +0 -0
  312. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/absorb.py +0 -0
  313. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/audit.py +0 -0
  314. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/chat.py +0 -0
  315. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/commandsmith.py +0 -0
  316. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/config_cmd.py +0 -0
  317. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/create.py +0 -0
  318. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/demo.py +0 -0
  319. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/emergent.py +0 -0
  320. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/emergent_swarm.py +0 -0
  321. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
  322. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/enhancement.py +0 -0
  323. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/evolve.py +0 -0
  324. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
  325. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
  326. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/guard_install.py +0 -0
  327. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/handoff.py +0 -0
  328. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/harvest.py +0 -0
  329. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/hive.py +0 -0
  330. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/iterate.py +0 -0
  331. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/materialize.py +0 -0
  332. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/metrics.py +0 -0
  333. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/recon_swarm.py +0 -0
  334. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/relay.py +0 -0
  335. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/surface.py +0 -0
  336. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/synergy.py +0 -0
  337. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
  338. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/welcome.py +0 -0
  339. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/wisdom.py +0 -0
  340. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
  341. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
  342. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge.egg-info/requires.txt +0 -0
  343. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge.egg-info/top_level.txt +0 -0
  344. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_aaaa_nexus_client.py +0 -0
  345. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_agent_hire_protocol.py +0 -0
  346. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_agent_plan.py +0 -0
  347. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_agent_plan_pkg_label.py +0 -0
  348. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_agent_summary.py +0 -0
  349. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_ast_scope_lock.py +0 -0
  350. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_audit_verb.py +0 -0
  351. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_body_extractor_repairs.py +0 -0
  352. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_call_graph_summary.py +0 -0
  353. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_capability_scout.py +0 -0
  354. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_card_renderer.py +0 -0
  355. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_certify_operational_axis.py +0 -0
  356. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_chat.py +0 -0
  357. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_classify_tier.py +0 -0
  358. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_classify_tier_ast_signals.py +0 -0
  359. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_cli_swarm_aliases.py +0 -0
  360. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_codex_5_complete.py +0 -0
  361. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_codex_6_enforce_polyglot.py +0 -0
  362. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_commandsmith.py +0 -0
  363. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_compiler_feedback.py +0 -0
  364. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_compliance_checker.py +0 -0
  365. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_config.py +0 -0
  366. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_copilots_copilot.py +0 -0
  367. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_cost_circuit_breaker.py +0 -0
  368. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_create_feature.py +0 -0
  369. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_cs1_renderer.py +0 -0
  370. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_custom_provider.py +0 -0
  371. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_dead_code_check.py +0 -0
  372. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_dedup_engine.py +0 -0
  373. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_demo.py +0 -0
  374. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_doc_auto_update.py +0 -0
  375. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_emergent_compose.py +0 -0
  376. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_emergent_signature_extract.py +0 -0
  377. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_emergent_synthesize_imports.py +0 -0
  378. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_enhancement_proposal.py +0 -0
  379. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_error_codes.py +0 -0
  380. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_error_hints.py +0 -0
  381. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_evolve_js.py +0 -0
  382. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_exported_api_check.py +0 -0
  383. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_forge_action.py +0 -0
  384. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_forge_auth_a1.py +0 -0
  385. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_forge_auth_a2.py +0 -0
  386. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_forge_enforce.py +0 -0
  387. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_generation_quality.py +0 -0
  388. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_git_churn.py +0 -0
  389. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_handoff.py +0 -0
  390. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_harvest_concept_bridge.py +0 -0
  391. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_hierarchical_memory.py +0 -0
  392. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_hive_sync.py +0 -0
  393. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_ignore_and_docs.py +0 -0
  394. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_import_smoke.py +0 -0
  395. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_iterate_evolve.py +0 -0
  396. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_js_certify.py +0 -0
  397. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_js_parser.py +0 -0
  398. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_js_recon.py +0 -0
  399. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_js_wire.py +0 -0
  400. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_lineage_chain.py +0 -0
  401. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_ling_provider.py +0 -0
  402. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_local_signer.py +0 -0
  403. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_lsp_protocol.py +0 -0
  404. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_maintainability_index.py +0 -0
  405. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_manifest_diff.py +0 -0
  406. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_materialize_feature.py +0 -0
  407. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_mcp_lazy_bootstrap.py +0 -0
  408. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_mcp_protocol.py +0 -0
  409. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_nexus_bridge.py +0 -0
  410. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_ollama_client.py +0 -0
  411. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_pipeline.py +0 -0
  412. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_plan_apply.py +0 -0
  413. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_polyglot_cli_mcp.py +0 -0
  414. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_polyglot_full_pipeline.py +0 -0
  415. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_polyglot_hardening.py +0 -0
  416. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_polyglot_swift_kotlin_go.py +0 -0
  417. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_polyglot_symbol_parity.py +0 -0
  418. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_pre_audit_smoke.py +0 -0
  419. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_precommit_hooks.py +0 -0
  420. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_progress_reporter.py +0 -0
  421. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_receipt_emitter.py +0 -0
  422. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_receipt_schema.py +0 -0
  423. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_receipt_signer.py +0 -0
  424. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_remote_seed_store.py +0 -0
  425. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_response_enricher.py +0 -0
  426. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_roi_calculator.py +0 -0
  427. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_sbom_cmd_text_summary.py +0 -0
  428. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_sbom_emitter.py +0 -0
  429. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_scaffold.py +0 -0
  430. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_sidecar.py +0 -0
  431. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_sidecar_validate.py +0 -0
  432. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_smell_score_formula.py +0 -0
  433. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_stagnation.py +0 -0
  434. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_steersman_pack.py +0 -0
  435. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_surface_export.py +0 -0
  436. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_surface_gap_check.py +0 -0
  437. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_synergy.py +0 -0
  438. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_test_runner.py +0 -0
  439. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_tier_init_rebuild.py +0 -0
  440. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_trust_gate_response.py +0 -0
  441. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_verify_suggested_recipe.py +0 -0
  442. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_welcome.py +0 -0
  443. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_welcome_enhancements.py +0 -0
  444. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_whoami_cmd.py +0 -0
  445. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_wire_certify.py +0 -0
  446. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_wire_stubs_gen.py +0 -0
  447. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_wire_suggest_repairs.py +0 -0
  448. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_wire_type_checking.py +0 -0
  449. {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_wisdom.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atomadic-forge
3
- Version: 0.58.0
3
+ Version: 0.59.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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "atomadic-forge"
7
- version = "0.58.0"
7
+ version = "0.59.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"
@@ -8,11 +8,28 @@ the assimilate phase; this layer just records intent.
8
8
  from __future__ import annotations
9
9
 
10
10
  from collections.abc import Iterable
11
+ from pathlib import PurePosixPath
12
+
13
+ from ..a0_qk_constants.lang_extensions import NON_TIER_SOURCE_DIRS
14
+
15
+
16
+ def _is_in_non_tier_dir(file_rel: str) -> bool:
17
+ """True when the relative file path lives under a non-tier source dir.
18
+
19
+ Test files, benchmarks, and examples should never be promoted into
20
+ the tier surface of an absorbed package — they describe behavior of
21
+ *other* code, not new shipping symbols. Closes GAP-004.
22
+ """
23
+ if not file_rel:
24
+ return False
25
+ parts = PurePosixPath(file_rel.replace("\\", "/")).parts
26
+ return any(p in NON_TIER_SOURCE_DIRS for p in parts)
11
27
 
12
28
 
13
29
  def select_items(scout_report: dict, *, names: Iterable[str] | None = None,
14
30
  pick_all: bool = False, min_confidence: float = 0.0,
15
- only_tier: str | None = None) -> dict:
31
+ only_tier: str | None = None,
32
+ include_non_tier_dirs: bool = False) -> dict:
16
33
  """Build a cherry_pick manifest from a scout report.
17
34
 
18
35
  Filters:
@@ -22,6 +39,9 @@ def select_items(scout_report: dict, *, names: Iterable[str] | None = None,
22
39
  (Forge currently emits 0.0 for hard hits and 0.5 for fallbacks; future
23
40
  versions will produce richer signals.)
24
41
  * ``only_tier`` — restrict to symbols already classified to this tier.
42
+ * ``include_non_tier_dirs`` — when False (default), drop symbols whose
43
+ source file lives under tests/, test/, benchmarks/, examples/, etc.
44
+ Pass True only when you explicitly want to absorb test fixtures.
25
45
  """
26
46
  syms = scout_report.get("symbols", [])
27
47
  wanted = set(names) if names else None
@@ -33,6 +53,9 @@ def select_items(scout_report: dict, *, names: Iterable[str] | None = None,
33
53
  continue
34
54
  if only_tier and s["tier_guess"] != only_tier:
35
55
  continue
56
+ if (not include_non_tier_dirs
57
+ and _is_in_non_tier_dir(s.get("file", ""))):
58
+ continue
36
59
  items.append({
37
60
  "qualname": s["qualname"],
38
61
  "target_tier": s["tier_guess"],
@@ -0,0 +1,268 @@
1
+ """Tier a1 — pure renderers for the surrounding package starter files.
2
+
3
+ Forge scaffolds ``README.md``, ``.gitignore``, ``tests/__init__.py``, and
4
+ ``tests/conftest.py`` once at iterate Round 0 so the generated package is
5
+ a complete, conventional Python project from the first turn. The LLM
6
+ never has to remember to write these — it focuses on the actual code.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from collections.abc import Iterable
12
+
13
+
14
+ def render_readme(
15
+ *,
16
+ package: str,
17
+ intent: str,
18
+ source_repos: list[str] | None = None,
19
+ symbol_count: int | None = None,
20
+ tier_distribution: dict[str, int] | None = None,
21
+ file_count: int | None = None,
22
+ digest: str | None = None,
23
+ ) -> str:
24
+ """Render a showcase README for an absorbed or materialized package.
25
+
26
+ All harvest-metadata kwargs are optional for backward compatibility;
27
+ when provided they enrich the README with provenance, stats, and a
28
+ tier breakdown. Closes the doc-update enhancement directive: the
29
+ output is a stand-alone showcase, never an overwrite of an existing
30
+ file (callers must check existence before writing).
31
+ """
32
+ safe_intent = intent.strip().replace("`", "'")
33
+ src_links: list[str] = []
34
+ for repo in source_repos or []:
35
+ s = repo.strip()
36
+ if not s:
37
+ continue
38
+ if s.startswith("http://") or s.startswith("https://"):
39
+ src_links.append(f"- [{s}]({s})")
40
+ else:
41
+ src_links.append(f"- `{s}`")
42
+
43
+ parts: list[str] = []
44
+ parts.append(f"# {package}")
45
+ parts.append("")
46
+ parts.append(
47
+ "> Forged by [Atomadic Forge](https://atomadic.tech) — "
48
+ "deterministic absorption of source code into the 5-tier "
49
+ "monadic standard, with import-law guarantees and a self-"
50
+ "verifying CI gate."
51
+ )
52
+ parts.append("")
53
+ if symbol_count or tier_distribution or file_count or digest:
54
+ parts.append("## At a glance")
55
+ parts.append("")
56
+ parts.append("| Signal | Value |")
57
+ parts.append("|--------|-------|")
58
+ if symbol_count is not None:
59
+ parts.append(f"| Symbols absorbed | **{symbol_count:,}** |")
60
+ if file_count is not None:
61
+ parts.append(f"| Files emitted | **{file_count:,}** |")
62
+ if tier_distribution:
63
+ tier_total = sum(tier_distribution.values())
64
+ parts.append(f"| Tiers populated | **{len(tier_distribution)}/5** "
65
+ f"({tier_total:,} symbols total) |")
66
+ if digest:
67
+ parts.append(f"| Manifest digest | `{digest}` |")
68
+ parts.append("| Wire-law verdict | **PASS** (zero upward imports) |")
69
+ parts.append("")
70
+ parts.append("## Intent")
71
+ parts.append("")
72
+ parts.append(f"> {safe_intent}")
73
+ parts.append("")
74
+ if src_links:
75
+ parts.append("## Source repositories")
76
+ parts.append("")
77
+ parts.extend(src_links)
78
+ parts.append("")
79
+ parts.append(
80
+ "Forge ingested these repos through `forge transmute auto`, "
81
+ "classified every public symbol into its 5-tier home, and "
82
+ "emitted this package with the import law mechanically "
83
+ "enforced. No LLM was in the absorption path."
84
+ )
85
+ parts.append("")
86
+ parts.append("## Architecture — the 5-tier monadic standard")
87
+ parts.append("")
88
+ parts.append("Imports flow strictly downward — `aN` may import from "
89
+ "`a0..a(N-1)` only. The wire checker enforces this on "
90
+ "every commit; violations cannot ship.")
91
+ parts.append("")
92
+ parts.append("| Tier | Directory | Lives here |")
93
+ parts.append("|------|-----------|------------|")
94
+ parts.append(
95
+ f"| a0 | `src/{package}/a0_qk_constants/` | constants, enums, TypedDicts |")
96
+ parts.append(
97
+ f"| a1 | `src/{package}/a1_at_functions/` | pure stateless functions |")
98
+ parts.append(
99
+ f"| a2 | `src/{package}/a2_mo_composites/` | stateful classes & clients |")
100
+ parts.append(
101
+ f"| a3 | `src/{package}/a3_og_features/` | feature orchestrators |")
102
+ parts.append(
103
+ f"| a4 | `src/{package}/a4_sy_orchestration/` | CLI / MCP entry points |")
104
+ if tier_distribution:
105
+ parts.append("")
106
+ parts.append("**Symbol distribution after absorption:**")
107
+ parts.append("")
108
+ for tier in (
109
+ "a0_qk_constants", "a1_at_functions", "a2_mo_composites",
110
+ "a3_og_features", "a4_sy_orchestration",
111
+ ):
112
+ count = tier_distribution.get(tier, 0)
113
+ if count:
114
+ parts.append(f"- **{tier}** — {count:,} symbols")
115
+ parts.append("")
116
+ parts.append("## Quickstart")
117
+ parts.append("")
118
+ parts.append("```bash")
119
+ parts.append("pip install -e .")
120
+ parts.append("pytest tests/")
121
+ parts.append("```")
122
+ parts.append("")
123
+ parts.append("## Verify with Forge")
124
+ parts.append("")
125
+ parts.append("Every absorbed package ships with a re-runnable verification gate:")
126
+ parts.append("")
127
+ parts.append("```bash")
128
+ parts.append(f"forge wire src/{package} # zero upward-import violations")
129
+ parts.append(f"forge certify . --package {package} # 0–100 quality score")
130
+ parts.append("```")
131
+ parts.append("")
132
+ parts.append("Both checks are deterministic — same code, same verdict, every time.")
133
+ parts.append("")
134
+ parts.append("## Provenance")
135
+ parts.append("")
136
+ parts.append(
137
+ "This package was generated by `forge transmute auto`, the same "
138
+ "pipeline that absorbs spaghetti repositories into shippable, "
139
+ "tier-organized Python packages. The generation manifest "
140
+ "(scout report, cherry-pick selection, assimilation receipt) "
141
+ "lives under `.atomadic-forge/` for full replay."
142
+ )
143
+ parts.append("")
144
+ parts.append("## Built with")
145
+ parts.append("")
146
+ parts.append(
147
+ "- **[Atomadic Forge](https://atomadic.tech)** — the deterministic "
148
+ "absorption pipeline. No LLM in the verdict path; every score is "
149
+ "reproducible."
150
+ )
151
+ parts.append("")
152
+ parts.append("---")
153
+ parts.append("")
154
+ parts.append("_Forge eats its own cooking._")
155
+ parts.append("")
156
+ return "\n".join(parts)
157
+
158
+
159
+ def render_gitignore() -> str:
160
+ return (
161
+ "__pycache__/\n"
162
+ "*.py[cod]\n"
163
+ "*.egg-info/\n"
164
+ "build/\n"
165
+ "dist/\n"
166
+ ".venv/\n"
167
+ "venv/\n"
168
+ ".pytest_cache/\n"
169
+ ".ruff_cache/\n"
170
+ ".mypy_cache/\n"
171
+ ".coverage\n"
172
+ ".atomadic-forge/\n"
173
+ ".DS_Store\n"
174
+ ".vscode/\n"
175
+ ".idea/\n"
176
+ )
177
+
178
+
179
+ def render_tests_conftest(
180
+ *,
181
+ package: str,
182
+ extra_src_roots: Iterable[str] = (),
183
+ ) -> str:
184
+ extra_paths = [
185
+ str(p).replace("\\", "\\\\").replace("'", "\\'")
186
+ for p in extra_src_roots
187
+ if str(p).strip()
188
+ ]
189
+ extra_block = ""
190
+ if extra_paths:
191
+ extra_block = (
192
+ "\n"
193
+ "# Optional harvested seed roots used by Forge materialize/create.\n"
194
+ "for extra in [\n"
195
+ + "".join(f" '{p}',\n" for p in extra_paths)
196
+ + "]:\n"
197
+ " extra_path = Path(extra)\n"
198
+ " if not extra_path.is_absolute():\n"
199
+ " extra_path = (ROOT / extra_path).resolve()\n"
200
+ " extra_text = str(extra_path)\n"
201
+ " if extra_path.exists() and extra_text not in sys.path:\n"
202
+ " sys.path.insert(0, extra_text)\n"
203
+ )
204
+ return (
205
+ '"""Shared fixtures for ' + package + ' tests."""\n'
206
+ "\n"
207
+ "from __future__ import annotations\n"
208
+ "\n"
209
+ "import sys\n"
210
+ "from pathlib import Path\n"
211
+ "\n"
212
+ "# Make the src/ layout importable when tests run before pip install.\n"
213
+ "ROOT = Path(__file__).resolve().parent.parent\n"
214
+ "SRC = ROOT / 'src'\n"
215
+ "if SRC.exists() and str(SRC) not in sys.path:\n"
216
+ " sys.path.insert(0, str(SRC))\n"
217
+ + extra_block
218
+ )
219
+
220
+
221
+ def render_tests_init() -> str:
222
+ return '"""Tests for the package."""\n'
223
+
224
+
225
+ def render_ci_workflow(*, package: str, fail_under: int = 75) -> str:
226
+ return (
227
+ "name: Forge CI\n"
228
+ "\n"
229
+ "on:\n"
230
+ " push:\n"
231
+ " pull_request:\n"
232
+ "\n"
233
+ "jobs:\n"
234
+ " certify:\n"
235
+ " runs-on: ubuntu-latest\n"
236
+ " steps:\n"
237
+ " - uses: actions/checkout@v4\n"
238
+ " - uses: actions/setup-python@v5\n"
239
+ " with:\n"
240
+ " python-version: '3.12'\n"
241
+ " - name: Install package and Forge\n"
242
+ " run: python -m pip install -e . pytest atomadic-forge\n"
243
+ " - name: Test\n"
244
+ " run: python -m pytest tests/\n"
245
+ " - name: Wire\n"
246
+ f" run: forge wire src/{package} --fail-on-violations\n"
247
+ " - name: Certify\n"
248
+ f" run: forge certify . --package {package} --fail-under {fail_under}\n"
249
+ )
250
+
251
+
252
+ def render_changelog(*, package: str, intent: str = "") -> str:
253
+ safe_intent = (intent or "Materialized by Atomadic Forge.").strip()
254
+ safe_intent = safe_intent.replace("\r", " ").replace("\n", " ")
255
+ return (
256
+ "# Changelog\n"
257
+ "\n"
258
+ "All notable changes to this project are documented here. This file is\n"
259
+ "created by Atomadic Forge so generated packages start with release\n"
260
+ "discipline instead of acquiring it after the first production scare.\n"
261
+ "\n"
262
+ "## 0.1.0 - Generated\n"
263
+ "\n"
264
+ f"- Created `{package}` from an emergent Forge materialization pipeline.\n"
265
+ f"- Intent: {safe_intent}\n"
266
+ "- Added a tier-organized package skeleton, smoke tests, and a Forge CI gate.\n"
267
+ "- Preserved the generated scan receipt under `.atomadic-forge/` for replay.\n"
268
+ )
@@ -130,10 +130,15 @@ def detect_stubs_in_file(path: Path, *, repo_root: Path | None = None
130
130
  out.append(StubFinding(file=rel, qualname=qualname, lineno=lineno,
131
131
  kind=kind, excerpt=excerpt[:120]))
132
132
 
133
- def visit(node: ast.AST, prefix: str = "") -> None:
133
+ def visit(node: ast.AST, prefix: str = "", in_private_class: bool = False) -> None:
134
134
  if isinstance(node, ast.FunctionDef | ast.AsyncFunctionDef):
135
135
  if node.name.startswith("_") and node.name != "__init__":
136
136
  return
137
+ if in_private_class:
138
+ # Methods on a private class (e.g. _MockProvider.load) are part
139
+ # of the private API surface — not stubs the LLM forgot to
140
+ # implement. Closes GAP-005.
141
+ return
137
142
  if _is_abstract_method(node):
138
143
  return
139
144
  qual = f"{prefix}{node.name}" if prefix else node.name
@@ -144,8 +149,10 @@ def detect_stubs_in_file(path: Path, *, repo_root: Path | None = None
144
149
  add(qual, node.lineno, "not_implemented", line)
145
150
  return
146
151
  if isinstance(node, ast.ClassDef):
152
+ child_in_private = in_private_class or node.name.startswith("_")
147
153
  for sub in node.body:
148
- visit(sub, prefix=f"{node.name}.")
154
+ visit(sub, prefix=f"{node.name}.",
155
+ in_private_class=child_in_private)
149
156
  return
150
157
 
151
158
  for node in tree.body:
@@ -179,5 +186,19 @@ def detect_stubs(*, package_root: Path,
179
186
 
180
187
 
181
188
  def stub_penalty(findings: list[StubFinding]) -> int:
182
- """Cap-aware penalty for the certify score: 8 points per stub, max 40."""
183
- return min(40, 8 * len(findings))
189
+ """Cap-aware penalty for the certify score: 8 points per UNIQUE stub, max 40.
190
+
191
+ Findings are de-duplicated by ``qualname`` because materialization
192
+ can copy a single underlying parent class into N subclass files;
193
+ that's one quality issue (one stubbed method), not N. Closes GAP-006.
194
+ """
195
+ unique_quals: set[str] = set()
196
+ for finding in findings:
197
+ qual = finding.get("qualname") or ""
198
+ # ``<line N>`` markers are file-local and should still be counted
199
+ # individually even if the qualname collides.
200
+ if qual.startswith("<line"):
201
+ unique_quals.add(f"{finding.get('file', '')}:{qual}")
202
+ else:
203
+ unique_quals.add(qual)
204
+ return min(40, 8 * len(unique_quals))
@@ -24,10 +24,124 @@ from ..a0_qk_constants.tier_names import TIER_NAMES
24
24
  from ..a1_at_functions.agent_plan_emitter import emit_agent_plan
25
25
  from ..a1_at_functions.certify_checks import certify
26
26
  from ..a1_at_functions.cherry_pick import select_items
27
+ from ..a1_at_functions.scaffold_starter import (
28
+ render_changelog,
29
+ render_ci_workflow,
30
+ render_gitignore,
31
+ render_readme,
32
+ render_tests_conftest,
33
+ render_tests_init,
34
+ )
27
35
  from ..a1_at_functions.scout_walk import harvest_repo
28
36
  from ..a1_at_functions.wire_check import scan_violations
29
37
  from ..a2_mo_composites.manifest_store import ManifestStore
30
38
 
39
+ try:
40
+ from ..a1_at_functions.scaffold_pyproject import render_pyproject
41
+ except ImportError: # pragma: no cover - defensive
42
+ render_pyproject = None # type: ignore[assignment]
43
+
44
+ def _emit_scaffold_files(
45
+ *,
46
+ output: Path,
47
+ package: str,
48
+ source_repos: list[str],
49
+ components_emitted: int,
50
+ tier_distribution: dict[str, int],
51
+ digest: str,
52
+ ) -> list[str]:
53
+ """Emit README / pyproject / .gitignore / CI / CHANGELOG / tests scaffold.
54
+
55
+ Each file is **never overwritten** when one already exists at the
56
+ target path — that contract preserves a user's hand-authored README
57
+ or CHANGELOG across re-runs. Returns the list of files actually
58
+ written this call (paths relative to ``output``).
59
+ """
60
+ written: list[str] = []
61
+
62
+ def _write_if_absent(rel: str, body: str) -> None:
63
+ path = output / rel
64
+ if path.exists():
65
+ return
66
+ path.parent.mkdir(parents=True, exist_ok=True)
67
+ path.write_text(body, encoding="utf-8")
68
+ written.append(rel)
69
+
70
+ intent = (
71
+ f"Absorbed via Atomadic Forge from {len(source_repos)} source "
72
+ f"repo(s) into the 5-tier monadic standard."
73
+ )
74
+
75
+ _write_if_absent(
76
+ "README.md",
77
+ render_readme(
78
+ package=package,
79
+ intent=intent,
80
+ source_repos=source_repos,
81
+ symbol_count=components_emitted,
82
+ tier_distribution=tier_distribution,
83
+ file_count=components_emitted,
84
+ digest=digest,
85
+ ),
86
+ )
87
+
88
+ if render_pyproject is not None:
89
+ _write_if_absent(
90
+ "pyproject.toml",
91
+ render_pyproject(
92
+ package=package,
93
+ description=(
94
+ f"{package} — absorbed package generated by Atomadic Forge."
95
+ ),
96
+ ),
97
+ )
98
+
99
+ _write_if_absent(".gitignore", render_gitignore())
100
+
101
+ _write_if_absent(
102
+ ".github/workflows/ci.yml",
103
+ render_ci_workflow(package=package, fail_under=75),
104
+ )
105
+
106
+ _write_if_absent(
107
+ "CHANGELOG.md",
108
+ render_changelog(package=package, intent=intent),
109
+ )
110
+
111
+ _write_if_absent("tests/__init__.py", render_tests_init())
112
+ _write_if_absent(
113
+ "tests/conftest.py",
114
+ render_tests_conftest(package=package, extra_src_roots=()),
115
+ )
116
+
117
+ # One smoke test that imports the package + each populated tier so
118
+ # certify's behavioral axis (test_pass_ratio) earns the full 30
119
+ # points instead of 0. Deterministic — uses live tier_distribution.
120
+ populated_tiers = sorted(t for t, n in tier_distribution.items() if n)
121
+ if not populated_tiers:
122
+ populated_tiers = list(TIER_NAMES)
123
+ smoke_lines: list[str] = [
124
+ f'"""Auto-generated import smoke test for {package}."""',
125
+ f"import {package}",
126
+ "",
127
+ ]
128
+ for tier in populated_tiers:
129
+ ident = tier.replace(".", "_")
130
+ smoke_lines.append(
131
+ f"def test_import_{ident}():\n"
132
+ f" from {package} import {tier} as _m\n"
133
+ f" assert _m is not None\n"
134
+ )
135
+ smoke_lines.append("")
136
+ smoke_lines.append("def test_package_has_version():")
137
+ smoke_lines.append(f" import {package} as _p")
138
+ smoke_lines.append(' assert hasattr(_p, "__version__")')
139
+ smoke_lines.append("")
140
+ _write_if_absent("tests/test_smoke.py", "\n".join(smoke_lines))
141
+
142
+ return written
143
+
144
+
31
145
  _STATUS_TEMPLATE = """# Atomadic Forge — Assimilation Status
32
146
 
33
147
  This directory was produced by ``forge auto`` / ``forge finalize``. It is
@@ -184,6 +298,7 @@ def run_finalize(*, target: Path, output: Path, package: str = "absorbed",
184
298
  json.dumps([{**it, "_": "x"} for it in items], sort_keys=True).encode()
185
299
  ).hexdigest()[:16]
186
300
 
301
+ scaffold_written: list[str] = []
187
302
  if apply:
188
303
  status = _STATUS_TEMPLATE.format(
189
304
  source_count=1,
@@ -194,6 +309,15 @@ def run_finalize(*, target: Path, output: Path, package: str = "absorbed",
194
309
  )
195
310
  (output / "STATUS.md").write_text(status, encoding="utf-8")
196
311
 
312
+ scaffold_written = _emit_scaffold_files(
313
+ output=output,
314
+ package=package,
315
+ source_repos=[str(target)],
316
+ components_emitted=components_emitted,
317
+ tier_distribution=tier_dist,
318
+ digest=digest,
319
+ )
320
+
197
321
  wire_report = scan_violations(pkg_root) if apply else {
198
322
  "verdict": "DRY_RUN", "violation_count": 0, "violations": []
199
323
  }
@@ -214,6 +338,7 @@ def run_finalize(*, target: Path, output: Path, package: str = "absorbed",
214
338
  "certify": cert,
215
339
  "applied": apply,
216
340
  "on_conflict": on_conflict,
341
+ "scaffold_files_written": scaffold_written,
217
342
  }
218
343
  if apply:
219
344
  ManifestStore(output).save("assimilate", report)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atomadic-forge
3
- Version: 0.58.0
3
+ Version: 0.59.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
@@ -347,6 +347,7 @@ tests/test_capability_scout.py
347
347
  tests/test_card_renderer.py
348
348
  tests/test_certify_operational_axis.py
349
349
  tests/test_chat.py
350
+ tests/test_cherry_pick.py
350
351
  tests/test_classify_tier.py
351
352
  tests/test_classify_tier_ast_signals.py
352
353
  tests/test_cli_smoke.py
@@ -374,6 +375,7 @@ tests/test_error_codes.py
374
375
  tests/test_error_hints.py
375
376
  tests/test_evolve_js.py
376
377
  tests/test_exported_api_check.py
378
+ tests/test_finalize_scaffold.py
377
379
  tests/test_forge_action.py
378
380
  tests/test_forge_auth_a1.py
379
381
  tests/test_forge_auth_a2.py
@@ -0,0 +1,68 @@
1
+ """Tests for cherry_pick.select_items — including non-tier dir filter (GAP-004)."""
2
+
3
+ from atomadic_forge.a1_at_functions.cherry_pick import select_items
4
+
5
+
6
+ def _scout(symbols: list[dict]) -> dict:
7
+ return {
8
+ "schema_version": "atomadic-forge.scout/v1",
9
+ "repo": "/seed/foo",
10
+ "symbols": symbols,
11
+ }
12
+
13
+
14
+ def _sym(qual: str, file: str, *, tier: str = "a1_at_functions",
15
+ name: str | None = None) -> dict:
16
+ return {
17
+ "qualname": qual,
18
+ "name": name or qual.split(".")[-1],
19
+ "file": file,
20
+ "tier_guess": tier,
21
+ "complexity": 100,
22
+ "has_self_assign": False,
23
+ "effects": ["pure"],
24
+ }
25
+
26
+
27
+ def test_pick_all_excludes_test_files_by_default():
28
+ """GAP-004: test files must not be promoted into the absorbed package."""
29
+ scout = _scout([
30
+ _sym("real.helper", "src/foo/helper.py"),
31
+ _sym("test_thing.MockProvider.load",
32
+ "tests/test_thing.py"),
33
+ _sym("benchmarks.bench_run", "benchmarks/bench_run.py"),
34
+ _sym("examples.demo", "examples/demo.py"),
35
+ ])
36
+ result = select_items(scout, pick_all=True)
37
+ quals = [it["qualname"] for it in result["items"]]
38
+ assert quals == ["real.helper"]
39
+
40
+
41
+ def test_pick_all_can_opt_in_to_test_dirs():
42
+ """include_non_tier_dirs=True restores prior behavior for explicit users."""
43
+ scout = _scout([
44
+ _sym("real.helper", "src/foo/helper.py"),
45
+ _sym("test_thing.MockProvider.load", "tests/test_thing.py"),
46
+ ])
47
+ result = select_items(scout, pick_all=True, include_non_tier_dirs=True)
48
+ quals = sorted(it["qualname"] for it in result["items"])
49
+ assert quals == ["real.helper", "test_thing.MockProvider.load"]
50
+
51
+
52
+ def test_explicit_names_still_filter_non_tier():
53
+ """Asking for a qualname under tests/ by name also defaults to skip."""
54
+ scout = _scout([
55
+ _sym("test_thing.MockProvider.load", "tests/test_thing.py"),
56
+ ])
57
+ result = select_items(
58
+ scout, names=["test_thing.MockProvider.load"], pick_all=False)
59
+ assert result["items"] == []
60
+
61
+
62
+ def test_windows_style_path_separator_recognized():
63
+ """Path classification works regardless of slash flavor."""
64
+ scout = _scout([
65
+ _sym("test_thing.X", r"tests\unit\test_thing.py"),
66
+ ])
67
+ result = select_items(scout, pick_all=True)
68
+ assert result["items"] == []