atomadic-forge 0.6.0__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.6.0 → atomadic_forge-0.6.1}/.github/actions/forge-action/README.md +130 -130
  2. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/.github/actions/forge-action/action.yml +227 -227
  3. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/.github/workflows/ci.yml +96 -96
  4. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/.github/workflows/customer-refactor.yml +302 -302
  5. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/.github/workflows/forge-self-certify.yml +54 -54
  6. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/.github/workflows/forge-studio-ci.yml +59 -59
  7. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/.github/workflows/release.yml +55 -55
  8. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/ARCHITECTURE.md +147 -136
  9. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/PKG-INFO +510 -517
  10. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/README.md +478 -485
  11. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/01-getting-started.md +232 -232
  12. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/02-commands.md +670 -670
  13. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/03-tutorial.md +328 -328
  14. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/05-faq.md +472 -472
  15. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/AGENTS_GUIDE.md +486 -486
  16. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/AIR_GAPPED.md +161 -161
  17. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/CI_CD.md +192 -192
  18. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/CODEX_WALKTHROUGH.md +124 -124
  19. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/COMMANDS.md +794 -793
  20. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/FIRST_10_MINUTES.md +200 -200
  21. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/FORMALIZATION.md +197 -197
  22. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/LANDSCAPE.md +111 -111
  23. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/MULTI_REPO.md +202 -202
  24. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/README.md +138 -138
  25. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/RECEIPT.md +305 -305
  26. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/ROADMAP.md +112 -111
  27. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/SHOWCASE.md +241 -241
  28. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/SIDECAR.md +139 -139
  29. atomadic_forge-0.6.1/docs/STUDIO.md +34 -0
  30. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/WHY_NOW.md +119 -119
  31. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/commands/INDEX.md +18 -18
  32. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/commands/chat.md +9 -9
  33. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/commands/commandsmith.md +9 -9
  34. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/commands/config.md +9 -9
  35. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/commands/demo.md +9 -9
  36. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/commands/emergent-then-synergy.md +9 -9
  37. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/commands/emergent.md +9 -9
  38. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/commands/evolve-then-iterate.md +9 -9
  39. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/commands/evolve.md +9 -9
  40. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/commands/feature-then-emergent.md +9 -9
  41. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/commands/iterate.md +9 -9
  42. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/commands/synergy-then-emergent.md +9 -9
  43. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/commands/synergy.md +9 -9
  44. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/compliance/CMMC_AI_MAPPING.md +157 -157
  45. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/compliance/CS-1.md +203 -203
  46. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +145 -145
  47. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/compliance/FDA_PCCP_MAPPING.md +138 -138
  48. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/compliance/SR_11-7_MAPPING.md +104 -104
  49. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/tutorials/01-quickstart.md +91 -91
  50. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/tutorials/03-the-five-tier-law.md +133 -133
  51. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/tutorials/05-multi-repo-absorb.md +155 -155
  52. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/tutorials/06-javascript-quickstart.md +242 -242
  53. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/pyproject.toml +90 -90
  54. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/setup.cfg +4 -4
  55. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/__init__.py +12 -12
  56. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +120 -120
  57. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/auth_constants.py +132 -132
  58. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/error_codes.py +296 -296
  59. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +154 -154
  60. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/policy_schema.py +48 -48
  61. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +311 -311
  62. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/roi_constants.py +96 -96
  63. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +81 -81
  64. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +166 -166
  65. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/agent_memory.py +139 -139
  66. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +325 -325
  67. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/agent_summary.py +277 -277
  68. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/card_renderer.py +210 -210
  69. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/chat_context.py +170 -170
  70. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/code_signature.py +197 -197
  71. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +94 -94
  72. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/compliance_checker.py +228 -228
  73. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +588 -588
  74. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/enforce_planner.py +208 -208
  75. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/error_hints.py +105 -105
  76. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/exported_api_check.py +188 -188
  77. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/forge_auth.py +217 -217
  78. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/intent_similarity.py +113 -113
  79. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/js_parser.py +539 -539
  80. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/lineage_chain.py +144 -144
  81. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/lineage_reader.py +107 -107
  82. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/llm_client.py +555 -555
  83. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/local_signer.py +134 -134
  84. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +379 -379
  85. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/manifest_diff.py +314 -314
  86. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +1234 -1234
  87. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/patch_scorer.py +272 -272
  88. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/plan_adapter.py +75 -75
  89. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/policy_loader.py +107 -107
  90. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/preflight_change.py +241 -241
  91. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/progress_reporter.py +81 -81
  92. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +291 -291
  93. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/repo_explainer.py +124 -124
  94. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +95 -95
  95. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/roi_calculator.py +264 -264
  96. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/rollback_planner.py +147 -147
  97. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +155 -155
  98. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/scout_walk.py +309 -309
  99. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +161 -161
  100. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +202 -202
  101. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/test_runner.py +194 -194
  102. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/test_selector.py +147 -147
  103. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/tool_composer.py +135 -135
  104. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +221 -221
  105. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/validation_commands.py +183 -183
  106. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/wire_check.py +260 -260
  107. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +266 -266
  108. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +69 -69
  109. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +251 -251
  110. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +307 -307
  111. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +122 -122
  112. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a2_mo_composites/plan_store.py +164 -164
  113. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +231 -231
  114. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +228 -228
  115. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +267 -267
  116. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/dedup_engine.py +220 -220
  117. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +3 -3
  118. {atomadic_forge-0.6.0 → 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
  119. {atomadic_forge-0.6.0 → 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
  120. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +10 -10
  121. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +18 -18
  122. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/demo_runner.py +489 -489
  123. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/emergent_feature.py +95 -95
  124. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/forge_enforce.py +107 -107
  125. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/forge_loop.py +528 -528
  126. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/forge_pipeline.py +295 -295
  127. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +222 -222
  128. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/lsp_server.py +98 -98
  129. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/mcp_server.py +356 -356
  130. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/synergy_feature.py +65 -65
  131. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a4_sy_orchestration/cli.py +1378 -1378
  132. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +234 -234
  133. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +159 -159
  134. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/_registry.py +36 -36
  135. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/audit.py +142 -142
  136. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/commandsmith.py +176 -176
  137. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/demo.py +82 -82
  138. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/iterate.py +140 -140
  139. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge.egg-info/PKG-INFO +510 -517
  140. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge.egg-info/SOURCES.txt +0 -2
  141. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_agent_hire_protocol.py +99 -99
  142. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_agent_plan.py +282 -282
  143. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_agent_summary.py +329 -329
  144. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_audit_verb.py +169 -169
  145. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_card_renderer.py +200 -200
  146. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_chat.py +46 -46
  147. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_cli_smoke.py +199 -199
  148. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_codex_5_complete.py +448 -448
  149. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_codex_6_enforce_polyglot.py +202 -202
  150. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_compiler_feedback.py +203 -203
  151. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_compliance_checker.py +245 -245
  152. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_copilots_copilot.py +395 -395
  153. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_cost_circuit_breaker.py +95 -95
  154. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_cs1_renderer.py +368 -368
  155. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_dedup_engine.py +155 -155
  156. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_error_codes.py +241 -241
  157. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_error_hints.py +127 -127
  158. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_exported_api_check.py +150 -150
  159. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_forge_action.py +259 -259
  160. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_forge_auth_a1.py +228 -228
  161. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_forge_auth_a2.py +376 -376
  162. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_forge_enforce.py +266 -266
  163. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_hierarchical_memory.py +90 -90
  164. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_ignore_and_docs.py +270 -270
  165. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_js_certify.py +76 -76
  166. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_js_parser.py +152 -152
  167. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_js_recon.py +101 -101
  168. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_js_wire.py +94 -94
  169. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_lineage_chain.py +255 -255
  170. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_local_signer.py +185 -185
  171. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_lsp_protocol.py +302 -302
  172. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_manifest_diff.py +201 -201
  173. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_mcp_protocol.py +397 -397
  174. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_plan_apply.py +378 -378
  175. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_pre_audit_smoke.py +235 -235
  176. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_precommit_hooks.py +175 -175
  177. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_progress_reporter.py +103 -103
  178. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_receipt_emitter.py +222 -222
  179. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_receipt_schema.py +206 -206
  180. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_receipt_signer.py +217 -217
  181. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_roi_calculator.py +243 -243
  182. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_sbom_emitter.py +141 -141
  183. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_scaffold.py +111 -111
  184. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_sidecar.py +188 -188
  185. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_sidecar_validate.py +196 -196
  186. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_stub_detector.py +163 -163
  187. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_trust_gate_response.py +108 -108
  188. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_whoami_cmd.py +126 -126
  189. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_wire_certify.py +56 -56
  190. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_wire_suggest_repairs.py +145 -145
  191. atomadic_forge-0.6.0/docs/STUDIO.md +0 -69
  192. atomadic_forge-0.6.0/tests/test_badge_worker.py +0 -143
  193. atomadic_forge-0.6.0/tests/test_vscode_extension_manifest.py +0 -138
  194. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  195. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  196. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  197. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/.github/dependabot.yml +0 -0
  198. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/.github/pull_request_template.md +0 -0
  199. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/CHANGELOG.md +0 -0
  200. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/CONTRIBUTING.md +0 -0
  201. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/LICENSE +0 -0
  202. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/MANIFEST.in +0 -0
  203. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/SECURITY.md +0 -0
  204. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/assets/Atomadic-Forge-01.png +0 -0
  205. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/04-llm-loops.md +0 -0
  206. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/MARKET_POSITIONING.md +0 -0
  207. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/RELEASE_CHECKLIST.md +0 -0
  208. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/RELEASE_MESSAGING.md +0 -0
  209. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/tutorials/02-your-first-package.md +0 -0
  210. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/docs/tutorials/04-plug-in-llms.md +0 -0
  211. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/__main__.py +0 -0
  212. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
  213. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
  214. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
  215. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
  216. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
  217. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
  218. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
  219. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
  220. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
  221. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
  222. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
  223. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/certify_checks.py +0 -0
  224. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
  225. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
  226. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
  227. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
  228. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
  229. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
  230. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
  231. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
  232. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
  233. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
  234. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
  235. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
  236. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
  237. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
  238. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
  239. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
  240. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
  241. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
  242. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
  243. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
  244. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
  245. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
  246. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
  247. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
  248. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
  249. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
  250. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
  251. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
  252. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
  253. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
  254. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
  255. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
  256. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
  257. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
  258. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
  259. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/__init__.py +0 -0
  260. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/chat.py +0 -0
  261. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/config_cmd.py +0 -0
  262. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/emergent.py +0 -0
  263. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
  264. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/evolve.py +0 -0
  265. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
  266. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
  267. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/synergy.py +0 -0
  268. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
  269. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
  270. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
  271. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge.egg-info/requires.txt +0 -0
  272. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/src/atomadic_forge.egg-info/top_level.txt +0 -0
  273. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_aaaa_nexus_client.py +0 -0
  274. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_body_extractor_repairs.py +0 -0
  275. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_certify_operational_axis.py +0 -0
  276. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_classify_tier.py +0 -0
  277. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_commandsmith.py +0 -0
  278. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_config.py +0 -0
  279. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_demo.py +0 -0
  280. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_emergent_compose.py +0 -0
  281. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_emergent_signature_extract.py +0 -0
  282. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_evolve_js.py +0 -0
  283. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_generation_quality.py +0 -0
  284. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_import_smoke.py +0 -0
  285. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_iterate_evolve.py +0 -0
  286. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_ling_provider.py +0 -0
  287. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_ollama_client.py +0 -0
  288. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_pipeline.py +0 -0
  289. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_stagnation.py +0 -0
  290. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_synergy.py +0 -0
  291. {atomadic_forge-0.6.0 → atomadic_forge-0.6.1}/tests/test_test_runner.py +0 -0
  292. {atomadic_forge-0.6.0 → 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`.