atomadic-forge 0.78.0__tar.gz → 0.80.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.
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/workflows/metrics-auto-regen.yml +1 -1
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/CHANGELOG.md +16 -0
- {atomadic_forge-0.78.0/src/atomadic_forge.egg-info → atomadic_forge-0.80.0}/PKG-INFO +3 -3
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/README.md +2 -2
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/CI_CD.md +3 -3
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/COMMANDS.md +1 -1
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/FORMALIZATION.md +2 -2
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/RECEIPT.md +2 -2
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/pyproject.toml +1 -1
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/doc_auto_update.py +2 -2
- atomadic_forge-0.80.0/src/atomadic_forge/a1_at_functions/ifwc_fuzz.py +158 -0
- atomadic_forge-0.80.0/src/atomadic_forge/a1_at_functions/monadic_laws.py +235 -0
- atomadic_forge-0.80.0/src/atomadic_forge/a3_og_features/recipe_replay.py +158 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a4_sy_orchestration/cli.py +17 -0
- atomadic_forge-0.80.0/src/atomadic_forge/commands/_monadic_laws_shared.py +46 -0
- atomadic_forge-0.80.0/src/atomadic_forge/commands/aiom_check.py +44 -0
- atomadic_forge-0.80.0/src/atomadic_forge/commands/fingerprint.py +39 -0
- atomadic_forge-0.80.0/src/atomadic_forge/commands/fuzz.py +79 -0
- atomadic_forge-0.80.0/src/atomadic_forge/commands/mcb_check.py +44 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/metrics.py +8 -13
- atomadic_forge-0.80.0/src/atomadic_forge/commands/replay.py +101 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0/src/atomadic_forge.egg-info}/PKG-INFO +3 -3
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge.egg-info/SOURCES.txt +12 -0
- atomadic_forge-0.80.0/tests/test_ifwc_fuzz.py +42 -0
- atomadic_forge-0.80.0/tests/test_monadic_laws.py +96 -0
- atomadic_forge-0.80.0/tests/test_recipe_replay.py +88 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/FUNDING.yml +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/actions/forge-action/README.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/actions/forge-action/action.yml +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/dependabot.yml +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/pull_request_template.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/workflows/ci.yml +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/workflows/customer-refactor.yml +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/workflows/forge-self-certify.yml +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/workflows/mcp-registry-publish.yml +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/workflows/metrics-drift.yml +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/workflows/publish-on-tag.yml +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/workflows/release-readiness.yml +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/workflows/release.yml +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/workflows/surface-drift.yml +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/.github/workflows/uptime.yml +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/ARCHITECTURE.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/CONTRIBUTING.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/LICENSE +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/MANIFEST.in +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/SECURITY.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/assets/Atomadic-Forge-01.png +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/01-getting-started.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/02-commands.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/03-tutorial.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/04-llm-loops.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/05-faq.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/AGENTS_GUIDE.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/AIR_GAPPED.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/CODEX_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/FIRST_10_MINUTES.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/HIVE_PRIMITIVES.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/HIVE_STATUS.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/IDE_INTEGRATION.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/LANDSCAPE.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/MARKET_POSITIONING.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/MCP_TOOLS.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/MIGRATION.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/MULTI_REPO.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/PROVIDERS.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/README.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/RELAY_PROTOCOL.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/RELEASE_CHECKLIST.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/RELEASE_MESSAGING.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/ROADMAP.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/SHOWCASE.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/SIDECAR.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/STUDIO.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/TOOL_FACTORY_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/V0.46.0_JUSTIFICATION_REPORT.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/V0.47.0_SELF_TEST_REPORT.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/WHY_NOW.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/WORKER_VS_LOCAL_MCP.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/WORLD_COLLISION.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/INDEX.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/absorb.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/audit.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/chat.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/commandsmith.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/config.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/create.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/demo.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/emergent-swarm.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/emergent-then-synergy.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/emergent.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/enhancement.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/evolve-then-iterate.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/evolve.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/feature-then-emergent.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/guard-install.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/handoff.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/harvest.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/hive.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/iterate.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/materialize.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/metrics.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/recon-swarm.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/relay.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/surface.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/synergy-then-emergent.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/synergy.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/welcome.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/commands/wisdom.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/compliance/CS-1.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/compliance/SR_11-7_MAPPING.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/handoffs/WORKER_AUTO_DEPLOY_2026-05-06.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/tutorials/01-quickstart.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/tutorials/02-your-first-package.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/tutorials/03-the-five-tier-law.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/tutorials/04-plug-in-llms.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/tutorials/05-multi-repo-absorb.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/docs/tutorials/06-javascript-quickstart.md +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/setup.cfg +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/__init__.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/__main__.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/enhancement_proposal_constants.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/handoff_constants.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/hive_constants.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/lifetime_savings_constants.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/materialize_types.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/nexus_constants.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/response_enrichment.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/welcome_constants.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a0_qk_constants/wisdom_constants.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/abstract_method_repair.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/ast_scope_lock.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/call_graph.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/capability_scout.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/certify_checks.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/code_signature.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/cosine_similarity.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/custom_provider_client.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/dead_code_check.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/enhancement_proposal_builder.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/exported_api_check.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/forge_locate.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/forge_metrics.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/git_churn.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/graft_extract.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/handoff_builder.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/harvest_absorb.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/harvest_concept_bridge.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/hive_consensus_math.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/hive_io.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/intent_similarity.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/lifetime_savings.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/maintainability_index.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/polyglot_classify.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/polyglot_imports.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/polyglot_surface.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/repo_public_surface.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/response_enricher.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/scaffold_polyglot.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/scout_walk.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/smell_scan.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/steersman_pack.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/surface_gap_check.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/test_selector.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/validation_commands.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/welcome_narrator.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/wire_check.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/wire_stubs_gen.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/wisdom_capture.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/wisdom_io.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/wisdom_promote.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/wisdom_recall.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a1_at_functions/worktree_status.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/evolve_session_store.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/iterate_session_store.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/nexus_client.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/remote_seed_store.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a2_mo_composites/repo_public_surface_sync.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/absorb_feature.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/cherry_hunter.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/cna_check.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/commit_compose.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/create_feature.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/dedup_engine.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a0_qk_constants/__init__.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a1_at_functions/__init__.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/emergent_swarm.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/enhancement_proposal_feature.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/forge_evolve_session.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/forge_loop_session.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/forge_metrics_feature.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/forge_pipeline.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/graft_feature.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/guard_install.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/handoff_feature.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/hive_sync.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/materialize_feature.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/mcp_server.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/nexus_bridge.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/relay_daemon.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/surface_export.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/tool_factory.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/verify_umbrella.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/welcome_feature.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a3_og_features/wisdom_feature.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/__init__.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/_registry.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/absorb.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/audit.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/chat.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/commandsmith.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/config_cmd.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/create.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/demo.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/emergent.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/emergent_swarm.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/enhancement.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/evolve.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/graft.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/guard_install.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/handoff.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/harvest.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/hive.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/iterate.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/materialize.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/recon_swarm.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/relay.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/surface.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/synergy.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/token_savings.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/welcome.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge/commands/wisdom.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge.egg-info/requires.txt +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/src/atomadic_forge.egg-info/top_level.txt +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_aaaa_nexus_client.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_abstract_method_repair.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_agent_hire_protocol.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_agent_plan.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_agent_plan_pkg_label.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_agent_summary.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_ast_scope_lock.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_audit_verb.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_body_extractor_repairs.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_call_graph_summary.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_capability_scout.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_card_renderer.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_certify_operational_axis.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_chat.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_cherry_dedup_class_methods.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_cherry_pick.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_classify_tier.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_classify_tier_ast_signals.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_cli_smoke.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_cli_swarm_aliases.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_codex_5_complete.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_codex_6_enforce_polyglot.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_commandsmith.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_compiler_feedback.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_compliance_checker.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_config.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_copilots_copilot.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_create_feature.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_cs1_renderer.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_custom_provider.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_dead_code_check.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_dedup_engine.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_demo.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_doc_auto_update.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_emergent_compose.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_emergent_signature_extract.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_emergent_synthesize_imports.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_enhancement_proposal.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_error_codes.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_error_hints.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_evolve_js.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_exported_api_check.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_finalize_scaffold.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_forge_action.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_forge_auth_a1.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_forge_auth_a2.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_forge_enforce.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_generation_quality.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_git_churn.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_graft_feature.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_handoff.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_harvest_concept_bridge.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_harvest_source_warnings.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_hierarchical_memory.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_hive_sync.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_ignore_and_docs.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_import_smoke.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_iterate_evolve.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_js_certify.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_js_parser.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_js_recon.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_js_wire.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_lineage_chain.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_ling_provider.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_local_signer.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_lsp_protocol.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_maintainability_index.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_manifest_diff.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_materialize_feature.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_mcp_lazy_bootstrap.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_mcp_protocol.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_nexus_bridge.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_ollama_client.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_pipeline.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_plan_apply.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_polyglot_cli_mcp.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_polyglot_full_pipeline.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_polyglot_hardening.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_polyglot_swift_kotlin_go.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_polyglot_symbol_parity.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_pre_audit_smoke.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_precommit_hooks.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_progress_reporter.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_receipt_emitter.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_receipt_schema.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_receipt_signer.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_remote_seed_store.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_repo_public_surface.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_response_enricher.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_roi_calculator.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_sbom_cmd_text_summary.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_sbom_emitter.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_scaffold.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_sidecar.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_sidecar_validate.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_smell_score_formula.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_stagnation.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_steersman_pack.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_stub_detector.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_surface_export.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_surface_gap_check.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_synergy.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_test_runner.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_tier_init_rebuild.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_token_savings_ledger.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_trust_gate_response.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_verify_suggested_recipe.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_welcome.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_welcome_enhancements.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_whoami_cmd.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_wire_certify.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_wire_stubs_gen.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_wire_suggest_repairs.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_wire_type_checking.py +0 -0
- {atomadic_forge-0.78.0 → atomadic_forge-0.80.0}/tests/test_wisdom.py +0 -0
|
@@ -33,7 +33,7 @@ jobs:
|
|
|
33
33
|
regen:
|
|
34
34
|
runs-on: ubuntu-latest
|
|
35
35
|
timeout-minutes: 8
|
|
36
|
-
if: ${{ !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, 'chore(metrics): auto-regenerate') }}
|
|
36
|
+
if: ${{ !contains(github.event.head_commit.message || '', '[skip ci]') && !contains(github.event.head_commit.message || '', 'chore(metrics): auto-regenerate') }}
|
|
37
37
|
steps:
|
|
38
38
|
- uses: actions/checkout@v4
|
|
39
39
|
with:
|
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## v0.80.0 — 2026-05-08
|
|
6
|
+
|
|
7
|
+
- feat(forge): v0.80 Monadic Laws — MCB / AHLP / AIOM / IFWC-lite
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
## v0.79.0 — 2026-05-08
|
|
11
|
+
|
|
12
|
+
- feat(forge): replay — deterministic golden-recipe execution
|
|
13
|
+
- fix(compat): replace datetime.UTC with timezone.utc for Python 3.10 compat
|
|
14
|
+
- fix(ci): null-safe head_commit.message in metrics-auto-regen if condition
|
|
15
|
+
- chore(metrics): sync forge_metrics.json after cli_verb_count method change
|
|
16
|
+
- fix(surface): regenerate surface.json with package_version 0.78.0
|
|
17
|
+
- fix(metrics): replace upward a4 import in _live_cli_verb_count with file scan
|
|
18
|
+
- chore(release): sync artifacts + doc anchors for v0.78.0
|
|
19
|
+
|
|
20
|
+
|
|
5
21
|
## v0.78.0 — 2026-05-08
|
|
6
22
|
|
|
7
23
|
- feat(forge): token-savings auto-ledger across every enriched verb
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: atomadic-forge
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.80.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
|
|
@@ -225,8 +225,8 @@ Full tool reference: [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md) | First call: `welco
|
|
|
225
225
|
|
|
226
226
|
| MCP tools | **10 tools · 116 actions** |
|
|
227
227
|
| CLI verbs | **59** |
|
|
228
|
-
| Source files | **
|
|
229
|
-
| Tests | **
|
|
228
|
+
| Source files | **242** (~48K LOC) |
|
|
229
|
+
| Tests | **1608 passing** across **119 test files** |
|
|
230
230
|
| Lean4 formal proofs | **872 theorems** (mathematically verified core logic) |
|
|
231
231
|
| Monadic tiers | **5** (a0 → a4, strict upward-only composition) |
|
|
232
232
|
| Languages | Python, JS/TS, Swift, Kotlin, Go, Rust |
|
|
@@ -193,8 +193,8 @@ Full tool reference: [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md) | First call: `welco
|
|
|
193
193
|
|
|
194
194
|
| MCP tools | **10 tools · 116 actions** |
|
|
195
195
|
| CLI verbs | **59** |
|
|
196
|
-
| Source files | **
|
|
197
|
-
| Tests | **
|
|
196
|
+
| Source files | **242** (~48K LOC) |
|
|
197
|
+
| Tests | **1608 passing** across **119 test files** |
|
|
198
198
|
| Lean4 formal proofs | **872 theorems** (mathematically verified core logic) |
|
|
199
199
|
| Monadic tiers | **5** (a0 → a4, strict upward-only composition) |
|
|
200
200
|
| Languages | Python, JS/TS, Swift, Kotlin, Go, Rust |
|
|
@@ -46,7 +46,7 @@ jobs:
|
|
|
46
46
|
run: |
|
|
47
47
|
pip install atomadic-forge # PyPI (preferred)
|
|
48
48
|
# Or pin to an exact tag:
|
|
49
|
-
# pip install "git+https://github.com/atomadictech/atomadic-forge@v0.
|
|
49
|
+
# pip install "git+https://github.com/atomadictech/atomadic-forge@v0.78.0"
|
|
50
50
|
# Or vendor wheels: pip install --no-index --find-links wheels/ atomadic-forge
|
|
51
51
|
|
|
52
52
|
- name: Wire scan (upward-import discipline)
|
|
@@ -97,7 +97,7 @@ forge-certify:
|
|
|
97
97
|
image: python:3.11-slim
|
|
98
98
|
timeout: 10 minutes
|
|
99
99
|
before_script:
|
|
100
|
-
- pip install "git+https://github.com/atomadictech/atomadic-forge@v0.
|
|
100
|
+
- pip install "git+https://github.com/atomadictech/atomadic-forge@v0.78.0"
|
|
101
101
|
script:
|
|
102
102
|
- forge wire src/your_package --fail-on-violations --json > wire.json
|
|
103
103
|
- forge certify . --package your_package --fail-under 75 --json > certify.json
|
|
@@ -156,7 +156,7 @@ Then in **the consuming repo's** `.pre-commit-config.yaml`:
|
|
|
156
156
|
```yaml
|
|
157
157
|
repos:
|
|
158
158
|
- repo: https://github.com/atomadictech/atomadic-forge
|
|
159
|
-
rev: v0.
|
|
159
|
+
rev: v0.78.0
|
|
160
160
|
hooks:
|
|
161
161
|
- id: forge-wire
|
|
162
162
|
- id: forge-certify
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Atomadic Forge — Command Reference
|
|
2
2
|
|
|
3
|
-
All verbs available in the `forge` CLI as of 0.
|
|
3
|
+
All verbs available in the `forge` CLI as of 0.78.0
|
|
4
4
|
|
|
5
5
|
> For the structured per-verb reference (with options, examples, and
|
|
6
6
|
> output samples), see [02-commands.md](02-commands.md). This page is
|
|
@@ -39,7 +39,7 @@ Forge certify scores out of **100** in two layers:
|
|
|
39
39
|
JS / TS packages cap at **60/100** today: they earn the four
|
|
40
40
|
structural axes, but the +25 runtime-import smoke and +30 behavioural
|
|
41
41
|
pytest are Python-only. Wiring `npm test` / Vitest into the
|
|
42
|
-
behavioural axis is on the post-v0.
|
|
42
|
+
behavioural axis is on the post-v0.78.0 roadmap.
|
|
43
43
|
|
|
44
44
|
---
|
|
45
45
|
|
|
@@ -131,7 +131,7 @@ runtime dependency makes the package unusable.
|
|
|
131
131
|
|
|
132
132
|
**Why JS/TS does not get this gate yet.** AAM §5.4 (Threats to
|
|
133
133
|
Validity) explicitly flags polyglot runtime gating as a roadmap
|
|
134
|
-
item (post-v0.
|
|
134
|
+
item (post-v0.78.0): the equivalent for JS would be an `npm test`
|
|
135
135
|
invocation, which requires a Node toolchain we do not yet bundle.
|
|
136
136
|
|
|
137
137
|
**Citation.** AAM §5.1 (Core Pipeline Pseudocode); AAM §5.4 (Threats
|
|
@@ -30,7 +30,7 @@ referenced from the Receipt.
|
|
|
30
30
|
{
|
|
31
31
|
"schema_version": "atomadic-forge.receipt/v1",
|
|
32
32
|
"generated_at_utc": "2026-04-28T17:42:11Z",
|
|
33
|
-
"forge_version": "0.
|
|
33
|
+
"forge_version": "0.78.0",
|
|
34
34
|
"verdict": "PASS",
|
|
35
35
|
"project": { ... },
|
|
36
36
|
"certify": { ... },
|
|
@@ -108,7 +108,7 @@ cited:
|
|
|
108
108
|
{
|
|
109
109
|
"schema_version": "atomadic-forge.receipt/v1",
|
|
110
110
|
"generated_at_utc": "2026-04-28T17:42:11Z",
|
|
111
|
-
"forge_version": "0.
|
|
111
|
+
"forge_version": "0.78.0",
|
|
112
112
|
"verdict": "PASS",
|
|
113
113
|
|
|
114
114
|
"project": {
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "atomadic-forge"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.80.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"
|
|
@@ -58,7 +58,7 @@ from __future__ import annotations
|
|
|
58
58
|
import json
|
|
59
59
|
import re
|
|
60
60
|
import subprocess
|
|
61
|
-
from datetime import
|
|
61
|
+
from datetime import datetime, timezone
|
|
62
62
|
from pathlib import Path
|
|
63
63
|
from typing import Any
|
|
64
64
|
|
|
@@ -318,7 +318,7 @@ def _build_metrics_table(metrics: dict[str, Any]) -> str:
|
|
|
318
318
|
|
|
319
319
|
def _build_changelog_block(version: str, log_lines: list[str]) -> str:
|
|
320
320
|
"""Generate a CHANGELOG section for the given version."""
|
|
321
|
-
today = datetime.now(
|
|
321
|
+
today = datetime.now(timezone.utc).strftime("%Y-%m-%d")
|
|
322
322
|
items = "\n".join(f"- {line}" for line in log_lines[:20]) if log_lines else "- (see git log)"
|
|
323
323
|
return (
|
|
324
324
|
f"## v{version} — {today}\n\n"
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"""Tier a1 — IFWC-lite property-based fuzzer.
|
|
2
|
+
|
|
3
|
+
Any callable carrying an ``__invariants__`` dict is fair game:
|
|
4
|
+
|
|
5
|
+
def add(a: int, b: int) -> int:
|
|
6
|
+
return a + b
|
|
7
|
+
add.__invariants__ = {
|
|
8
|
+
"args": {"a": "integers", "b": "integers"},
|
|
9
|
+
"post": "lambda r, a, b: r == a + b",
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
``args`` maps parameter name → hypothesis strategy name (or ``"any"``).
|
|
13
|
+
``post`` is a string lambda evaluated with ``(result, **kwargs)``;
|
|
14
|
+
returning False (or raising) ⇒ falsifying example captured.
|
|
15
|
+
|
|
16
|
+
Pure stdlib + ``hypothesis`` (already a Forge dev dep). No I/O.
|
|
17
|
+
"""
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import importlib
|
|
21
|
+
import inspect
|
|
22
|
+
from collections.abc import Callable
|
|
23
|
+
from typing import Any
|
|
24
|
+
|
|
25
|
+
SCHEMA_VERSION_IFWC_V1 = "atomadic-forge.ifwc/v1"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
_STRATEGY_MAP: dict[str, str] = {
|
|
29
|
+
"integers": "integers",
|
|
30
|
+
"floats": "floats",
|
|
31
|
+
"text": "text",
|
|
32
|
+
"booleans": "booleans",
|
|
33
|
+
"none": "none",
|
|
34
|
+
"any": "integers", # default fallback
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _build_strategies(args_spec: dict[str, str]) -> dict[str, Any]:
|
|
39
|
+
"""Translate ``{"a": "integers"}`` → ``{"a": st.integers()}``."""
|
|
40
|
+
try:
|
|
41
|
+
from hypothesis import strategies as st
|
|
42
|
+
except ImportError as exc: # pragma: no cover - dev dep
|
|
43
|
+
raise RuntimeError(
|
|
44
|
+
"hypothesis not installed; `pip install hypothesis`"
|
|
45
|
+
) from exc
|
|
46
|
+
out: dict[str, Any] = {}
|
|
47
|
+
for name, strat_name in args_spec.items():
|
|
48
|
+
key = _STRATEGY_MAP.get(strat_name, "integers")
|
|
49
|
+
out[name] = getattr(st, key)()
|
|
50
|
+
return out
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def fuzz_callable(
|
|
54
|
+
fn: Callable[..., Any],
|
|
55
|
+
*,
|
|
56
|
+
max_examples: int = 100,
|
|
57
|
+
) -> dict[str, Any]:
|
|
58
|
+
"""Run hypothesis against ``fn`` using its ``__invariants__`` spec.
|
|
59
|
+
|
|
60
|
+
Returns ``{verdict, examples_run, falsifying_example|None,
|
|
61
|
+
error|None, function}``.
|
|
62
|
+
"""
|
|
63
|
+
spec = getattr(fn, "__invariants__", None)
|
|
64
|
+
if not spec:
|
|
65
|
+
return {
|
|
66
|
+
"schema_version": SCHEMA_VERSION_IFWC_V1,
|
|
67
|
+
"function": fn.__name__,
|
|
68
|
+
"verdict": "SKIP",
|
|
69
|
+
"reason": "no __invariants__ marker",
|
|
70
|
+
"examples_run": 0,
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
try:
|
|
74
|
+
from hypothesis import given, settings
|
|
75
|
+
except ImportError:
|
|
76
|
+
return {
|
|
77
|
+
"schema_version": SCHEMA_VERSION_IFWC_V1,
|
|
78
|
+
"function": fn.__name__,
|
|
79
|
+
"verdict": "ERROR",
|
|
80
|
+
"reason": "hypothesis not installed",
|
|
81
|
+
"examples_run": 0,
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
args_spec = dict(spec.get("args") or {})
|
|
85
|
+
post = spec.get("post")
|
|
86
|
+
strategies = _build_strategies(args_spec)
|
|
87
|
+
counter = {"n": 0}
|
|
88
|
+
failure = {"example": None, "error": None}
|
|
89
|
+
|
|
90
|
+
@settings(max_examples=int(max_examples), deadline=None)
|
|
91
|
+
@given(**strategies)
|
|
92
|
+
def _runner(**kwargs: Any) -> None:
|
|
93
|
+
counter["n"] += 1
|
|
94
|
+
result = fn(**kwargs)
|
|
95
|
+
if post:
|
|
96
|
+
ok = False
|
|
97
|
+
try:
|
|
98
|
+
check = eval(post) if isinstance(post, str) else post # noqa: S307
|
|
99
|
+
ok = bool(check(result, **kwargs))
|
|
100
|
+
except Exception as exc: # noqa: BLE001
|
|
101
|
+
failure["example"] = kwargs
|
|
102
|
+
failure["error"] = str(exc)
|
|
103
|
+
raise AssertionError(
|
|
104
|
+
f"post-condition raised: {exc}"
|
|
105
|
+
) from exc
|
|
106
|
+
if not ok:
|
|
107
|
+
failure["example"] = kwargs
|
|
108
|
+
raise AssertionError(
|
|
109
|
+
f"post-condition False on {kwargs} -> {result!r}",
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
try:
|
|
113
|
+
_runner()
|
|
114
|
+
except Exception as exc: # noqa: BLE001
|
|
115
|
+
return {
|
|
116
|
+
"schema_version": SCHEMA_VERSION_IFWC_V1,
|
|
117
|
+
"function": fn.__name__,
|
|
118
|
+
"verdict": "FAIL",
|
|
119
|
+
"examples_run": counter["n"],
|
|
120
|
+
"falsifying_example": failure["example"],
|
|
121
|
+
"error": str(exc),
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
"schema_version": SCHEMA_VERSION_IFWC_V1,
|
|
125
|
+
"function": fn.__name__,
|
|
126
|
+
"verdict": "PASS",
|
|
127
|
+
"examples_run": counter["n"],
|
|
128
|
+
"falsifying_example": None,
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def fuzz_module(
|
|
133
|
+
module_name: str,
|
|
134
|
+
*,
|
|
135
|
+
max_examples: int = 100,
|
|
136
|
+
) -> dict[str, Any]:
|
|
137
|
+
"""Import ``module_name`` and fuzz every callable carrying invariants."""
|
|
138
|
+
mod = importlib.import_module(module_name)
|
|
139
|
+
results: list[dict[str, Any]] = []
|
|
140
|
+
for _name, obj in inspect.getmembers(mod):
|
|
141
|
+
if callable(obj) and hasattr(obj, "__invariants__"):
|
|
142
|
+
results.append(fuzz_callable(obj, max_examples=max_examples))
|
|
143
|
+
pass_n = sum(1 for r in results if r["verdict"] == "PASS")
|
|
144
|
+
fail_n = sum(1 for r in results if r["verdict"] == "FAIL")
|
|
145
|
+
return {
|
|
146
|
+
"schema_version": SCHEMA_VERSION_IFWC_V1,
|
|
147
|
+
"module": module_name,
|
|
148
|
+
"function_count": len(results),
|
|
149
|
+
"pass_count": pass_n,
|
|
150
|
+
"fail_count": fail_n,
|
|
151
|
+
"verdict": "PASS" if fail_n == 0 and pass_n > 0 else (
|
|
152
|
+
"FAIL" if fail_n else "EMPTY"
|
|
153
|
+
),
|
|
154
|
+
"results": results,
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
__all__ = ["SCHEMA_VERSION_IFWC_V1", "fuzz_callable", "fuzz_module"]
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
"""Tier a1 — Monadic Laws (v0.80): MCB / AHLP / AIOM checkers.
|
|
2
|
+
|
|
3
|
+
Three pure deterministic AST scanners that surface the v7.0 blueprint
|
|
4
|
+
laws without breaking existing repos:
|
|
5
|
+
|
|
6
|
+
* :func:`scan_mcb` — Monadic Compute Bounding: ban ``while`` and
|
|
7
|
+
recursion in tier-a1 modules.
|
|
8
|
+
* :func:`fingerprint_a1` — AHLP-style SHA-256 of normalized AST
|
|
9
|
+
per a1 module. Tamper-evident receipts foundation.
|
|
10
|
+
* :func:`scan_aiom` — Algebraic I/O Monad enforcer: forbid network /
|
|
11
|
+
process / socket imports from tier-a1 (the pure layer).
|
|
12
|
+
|
|
13
|
+
All three are pure: AST-in, dict-out, no side effects.
|
|
14
|
+
"""
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import ast
|
|
18
|
+
import hashlib
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
from typing import Any
|
|
21
|
+
|
|
22
|
+
SCHEMA_VERSION_MCB_V1 = "atomadic-forge.mcb/v1"
|
|
23
|
+
SCHEMA_VERSION_AHLP_V1 = "atomadic-forge.ahlp.fingerprint/v1"
|
|
24
|
+
SCHEMA_VERSION_AIOM_V1 = "atomadic-forge.aiom/v1"
|
|
25
|
+
|
|
26
|
+
# Modules forbidden in tier-a1 (the pure mathematical layer).
|
|
27
|
+
# Keep this list conservative — anything that talks to the OS,
|
|
28
|
+
# network, or a subprocess. ``pathlib``/``json`` are allowed:
|
|
29
|
+
# they're stdlib data shapers, not effect carriers.
|
|
30
|
+
_AIOM_FORBIDDEN: frozenset[str] = frozenset({
|
|
31
|
+
"requests", "urllib", "urllib3", "httpx", "aiohttp",
|
|
32
|
+
"http", "socket", "smtplib", "ftplib", "telnetlib",
|
|
33
|
+
"subprocess", "multiprocessing",
|
|
34
|
+
"os.system", "os.popen", "shutil.move", # checked via attribute walk
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
_AIOM_FORBIDDEN_PREFIX: tuple[str, ...] = (
|
|
38
|
+
"requests", "urllib", "urllib3", "httpx", "aiohttp",
|
|
39
|
+
"http.", "socket", "smtplib", "ftplib", "telnetlib",
|
|
40
|
+
"subprocess", "multiprocessing.",
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
A1_TIER_DIR = "a1_at_functions"
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
# ── MCB ─────────────────────────────────────────────────────────────
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _scan_one_for_while_recursion(path: Path) -> list[dict[str, Any]]:
|
|
50
|
+
"""Return MCB violations in one file (empty list ⇒ clean)."""
|
|
51
|
+
findings: list[dict[str, Any]] = []
|
|
52
|
+
try:
|
|
53
|
+
tree = ast.parse(path.read_text(encoding="utf-8"))
|
|
54
|
+
except (OSError, SyntaxError):
|
|
55
|
+
return findings
|
|
56
|
+
func_names = {
|
|
57
|
+
n.name for n in ast.walk(tree)
|
|
58
|
+
if isinstance(n, ast.FunctionDef | ast.AsyncFunctionDef)
|
|
59
|
+
}
|
|
60
|
+
for node in ast.walk(tree):
|
|
61
|
+
if isinstance(node, ast.While):
|
|
62
|
+
findings.append({
|
|
63
|
+
"kind": "while_loop",
|
|
64
|
+
"line": node.lineno,
|
|
65
|
+
"detail": "unbounded `while` in pure-tier function",
|
|
66
|
+
})
|
|
67
|
+
elif isinstance(node, ast.Call):
|
|
68
|
+
# Direct recursion: `foo(...)` inside `def foo`.
|
|
69
|
+
f = node.func
|
|
70
|
+
if isinstance(f, ast.Name) and f.id in func_names:
|
|
71
|
+
# Walk up: are we inside a function with the same name?
|
|
72
|
+
# Cheap textual heuristic: only flag when name matches.
|
|
73
|
+
findings.append({
|
|
74
|
+
"kind": "self_call",
|
|
75
|
+
"line": node.lineno,
|
|
76
|
+
"detail": f"possible recursion via `{f.id}(...)`",
|
|
77
|
+
})
|
|
78
|
+
return findings
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def scan_mcb(package_root: Path) -> dict[str, Any]:
|
|
82
|
+
"""Scan ``<package_root>/a1_at_functions/`` for MCB violations.
|
|
83
|
+
|
|
84
|
+
Returns a structured report with verdict PASS / FAIL and the list
|
|
85
|
+
of files + findings. The report is advisory unless the caller
|
|
86
|
+
enforces it (e.g. ``forge wire --strict-mcb``).
|
|
87
|
+
"""
|
|
88
|
+
pkg = Path(package_root)
|
|
89
|
+
a1_dir = pkg / A1_TIER_DIR
|
|
90
|
+
files: list[dict[str, Any]] = []
|
|
91
|
+
if a1_dir.is_dir():
|
|
92
|
+
for f in sorted(a1_dir.glob("*.py")):
|
|
93
|
+
if f.name == "__init__.py":
|
|
94
|
+
continue
|
|
95
|
+
findings = _scan_one_for_while_recursion(f)
|
|
96
|
+
if findings:
|
|
97
|
+
files.append({
|
|
98
|
+
"file": str(f.relative_to(pkg)),
|
|
99
|
+
"findings": findings,
|
|
100
|
+
})
|
|
101
|
+
total = sum(len(it["findings"]) for it in files)
|
|
102
|
+
return {
|
|
103
|
+
"schema_version": SCHEMA_VERSION_MCB_V1,
|
|
104
|
+
"package_root": str(pkg),
|
|
105
|
+
"violation_count": total,
|
|
106
|
+
"files": files,
|
|
107
|
+
"verdict": "PASS" if total == 0 else "FAIL",
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
# ── AHLP fingerprint ────────────────────────────────────────────────
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def _normalized_ast_bytes(path: Path) -> bytes:
|
|
115
|
+
"""Return a stable byte representation of the file's AST.
|
|
116
|
+
|
|
117
|
+
``ast.dump`` with ``annotate_fields=True, include_attributes=False``
|
|
118
|
+
is reproducible across runs and stable to whitespace / comment
|
|
119
|
+
edits — which is exactly what we want for a tamper-evident
|
|
120
|
+
fingerprint of *logic*, not formatting.
|
|
121
|
+
"""
|
|
122
|
+
try:
|
|
123
|
+
tree = ast.parse(path.read_text(encoding="utf-8"))
|
|
124
|
+
except (OSError, SyntaxError):
|
|
125
|
+
return b""
|
|
126
|
+
return ast.dump(tree, annotate_fields=True,
|
|
127
|
+
include_attributes=False).encode("utf-8")
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def fingerprint_a1(package_root: Path) -> dict[str, Any]:
|
|
131
|
+
"""SHA-256 every a1 module's normalized AST.
|
|
132
|
+
|
|
133
|
+
Returns ``{schema_version, package_root, count, fingerprints[]}``.
|
|
134
|
+
Each fingerprint entry: ``{file, sha256, ast_bytes_len}``.
|
|
135
|
+
"""
|
|
136
|
+
pkg = Path(package_root)
|
|
137
|
+
a1_dir = pkg / A1_TIER_DIR
|
|
138
|
+
out: list[dict[str, Any]] = []
|
|
139
|
+
if a1_dir.is_dir():
|
|
140
|
+
for f in sorted(a1_dir.glob("*.py")):
|
|
141
|
+
if f.name == "__init__.py":
|
|
142
|
+
continue
|
|
143
|
+
ast_bytes = _normalized_ast_bytes(f)
|
|
144
|
+
if not ast_bytes:
|
|
145
|
+
continue
|
|
146
|
+
digest = hashlib.sha256(ast_bytes).hexdigest()
|
|
147
|
+
out.append({
|
|
148
|
+
"file": str(f.relative_to(pkg)),
|
|
149
|
+
"sha256": digest,
|
|
150
|
+
"ast_bytes_len": len(ast_bytes),
|
|
151
|
+
})
|
|
152
|
+
return {
|
|
153
|
+
"schema_version": SCHEMA_VERSION_AHLP_V1,
|
|
154
|
+
"package_root": str(pkg),
|
|
155
|
+
"count": len(out),
|
|
156
|
+
"fingerprints": out,
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
# ── AIOM ────────────────────────────────────────────────────────────
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def _scan_one_for_io_imports(path: Path) -> list[dict[str, Any]]:
|
|
164
|
+
findings: list[dict[str, Any]] = []
|
|
165
|
+
try:
|
|
166
|
+
tree = ast.parse(path.read_text(encoding="utf-8"))
|
|
167
|
+
except (OSError, SyntaxError):
|
|
168
|
+
return findings
|
|
169
|
+
for node in ast.walk(tree):
|
|
170
|
+
if isinstance(node, ast.Import):
|
|
171
|
+
for alias in node.names:
|
|
172
|
+
if _is_forbidden(alias.name):
|
|
173
|
+
findings.append({
|
|
174
|
+
"kind": "import",
|
|
175
|
+
"module": alias.name,
|
|
176
|
+
"line": node.lineno,
|
|
177
|
+
})
|
|
178
|
+
elif isinstance(node, ast.ImportFrom):
|
|
179
|
+
mod = node.module or ""
|
|
180
|
+
if _is_forbidden(mod):
|
|
181
|
+
findings.append({
|
|
182
|
+
"kind": "from_import",
|
|
183
|
+
"module": mod,
|
|
184
|
+
"line": node.lineno,
|
|
185
|
+
})
|
|
186
|
+
return findings
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def _is_forbidden(modname: str) -> bool:
|
|
190
|
+
if not modname:
|
|
191
|
+
return False
|
|
192
|
+
if modname in _AIOM_FORBIDDEN:
|
|
193
|
+
return True
|
|
194
|
+
return any(modname == p.rstrip(".") or modname.startswith(p)
|
|
195
|
+
for p in _AIOM_FORBIDDEN_PREFIX)
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def scan_aiom(package_root: Path) -> dict[str, Any]:
|
|
199
|
+
"""Scan ``<package_root>/a1_at_functions/`` for forbidden I/O imports.
|
|
200
|
+
|
|
201
|
+
Pure-tier modules cannot reach the network, processes, sockets, or
|
|
202
|
+
SMTP. The blocklist is conservative — ``pathlib``, ``json``,
|
|
203
|
+
``hashlib`` etc. remain allowed because they're data shapers.
|
|
204
|
+
"""
|
|
205
|
+
pkg = Path(package_root)
|
|
206
|
+
a1_dir = pkg / A1_TIER_DIR
|
|
207
|
+
files: list[dict[str, Any]] = []
|
|
208
|
+
if a1_dir.is_dir():
|
|
209
|
+
for f in sorted(a1_dir.glob("*.py")):
|
|
210
|
+
if f.name == "__init__.py":
|
|
211
|
+
continue
|
|
212
|
+
findings = _scan_one_for_io_imports(f)
|
|
213
|
+
if findings:
|
|
214
|
+
files.append({
|
|
215
|
+
"file": str(f.relative_to(pkg)),
|
|
216
|
+
"findings": findings,
|
|
217
|
+
})
|
|
218
|
+
total = sum(len(it["findings"]) for it in files)
|
|
219
|
+
return {
|
|
220
|
+
"schema_version": SCHEMA_VERSION_AIOM_V1,
|
|
221
|
+
"package_root": str(pkg),
|
|
222
|
+
"violation_count": total,
|
|
223
|
+
"files": files,
|
|
224
|
+
"verdict": "PASS" if total == 0 else "FAIL",
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
__all__ = [
|
|
229
|
+
"SCHEMA_VERSION_AHLP_V1",
|
|
230
|
+
"SCHEMA_VERSION_AIOM_V1",
|
|
231
|
+
"SCHEMA_VERSION_MCB_V1",
|
|
232
|
+
"fingerprint_a1",
|
|
233
|
+
"scan_aiom",
|
|
234
|
+
"scan_mcb",
|
|
235
|
+
]
|