atomadic-forge 0.5.3__tar.gz → 0.6.1__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 (292) hide show
  1. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/.github/actions/forge-action/README.md +130 -130
  2. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/.github/actions/forge-action/action.yml +227 -227
  3. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/.github/workflows/ci.yml +96 -96
  4. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/.github/workflows/customer-refactor.yml +302 -302
  5. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/.github/workflows/forge-self-certify.yml +54 -54
  6. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/.github/workflows/forge-studio-ci.yml +59 -59
  7. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/.github/workflows/release.yml +55 -55
  8. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/ARCHITECTURE.md +147 -136
  9. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/CHANGELOG.md +95 -0
  10. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/PKG-INFO +510 -510
  11. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/README.md +478 -478
  12. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/01-getting-started.md +232 -232
  13. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/02-commands.md +670 -670
  14. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/03-tutorial.md +328 -328
  15. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/05-faq.md +472 -472
  16. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/AGENTS_GUIDE.md +486 -486
  17. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/AIR_GAPPED.md +161 -161
  18. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/CI_CD.md +192 -192
  19. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/CODEX_WALKTHROUGH.md +124 -124
  20. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/COMMANDS.md +794 -793
  21. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/FIRST_10_MINUTES.md +200 -200
  22. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/FORMALIZATION.md +197 -197
  23. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/LANDSCAPE.md +111 -111
  24. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/MULTI_REPO.md +202 -202
  25. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/README.md +138 -138
  26. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/RECEIPT.md +305 -305
  27. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/ROADMAP.md +112 -111
  28. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/SHOWCASE.md +241 -241
  29. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/SIDECAR.md +139 -139
  30. atomadic_forge-0.6.1/docs/STUDIO.md +34 -0
  31. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/WHY_NOW.md +119 -119
  32. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/commands/INDEX.md +18 -18
  33. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/commands/chat.md +9 -9
  34. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/commands/commandsmith.md +9 -9
  35. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/commands/config.md +9 -9
  36. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/commands/demo.md +9 -9
  37. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/commands/emergent-then-synergy.md +9 -9
  38. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/commands/emergent.md +9 -9
  39. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/commands/evolve-then-iterate.md +9 -9
  40. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/commands/evolve.md +9 -9
  41. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/commands/feature-then-emergent.md +9 -9
  42. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/commands/iterate.md +9 -9
  43. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/commands/synergy-then-emergent.md +9 -9
  44. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/commands/synergy.md +9 -9
  45. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/compliance/CMMC_AI_MAPPING.md +157 -157
  46. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/compliance/CS-1.md +203 -203
  47. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +145 -145
  48. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/compliance/FDA_PCCP_MAPPING.md +138 -138
  49. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/compliance/SR_11-7_MAPPING.md +104 -104
  50. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/tutorials/01-quickstart.md +91 -91
  51. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/tutorials/03-the-five-tier-law.md +133 -133
  52. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/tutorials/05-multi-repo-absorb.md +155 -155
  53. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/tutorials/06-javascript-quickstart.md +242 -242
  54. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/pyproject.toml +90 -90
  55. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/setup.cfg +4 -4
  56. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/__init__.py +12 -12
  57. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +120 -120
  58. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/auth_constants.py +132 -133
  59. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/error_codes.py +296 -296
  60. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +154 -154
  61. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/policy_schema.py +48 -48
  62. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +311 -311
  63. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/roi_constants.py +96 -96
  64. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +81 -81
  65. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +166 -166
  66. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/agent_memory.py +139 -139
  67. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +325 -324
  68. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/agent_summary.py +277 -277
  69. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/card_renderer.py +210 -210
  70. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/certify_checks.py +73 -3
  71. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/chat_context.py +170 -170
  72. atomadic_forge-0.6.1/src/atomadic_forge/a1_at_functions/code_signature.py +197 -0
  73. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +94 -94
  74. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/compliance_checker.py +228 -228
  75. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +588 -588
  76. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/enforce_planner.py +208 -208
  77. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/error_hints.py +105 -105
  78. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/exported_api_check.py +188 -188
  79. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/forge_auth.py +217 -217
  80. atomadic_forge-0.6.1/src/atomadic_forge/a1_at_functions/intent_similarity.py +113 -0
  81. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/js_parser.py +539 -539
  82. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/lineage_chain.py +144 -144
  83. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/lineage_reader.py +107 -107
  84. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/llm_client.py +555 -554
  85. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/local_signer.py +134 -134
  86. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +379 -379
  87. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/manifest_diff.py +314 -314
  88. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +1234 -1230
  89. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/patch_scorer.py +272 -272
  90. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/plan_adapter.py +75 -75
  91. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/policy_loader.py +107 -107
  92. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/preflight_change.py +241 -241
  93. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/progress_reporter.py +81 -81
  94. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/provider_resolver.py +3 -1
  95. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +291 -291
  96. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/recipes.py +67 -0
  97. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/repo_explainer.py +124 -124
  98. atomadic_forge-0.6.1/src/atomadic_forge/a1_at_functions/research_note_distiller.py +95 -0
  99. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/roi_calculator.py +264 -264
  100. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/rollback_planner.py +147 -147
  101. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +155 -155
  102. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/scout_walk.py +309 -309
  103. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +161 -161
  104. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +202 -202
  105. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/test_runner.py +194 -196
  106. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/test_selector.py +147 -147
  107. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/tool_composer.py +135 -135
  108. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +221 -221
  109. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/validation_commands.py +183 -183
  110. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/wire_check.py +260 -260
  111. atomadic_forge-0.6.1/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +266 -0
  112. atomadic_forge-0.6.1/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +69 -0
  113. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +251 -252
  114. atomadic_forge-0.6.1/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +307 -0
  115. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +122 -122
  116. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a2_mo_composites/plan_store.py +164 -164
  117. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +231 -231
  118. atomadic_forge-0.6.1/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +228 -0
  119. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +267 -267
  120. atomadic_forge-0.6.1/src/atomadic_forge/a3_og_features/dedup_engine.py +220 -0
  121. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +3 -3
  122. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a0_qk_constants/__init__.py +4 -4
  123. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a1_at_functions/__init__.py +14 -14
  124. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +10 -10
  125. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +18 -18
  126. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/demo_runner.py +489 -489
  127. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/emergent_feature.py +95 -95
  128. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/forge_enforce.py +107 -107
  129. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/forge_loop.py +528 -528
  130. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/forge_pipeline.py +295 -295
  131. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +222 -222
  132. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/lsp_server.py +98 -98
  133. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/mcp_server.py +356 -356
  134. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/synergy_feature.py +65 -65
  135. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a4_sy_orchestration/cli.py +1378 -1378
  136. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +234 -234
  137. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +159 -159
  138. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/_registry.py +36 -36
  139. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/audit.py +142 -142
  140. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/commandsmith.py +176 -176
  141. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/demo.py +82 -82
  142. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/iterate.py +140 -140
  143. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge.egg-info/PKG-INFO +510 -510
  144. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge.egg-info/SOURCES.txt +13 -2
  145. atomadic_forge-0.6.1/tests/test_agent_hire_protocol.py +99 -0
  146. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_agent_plan.py +282 -282
  147. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_agent_summary.py +329 -329
  148. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_audit_verb.py +169 -169
  149. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_card_renderer.py +200 -200
  150. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_chat.py +46 -46
  151. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_cli_smoke.py +199 -199
  152. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_codex_5_complete.py +448 -448
  153. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_codex_6_enforce_polyglot.py +202 -202
  154. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_compiler_feedback.py +203 -203
  155. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_compliance_checker.py +245 -245
  156. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_copilots_copilot.py +395 -395
  157. atomadic_forge-0.6.1/tests/test_cost_circuit_breaker.py +95 -0
  158. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_cs1_renderer.py +368 -368
  159. atomadic_forge-0.6.1/tests/test_dedup_engine.py +155 -0
  160. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_error_codes.py +241 -241
  161. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_error_hints.py +127 -127
  162. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_exported_api_check.py +150 -146
  163. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_forge_action.py +259 -259
  164. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_forge_auth_a1.py +228 -229
  165. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_forge_auth_a2.py +376 -377
  166. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_forge_enforce.py +266 -266
  167. atomadic_forge-0.6.1/tests/test_hierarchical_memory.py +90 -0
  168. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_ignore_and_docs.py +270 -270
  169. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_js_certify.py +76 -76
  170. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_js_parser.py +152 -152
  171. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_js_recon.py +101 -101
  172. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_js_wire.py +94 -94
  173. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_lineage_chain.py +255 -255
  174. atomadic_forge-0.6.1/tests/test_ling_provider.py +36 -0
  175. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_local_signer.py +185 -185
  176. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_lsp_protocol.py +302 -302
  177. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_manifest_diff.py +201 -201
  178. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_mcp_protocol.py +397 -397
  179. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_plan_apply.py +378 -378
  180. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_pre_audit_smoke.py +235 -235
  181. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_precommit_hooks.py +175 -175
  182. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_progress_reporter.py +103 -103
  183. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_receipt_emitter.py +222 -222
  184. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_receipt_schema.py +206 -206
  185. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_receipt_signer.py +217 -217
  186. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_roi_calculator.py +243 -243
  187. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_sbom_emitter.py +141 -141
  188. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_scaffold.py +111 -111
  189. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_sidecar.py +188 -188
  190. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_sidecar_validate.py +196 -196
  191. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_stub_detector.py +163 -163
  192. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_trust_gate_response.py +108 -106
  193. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_whoami_cmd.py +126 -126
  194. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_wire_certify.py +56 -56
  195. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_wire_suggest_repairs.py +145 -145
  196. atomadic_forge-0.5.3/docs/STUDIO.md +0 -69
  197. atomadic_forge-0.5.3/tests/test_badge_worker.py +0 -143
  198. atomadic_forge-0.5.3/tests/test_vscode_extension_manifest.py +0 -138
  199. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  200. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  201. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  202. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/.github/dependabot.yml +0 -0
  203. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/.github/pull_request_template.md +0 -0
  204. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/CONTRIBUTING.md +0 -0
  205. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/LICENSE +0 -0
  206. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/MANIFEST.in +0 -0
  207. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/SECURITY.md +0 -0
  208. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/assets/Atomadic-Forge-01.png +0 -0
  209. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/04-llm-loops.md +0 -0
  210. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/MARKET_POSITIONING.md +0 -0
  211. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/RELEASE_CHECKLIST.md +0 -0
  212. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/RELEASE_MESSAGING.md +0 -0
  213. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/tutorials/02-your-first-package.md +0 -0
  214. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/docs/tutorials/04-plug-in-llms.md +0 -0
  215. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/__main__.py +0 -0
  216. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
  217. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
  218. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
  219. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
  220. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
  221. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
  222. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
  223. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
  224. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
  225. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
  226. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
  227. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
  228. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
  229. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
  230. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
  231. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
  232. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
  233. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
  234. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
  235. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
  236. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
  237. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
  238. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
  239. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
  240. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
  241. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
  242. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
  243. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
  244. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
  245. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
  246. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
  247. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
  248. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
  249. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
  250. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
  251. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
  252. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
  253. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
  254. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
  255. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
  256. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
  257. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
  258. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
  259. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
  260. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/__init__.py +0 -0
  261. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/chat.py +0 -0
  262. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/config_cmd.py +0 -0
  263. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/emergent.py +0 -0
  264. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
  265. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/evolve.py +0 -0
  266. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
  267. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
  268. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/synergy.py +0 -0
  269. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
  270. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
  271. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
  272. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge.egg-info/requires.txt +0 -0
  273. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/src/atomadic_forge.egg-info/top_level.txt +0 -0
  274. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_aaaa_nexus_client.py +0 -0
  275. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_body_extractor_repairs.py +0 -0
  276. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_certify_operational_axis.py +0 -0
  277. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_classify_tier.py +0 -0
  278. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_commandsmith.py +0 -0
  279. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_config.py +0 -0
  280. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_demo.py +0 -0
  281. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_emergent_compose.py +0 -0
  282. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_emergent_signature_extract.py +0 -0
  283. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_evolve_js.py +0 -0
  284. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_generation_quality.py +0 -0
  285. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_import_smoke.py +0 -0
  286. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_iterate_evolve.py +0 -0
  287. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_ollama_client.py +0 -0
  288. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_pipeline.py +0 -0
  289. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_stagnation.py +0 -0
  290. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_synergy.py +0 -0
  291. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_test_runner.py +0 -0
  292. {atomadic_forge-0.5.3 → atomadic_forge-0.6.1}/tests/test_tier_init_rebuild.py +0 -0
@@ -1,130 +1,130 @@
1
- # forge-action
2
-
3
- [![Atomadic Forge](https://img.shields.io/badge/atomadic-forge-purple)](https://github.com/atomadictech/atomadic-forge)
4
-
5
- A GitHub Action that runs **`forge wire` + `forge certify`** on a
6
- tier-organized package and posts a **sticky PR comment** with the
7
- rendered Receipt card. Composite action — no Docker, no extra runtime.
8
-
9
- This is the Lane C W1 deliverable from the Atomadic Forge Golden Path.
10
- Eventually moves to its own repo (`atomadictech/forge-action`); today
11
- it ships in-tree under `.github/actions/forge-action/` so the action's
12
- ref tracks the Forge release that emitted it.
13
-
14
- ---
15
-
16
- ## One-line install
17
-
18
- In a consuming repo, add `.github/workflows/forge.yml`:
19
-
20
- ```yaml
21
- name: Atomadic Forge — architecture gate
22
- on:
23
- pull_request:
24
- push:
25
- branches: [main]
26
-
27
- permissions:
28
- contents: read
29
- pull-requests: write # required to post the sticky comment
30
-
31
- jobs:
32
- forge:
33
- runs-on: ubuntu-latest
34
- steps:
35
- - uses: actions/checkout@v4
36
- - uses: atomadictech/atomadic-forge/.github/actions/forge-action@main
37
- with:
38
- package_root: src/your_package
39
- package_name: your_package
40
- fail_under: '75'
41
- ```
42
-
43
- That's it. The action will:
44
-
45
- 1. Install Forge from the same ref the action checked out at.
46
- 2. Run `forge wire <package_root> --fail-on-violations --json` —
47
- exits 1 on any upward-import violation.
48
- 3. Run `forge certify . --fail-under <N> --emit-receipt
49
- .atomadic-forge/receipt.json --print-card --json` — exits 1 below
50
- the threshold.
51
- 4. Upload `wire.json`, `certify.json`, `receipt.json`, and the
52
- rendered card as a 14-day build artifact.
53
- 5. Post (or update) a single sticky PR comment with the rendered card
54
- and a one-line verdict summary.
55
-
56
- ---
57
-
58
- ## Inputs
59
-
60
- | Name | Required | Default | Notes |
61
- |---|---|---|---|
62
- | `package_root` | yes | – | Tier-organized package path (e.g. `src/your_package`) |
63
- | `project_root` | no | `.` | Project root passed to `forge certify` |
64
- | `package_name` | no | `''` | Forwarded to `forge certify --package` |
65
- | `fail_under` | no | `'75'` | Certify threshold; below this, the job fails |
66
- | `receipt_path` | no | `.atomadic-forge/receipt.json` | Receipt JSON emit path (relative to `project_root`) |
67
- | `python_version` | no | `'3.11'` | Python for the Forge install |
68
- | `forge_ref` | no | (action ref) | Override which `atomadic-forge` ref to install |
69
- | `comment_on_pr` | no | `'true'` | Set to `'false'` to skip the sticky comment |
70
- | `upload_artifacts` | no | `'true'` | Set to `'false'` to skip the artifact upload |
71
-
72
- ## Outputs
73
-
74
- | Name | Type | Notes |
75
- |---|---|---|
76
- | `certify_score` | string | The certify score (0–100) as text |
77
- | `wire_verdict` | string | `PASS` or `FAIL` |
78
- | `receipt_path` | string | Echoes back the input `receipt_path` |
79
-
80
- ---
81
-
82
- ## Soft-fail discipline
83
-
84
- - **Wire and certify gates fail the job by themselves.** The
85
- `--fail-on-violations` and `--fail-under` flags are native (shipped
86
- in 0.2.x); no `python -c` workarounds.
87
- - **The PR comment is best-effort.** When the workflow runs from a
88
- fork or without `pull-requests: write`, the comment step is skipped
89
- and the job still reports its real verdict via exit code.
90
- - **The Receipt is signable.** When `AAAA_NEXUS_API_KEY` is available
91
- in the environment and the consuming workflow re-invokes `forge
92
- certify --sign`, the Receipt's `signatures.aaaa_nexus` field is
93
- populated. `forge-action` does not call `--sign` by default — most
94
- CI runs are unsigned dev attestations.
95
-
96
- ---
97
-
98
- ## What the sticky comment looks like
99
-
100
- ```
101
- ### Atomadic Forge — wire + certify
102
-
103
- **wire:** `PASS` · **certify:** `100.0/100`
104
-
105
- ╔══════════════════════════════════════════════════════════╗
106
- │ Atomadic Forge Receipt atomadic-forge.receipt/v1 │
107
- │ ✓ PASS forge 0.2.2 │
108
- │ atomadic-forge │
109
- │ CERTIFY 100.0 / 100 │
110
- │ docs ✓ tests ✓ layout ✓ wire ✓ │
111
- │ WIRE PASS (0 violations) │
112
- │ SCOUT 952 symbols (python) 952 tier-placed │
113
- ╚══════════════════════════════════════════════════════════╝
114
-
115
- Posted by forge-action. The card and JSON receipt are also uploaded
116
- as build artifacts on this run.
117
- ```
118
-
119
- Updated in place on every push — never spams the PR.
120
-
121
- ---
122
-
123
- ## Status
124
-
125
- - **Today (Lane C W1):** in-tree under `.github/actions/forge-action/`,
126
- ref-pinned to the consuming Forge release.
127
- - **Lane C W12 (planned):** dedicated repo `atomadictech/forge-action`
128
- + Marketplace listing.
129
- - **Lane C W16+ (planned):** GitHub App variant that opens weekly
130
- drift-PRs via `forge iterate --dry-run`.
1
+ # forge-action
2
+
3
+ [![Atomadic Forge](https://img.shields.io/badge/atomadic-forge-purple)](https://github.com/atomadictech/atomadic-forge)
4
+
5
+ A GitHub Action that runs **`forge wire` + `forge certify`** on a
6
+ tier-organized package and posts a **sticky PR comment** with the
7
+ rendered Receipt card. Composite action — no Docker, no extra runtime.
8
+
9
+ This is the Lane C W1 deliverable from the Atomadic Forge Golden Path.
10
+ Eventually moves to its own repo (`atomadictech/forge-action`); today
11
+ it ships in-tree under `.github/actions/forge-action/` so the action's
12
+ ref tracks the Forge release that emitted it.
13
+
14
+ ---
15
+
16
+ ## One-line install
17
+
18
+ In a consuming repo, add `.github/workflows/forge.yml`:
19
+
20
+ ```yaml
21
+ name: Atomadic Forge — architecture gate
22
+ on:
23
+ pull_request:
24
+ push:
25
+ branches: [main]
26
+
27
+ permissions:
28
+ contents: read
29
+ pull-requests: write # required to post the sticky comment
30
+
31
+ jobs:
32
+ forge:
33
+ runs-on: ubuntu-latest
34
+ steps:
35
+ - uses: actions/checkout@v4
36
+ - uses: atomadictech/atomadic-forge/.github/actions/forge-action@main
37
+ with:
38
+ package_root: src/your_package
39
+ package_name: your_package
40
+ fail_under: '75'
41
+ ```
42
+
43
+ That's it. The action will:
44
+
45
+ 1. Install Forge from the same ref the action checked out at.
46
+ 2. Run `forge wire <package_root> --fail-on-violations --json` —
47
+ exits 1 on any upward-import violation.
48
+ 3. Run `forge certify . --fail-under <N> --emit-receipt
49
+ .atomadic-forge/receipt.json --print-card --json` — exits 1 below
50
+ the threshold.
51
+ 4. Upload `wire.json`, `certify.json`, `receipt.json`, and the
52
+ rendered card as a 14-day build artifact.
53
+ 5. Post (or update) a single sticky PR comment with the rendered card
54
+ and a one-line verdict summary.
55
+
56
+ ---
57
+
58
+ ## Inputs
59
+
60
+ | Name | Required | Default | Notes |
61
+ |---|---|---|---|
62
+ | `package_root` | yes | – | Tier-organized package path (e.g. `src/your_package`) |
63
+ | `project_root` | no | `.` | Project root passed to `forge certify` |
64
+ | `package_name` | no | `''` | Forwarded to `forge certify --package` |
65
+ | `fail_under` | no | `'75'` | Certify threshold; below this, the job fails |
66
+ | `receipt_path` | no | `.atomadic-forge/receipt.json` | Receipt JSON emit path (relative to `project_root`) |
67
+ | `python_version` | no | `'3.11'` | Python for the Forge install |
68
+ | `forge_ref` | no | (action ref) | Override which `atomadic-forge` ref to install |
69
+ | `comment_on_pr` | no | `'true'` | Set to `'false'` to skip the sticky comment |
70
+ | `upload_artifacts` | no | `'true'` | Set to `'false'` to skip the artifact upload |
71
+
72
+ ## Outputs
73
+
74
+ | Name | Type | Notes |
75
+ |---|---|---|
76
+ | `certify_score` | string | The certify score (0–100) as text |
77
+ | `wire_verdict` | string | `PASS` or `FAIL` |
78
+ | `receipt_path` | string | Echoes back the input `receipt_path` |
79
+
80
+ ---
81
+
82
+ ## Soft-fail discipline
83
+
84
+ - **Wire and certify gates fail the job by themselves.** The
85
+ `--fail-on-violations` and `--fail-under` flags are native (shipped
86
+ in 0.2.x); no `python -c` workarounds.
87
+ - **The PR comment is best-effort.** When the workflow runs from a
88
+ fork or without `pull-requests: write`, the comment step is skipped
89
+ and the job still reports its real verdict via exit code.
90
+ - **The Receipt is signable.** When `AAAA_NEXUS_API_KEY` is available
91
+ in the environment and the consuming workflow re-invokes `forge
92
+ certify --sign`, the Receipt's `signatures.aaaa_nexus` field is
93
+ populated. `forge-action` does not call `--sign` by default — most
94
+ CI runs are unsigned dev attestations.
95
+
96
+ ---
97
+
98
+ ## What the sticky comment looks like
99
+
100
+ ```
101
+ ### Atomadic Forge — wire + certify
102
+
103
+ **wire:** `PASS` · **certify:** `100.0/100`
104
+
105
+ ╔══════════════════════════════════════════════════════════╗
106
+ │ Atomadic Forge Receipt atomadic-forge.receipt/v1 │
107
+ │ ✓ PASS forge 0.2.2 │
108
+ │ atomadic-forge │
109
+ │ CERTIFY 100.0 / 100 │
110
+ │ docs ✓ tests ✓ layout ✓ wire ✓ │
111
+ │ WIRE PASS (0 violations) │
112
+ │ SCOUT 952 symbols (python) 952 tier-placed │
113
+ ╚══════════════════════════════════════════════════════════╝
114
+
115
+ Posted by forge-action. The card and JSON receipt are also uploaded
116
+ as build artifacts on this run.
117
+ ```
118
+
119
+ Updated in place on every push — never spams the PR.
120
+
121
+ ---
122
+
123
+ ## Status
124
+
125
+ - **Today (Lane C W1):** in-tree under `.github/actions/forge-action/`,
126
+ ref-pinned to the consuming Forge release.
127
+ - **Lane C W12 (planned):** dedicated repo `atomadictech/forge-action`
128
+ + Marketplace listing.
129
+ - **Lane C W16+ (planned):** GitHub App variant that opens weekly
130
+ drift-PRs via `forge iterate --dry-run`.