atomadic-forge 0.52.0__tar.gz → 0.53.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.52.0 → atomadic_forge-0.53.0}/.github/workflows/metrics-auto-regen.yml +15 -14
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/.github/workflows/metrics-drift.yml +5 -5
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/CHANGELOG.md +68 -9
- {atomadic_forge-0.52.0/src/atomadic_forge.egg-info → atomadic_forge-0.53.0}/PKG-INFO +2 -2
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/README.md +1 -1
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/AGENTS_GUIDE.md +1 -1
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/RECEIPT.md +3 -3
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/compliance/CMMC_AI_MAPPING.md +1 -1
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +2 -2
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/compliance/FDA_PCCP_MAPPING.md +1 -1
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/compliance/SR_11-7_MAPPING.md +1 -1
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/pyproject.toml +1 -1
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +1 -1
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +11 -1
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/call_graph.py +110 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/forge_metrics.py +13 -13
- atomadic_forge-0.53.0/src/atomadic_forge/a1_at_functions/git_churn.py +129 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +51 -7
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/emergent_swarm.py +18 -5
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/forge_metrics_feature.py +16 -17
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a4_sy_orchestration/cli.py +79 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/metrics.py +6 -6
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0/src/atomadic_forge.egg-info}/PKG-INFO +2 -2
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge.egg-info/SOURCES.txt +3 -0
- atomadic_forge-0.53.0/tests/test_call_graph_summary.py +65 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_card_renderer.py +1 -1
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_cli_smoke.py +4 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_compliance_checker.py +1 -1
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_copilots_copilot.py +8 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_cs1_renderer.py +2 -2
- atomadic_forge-0.53.0/tests/test_git_churn.py +80 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_mcp_protocol.py +65 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/.github/FUNDING.yml +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/.github/actions/forge-action/README.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/.github/actions/forge-action/action.yml +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/.github/dependabot.yml +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/.github/pull_request_template.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/.github/workflows/ci.yml +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/.github/workflows/customer-refactor.yml +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/.github/workflows/forge-self-certify.yml +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/.github/workflows/mcp-registry-publish.yml +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/.github/workflows/publish-on-tag.yml +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/.github/workflows/release-readiness.yml +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/.github/workflows/release.yml +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/.github/workflows/surface-drift.yml +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/.github/workflows/uptime.yml +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/ARCHITECTURE.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/CONTRIBUTING.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/LICENSE +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/MANIFEST.in +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/SECURITY.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/assets/Atomadic-Forge-01.png +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/01-getting-started.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/02-commands.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/03-tutorial.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/04-llm-loops.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/05-faq.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/AIR_GAPPED.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/CI_CD.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/CODEX_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/COMMANDS.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/FIRST_10_MINUTES.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/FORMALIZATION.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/HIVE_PRIMITIVES.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/HIVE_STATUS.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/IDE_INTEGRATION.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/LANDSCAPE.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/MARKET_POSITIONING.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/MIGRATION.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/MULTI_REPO.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/PROVIDERS.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/README.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/RELAY_PROTOCOL.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/RELEASE_CHECKLIST.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/RELEASE_MESSAGING.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/ROADMAP.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/SHOWCASE.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/SIDECAR.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/STUDIO.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/TOOL_FACTORY_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/V0.46.0_JUSTIFICATION_REPORT.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/V0.47.0_SELF_TEST_REPORT.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/WHY_NOW.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/WORKER_VS_LOCAL_MCP.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/WORLD_COLLISION.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/INDEX.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/absorb.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/audit.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/chat.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/commandsmith.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/config.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/create.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/demo.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/emergent-swarm.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/emergent-then-synergy.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/emergent.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/enhancement.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/evolve-then-iterate.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/evolve.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/feature-then-emergent.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/guard-install.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/handoff.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/harvest.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/hive.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/iterate.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/materialize.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/metrics.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/recon-swarm.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/relay.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/surface.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/synergy-then-emergent.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/synergy.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/welcome.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/commands/wisdom.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/compliance/CS-1.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/handoffs/WORKER_AUTO_DEPLOY_2026-05-06.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/tutorials/01-quickstart.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/tutorials/02-your-first-package.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/tutorials/03-the-five-tier-law.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/tutorials/04-plug-in-llms.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/tutorials/05-multi-repo-absorb.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/docs/tutorials/06-javascript-quickstart.md +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/setup.cfg +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/__init__.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/__main__.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/enhancement_proposal_constants.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/handoff_constants.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/hive_constants.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/lifetime_savings_constants.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/materialize_types.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/nexus_constants.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/response_enrichment.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/welcome_constants.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/wisdom_constants.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/certify_checks.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/code_signature.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/custom_provider_client.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/enhancement_proposal_builder.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/exported_api_check.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/forge_locate.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/handoff_builder.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/harvest_absorb.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/hive_consensus_math.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/hive_io.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/intent_similarity.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/lifetime_savings.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/polyglot_classify.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/polyglot_imports.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/polyglot_surface.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/response_enricher.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/scaffold_polyglot.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/scout_walk.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/smell_scan.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/test_selector.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/validation_commands.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/welcome_narrator.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/wire_check.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/wisdom_capture.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/wisdom_io.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/wisdom_promote.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/wisdom_recall.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/worktree_status.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a2_mo_composites/evolve_session_store.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a2_mo_composites/iterate_session_store.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a2_mo_composites/nexus_client.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/absorb_feature.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/cherry_hunter.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/cna_check.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/commit_compose.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/create_feature.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/dedup_engine.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.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.52.0 → atomadic_forge-0.53.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.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/enhancement_proposal_feature.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/forge_evolve_session.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/forge_loop_session.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/forge_pipeline.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/guard_install.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/handoff_feature.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/hive_sync.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/materialize_feature.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/mcp_server.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/nexus_bridge.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/relay_daemon.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/surface_export.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/tool_factory.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/verify_umbrella.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/welcome_feature.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a3_og_features/wisdom_feature.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/__init__.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/_registry.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/absorb.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/audit.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/chat.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/commandsmith.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/config_cmd.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/create.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/demo.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/emergent.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/emergent_swarm.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/enhancement.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/evolve.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/guard_install.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/handoff.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/harvest.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/hive.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/iterate.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/materialize.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/recon_swarm.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/relay.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/surface.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/synergy.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/welcome.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/commands/wisdom.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge.egg-info/requires.txt +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge.egg-info/top_level.txt +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_aaaa_nexus_client.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_agent_hire_protocol.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_agent_plan.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_agent_plan_pkg_label.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_agent_summary.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_audit_verb.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_body_extractor_repairs.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_certify_operational_axis.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_chat.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_classify_tier.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_classify_tier_ast_signals.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_cli_swarm_aliases.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_codex_5_complete.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_codex_6_enforce_polyglot.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_commandsmith.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_compiler_feedback.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_config.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_create_feature.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_custom_provider.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_dedup_engine.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_demo.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_emergent_compose.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_emergent_signature_extract.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_emergent_synthesize_imports.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_enhancement_proposal.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_error_codes.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_error_hints.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_evolve_js.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_exported_api_check.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_forge_action.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_forge_auth_a1.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_forge_auth_a2.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_forge_enforce.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_generation_quality.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_handoff.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_hierarchical_memory.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_hive_sync.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_ignore_and_docs.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_import_smoke.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_iterate_evolve.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_js_certify.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_js_parser.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_js_recon.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_js_wire.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_lineage_chain.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_ling_provider.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_local_signer.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_lsp_protocol.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_manifest_diff.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_materialize_feature.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_mcp_lazy_bootstrap.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_nexus_bridge.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_ollama_client.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_pipeline.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_plan_apply.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_polyglot_cli_mcp.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_polyglot_full_pipeline.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_polyglot_hardening.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_polyglot_swift_kotlin_go.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_polyglot_symbol_parity.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_pre_audit_smoke.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_precommit_hooks.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_progress_reporter.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_receipt_emitter.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_receipt_schema.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_receipt_signer.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_response_enricher.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_roi_calculator.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_sbom_cmd_text_summary.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_sbom_emitter.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_scaffold.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_sidecar.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_sidecar_validate.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_smell_score_formula.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_stagnation.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_stub_detector.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_surface_export.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_synergy.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_test_runner.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_tier_init_rebuild.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_trust_gate_response.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_verify_suggested_recipe.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_welcome.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_welcome_enhancements.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_whoami_cmd.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_wire_certify.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_wire_suggest_repairs.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_wire_type_checking.py +0 -0
- {atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/tests/test_wisdom.py +0 -0
|
@@ -10,8 +10,8 @@ name: Metrics Auto-Regenerate
|
|
|
10
10
|
# - Public surfaces (atomadic.tech, shields.io endpoints proxied by
|
|
11
11
|
# the worker) always read live numbers from the same JSON.
|
|
12
12
|
#
|
|
13
|
-
# Lean theorem count requires the IP-protected
|
|
14
|
-
#
|
|
13
|
+
# Lean theorem count requires the IP-protected proof corpus repo. The
|
|
14
|
+
# PROOF_CORPUS_DEPLOY_KEY secret (org-level) provides a deploy-key;
|
|
15
15
|
# without it the lean_theorems block is preserved from the prior commit
|
|
16
16
|
# (see surgical merge step below) so this workflow never destroys real
|
|
17
17
|
# numbers when running without the IP repo attached.
|
|
@@ -52,37 +52,38 @@ jobs:
|
|
|
52
52
|
echo "$out"
|
|
53
53
|
passed=$(echo "$out" | grep -oE '[0-9]+ passed' | head -1 | grep -oE '[0-9]+')
|
|
54
54
|
echo "passed=${passed:-0}" >> "$GITHUB_OUTPUT"
|
|
55
|
-
- name: Optionally clone IP-protected
|
|
55
|
+
- name: Optionally clone IP-protected proof corpus (preserves lean count)
|
|
56
56
|
# GitHub Actions disallows `secrets.*` in `if` — runtime check
|
|
57
57
|
# inside the script instead. No-op if the deploy key is unset.
|
|
58
58
|
env:
|
|
59
|
-
|
|
59
|
+
PROOF_CORPUS_DEPLOY_KEY: ${{ secrets.PROOF_CORPUS_DEPLOY_KEY }}
|
|
60
|
+
PROOF_CORPUS_REPO_URL: ${{ secrets.PROOF_CORPUS_REPO_URL }}
|
|
60
61
|
run: |
|
|
61
|
-
if [ -z "${
|
|
62
|
-
echo "
|
|
62
|
+
if [ -z "${PROOF_CORPUS_DEPLOY_KEY:-}" ]; then
|
|
63
|
+
echo "PROOF_CORPUS_DEPLOY_KEY not set — skipping proof corpus clone."
|
|
63
64
|
exit 0
|
|
64
65
|
fi
|
|
65
66
|
mkdir -p ~/.ssh && chmod 700 ~/.ssh
|
|
66
|
-
echo "$
|
|
67
|
-
GIT_SSH_COMMAND="ssh -i ~/.ssh/
|
|
68
|
-
git clone --depth 1
|
|
69
|
-
echo "
|
|
67
|
+
echo "$PROOF_CORPUS_DEPLOY_KEY" > ~/.ssh/corpus_key && chmod 600 ~/.ssh/corpus_key
|
|
68
|
+
GIT_SSH_COMMAND="ssh -i ~/.ssh/corpus_key -o StrictHostKeyChecking=no" \
|
|
69
|
+
git clone --depth 1 "$PROOF_CORPUS_REPO_URL" /tmp/proof-corpus
|
|
70
|
+
echo "FORGE_PROOF_CORPUS=/tmp/proof-corpus" >> "$GITHUB_ENV"
|
|
70
71
|
- name: Regenerate forge_metrics.json
|
|
71
72
|
run: |
|
|
72
73
|
# Save the previous lean_theorems block so we can preserve it
|
|
73
|
-
# when no
|
|
74
|
+
# when no proof corpus is attached (avoid zeroing the public
|
|
74
75
|
# number on a routine source-only push).
|
|
75
76
|
python -c "import json; d=json.load(open('forge_metrics.json')); print(json.dumps(d.get('lean_theorems', {})))" > /tmp/prev_lean.json
|
|
76
77
|
forge metrics --apply --tests-passing ${{ steps.pytest.outputs.passed }}
|
|
77
|
-
# If no
|
|
78
|
-
if [ -z "${
|
|
78
|
+
# If no proof corpus was attached this run, restore prior lean block.
|
|
79
|
+
if [ -z "${FORGE_PROOF_CORPUS:-}" ]; then
|
|
79
80
|
python <<'PY'
|
|
80
81
|
import json, pathlib
|
|
81
82
|
p = pathlib.Path("forge_metrics.json")
|
|
82
83
|
d = json.loads(p.read_text())
|
|
83
84
|
prev = json.loads(pathlib.Path("/tmp/prev_lean.json").read_text())
|
|
84
85
|
# Only restore if the freshly-computed block reports found=False
|
|
85
|
-
# (i.e.
|
|
86
|
+
# (i.e. proof corpus unavailable) AND the prior had a real count.
|
|
86
87
|
if not d.get("lean_theorems", {}).get("found") and prev.get("count"):
|
|
87
88
|
d["lean_theorems"] = prev
|
|
88
89
|
p.write_text(json.dumps(d, indent=2, sort_keys=True) + "\n")
|
|
@@ -4,10 +4,10 @@ name: Metrics Drift Gate
|
|
|
4
4
|
# Any PR that changes TOOLS, CLI registry, source/test counts, or
|
|
5
5
|
# pyproject.toml WITHOUT regenerating forge_metrics.json fails this check.
|
|
6
6
|
#
|
|
7
|
-
# Lean theorem count is recomputed only when the
|
|
7
|
+
# Lean theorem count is recomputed only when the FORGE_PROOF_CORPUS repo is
|
|
8
8
|
# accessible (CI env var). When not set, the lean_theorems block is
|
|
9
9
|
# preserved from the in-tree forge_metrics.json so PRs that don't touch
|
|
10
|
-
#
|
|
10
|
+
# the proof corpus don't get blocked here.
|
|
11
11
|
#
|
|
12
12
|
# Fix when this fails: forge metrics --apply && git add forge_metrics.json
|
|
13
13
|
|
|
@@ -41,7 +41,7 @@ jobs:
|
|
|
41
41
|
set -euo pipefail
|
|
42
42
|
# Save committed copy.
|
|
43
43
|
cp forge_metrics.json /tmp/forge_metrics.committed.json
|
|
44
|
-
# Recompute (Lean count zero in CI unless
|
|
44
|
+
# Recompute (Lean count zero in CI unless FORGE_PROOF_CORPUS is wired).
|
|
45
45
|
forge metrics --apply
|
|
46
46
|
# If the only delta is the timestamp, that's expected — strip it
|
|
47
47
|
# before diffing so we only fail on substantive drift.
|
|
@@ -53,10 +53,10 @@ jobs:
|
|
|
53
53
|
# this gate doesn't run pytest. Comparing them is meaningless.
|
|
54
54
|
jq 'del(.tests_passing)' /tmp/a.json > /tmp/a2.json && mv /tmp/a2.json /tmp/a.json
|
|
55
55
|
jq 'del(.tests_passing)' /tmp/b.json > /tmp/b2.json && mv /tmp/b2.json /tmp/b.json
|
|
56
|
-
# If
|
|
56
|
+
# If FORGE_PROOF_CORPUS is not set, also ignore the lean_theorems
|
|
57
57
|
# block (will be 0 in CI but the committed artifact has the real
|
|
58
58
|
# count from the IP repo).
|
|
59
|
-
if [ -z "${
|
|
59
|
+
if [ -z "${FORGE_PROOF_CORPUS:-}" ]; then
|
|
60
60
|
jq 'del(.lean_theorems)' /tmp/a.json > /tmp/a2.json && mv /tmp/a2.json /tmp/a.json
|
|
61
61
|
jq 'del(.lean_theorems)' /tmp/b.json > /tmp/b2.json && mv /tmp/b2.json /tmp/b.json
|
|
62
62
|
fi
|
|
@@ -2,6 +2,65 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## v0.53.0 — 2026-05-07 — Harvest synthesis: call-graph-summary, git churn, token budget
|
|
6
|
+
|
|
7
|
+
### feat(synthesis): three new a1 capabilities absorbed from harvest pipeline
|
|
8
|
+
|
|
9
|
+
**`call_graph_summary` — whole-package call-graph portfolio** (pyan synthesis)
|
|
10
|
+
|
|
11
|
+
Adds `build_call_graph_summary()` to `a1_at_functions/call_graph.py`.
|
|
12
|
+
Surfaces orphan functions (uncalled callers), hotspot functions by fan-in,
|
|
13
|
+
and maximum call-chain depth for an entire package in one shot — distinct from
|
|
14
|
+
the per-symbol BFS that `call_graph` already provides.
|
|
15
|
+
|
|
16
|
+
- `forge call-graph-summary --project <root> [--package NAME] [--top-n N] [--json]`
|
|
17
|
+
- MCP: `explore(action='call_graph_summary')`
|
|
18
|
+
- Schema: `atomadic-forge.call_graph_summary/v1`
|
|
19
|
+
|
|
20
|
+
**`git_churn` — file-level commit frequency** (Repomix synthesis)
|
|
21
|
+
|
|
22
|
+
New `a1_at_functions/git_churn.py` with `compute_git_churn()`.
|
|
23
|
+
Runs `git log --name-only` to build hotspot/stable file rankings, average and
|
|
24
|
+
median commits per file, first/last commit dates. Returns a minimal error dict
|
|
25
|
+
when git is unavailable so callers degrade gracefully.
|
|
26
|
+
|
|
27
|
+
- `forge churn --project <root> [--since '6 months ago'] [--top-n N] [--all-files] [--json]`
|
|
28
|
+
- MCP: `explore(action='churn')`
|
|
29
|
+
- Schema: `atomadic-forge.git_churn/v1`
|
|
30
|
+
|
|
31
|
+
**`token_estimate` — context-pack payload sizing** (Repomix synthesis)
|
|
32
|
+
|
|
33
|
+
`emit_context_pack()` now includes `token_estimate: int` — a `len(json.dumps(pack)) // 4`
|
|
34
|
+
approximation so agents can budget against context limits before dispatching.
|
|
35
|
+
|
|
36
|
+
### metrics
|
|
37
|
+
|
|
38
|
+
- CLI verbs: 74 (+2)
|
|
39
|
+
- MCP actions: 66 (+2)
|
|
40
|
+
- Tests: 1423 (+14 over v0.52.1)
|
|
41
|
+
|
|
42
|
+
## v0.52.1 — 2026-05-07 — IP scrub: no private identifiers in public repo
|
|
43
|
+
|
|
44
|
+
### fix(security): remove all private identifiers from public surfaces
|
|
45
|
+
|
|
46
|
+
All internal project names, repo identifiers, and deploy-key secret
|
|
47
|
+
names replaced with neutral public-safe labels throughout:
|
|
48
|
+
|
|
49
|
+
- CI workflow secrets and env vars renamed to neutral `PROOF_CORPUS_*` prefix
|
|
50
|
+
- Hardcoded SSH clone URL moved to `PROOF_CORPUS_REPO_URL` org secret
|
|
51
|
+
- Python API param renamed to `proof_corpus_root`; internal helper to `_find_proof_corpus`
|
|
52
|
+
- CLI flag renamed to `forge metrics --proof-corpus`
|
|
53
|
+
- All docs (CHANGELOG, README, .gitignore) use neutral labels
|
|
54
|
+
|
|
55
|
+
Zero functional changes. certify: 100/100. wire: 0 violations.
|
|
56
|
+
|
|
57
|
+
### fix(test): git-ceiling tests clear inherited worktree env vars
|
|
58
|
+
|
|
59
|
+
`test_worktree_status_non_git_runs` and
|
|
60
|
+
`test_tools_call_doctor_with_include_worktree` now explicitly unset
|
|
61
|
+
`GIT_DIR`/`GIT_WORK_TREE`/`GIT_COMMON_DIR` so they pass when running
|
|
62
|
+
from inside a git worktree on Windows.
|
|
63
|
+
|
|
5
64
|
### feat(emergent-swarm): hub-node penalty in `emergent_swarm` scoring
|
|
6
65
|
|
|
7
66
|
Symbols that appear in more than 3 chains are now penalised in
|
|
@@ -164,7 +223,7 @@ This release scrubs all of them while keeping the credibility markers:
|
|
|
164
223
|
|
|
165
224
|
**IP-protected (stripped from public):**
|
|
166
225
|
- Specific theorem names (no longer cited anywhere public)
|
|
167
|
-
-
|
|
226
|
+
- Internal framework names (removed from all public surfaces)
|
|
168
227
|
- Math derivations (no `⌊Δ_RG/η⌋`, no Leech / Niemeier / Coxeter–Todd /
|
|
169
228
|
Golay / Monster group / E₈ geometry references)
|
|
170
229
|
- Greek-letter math (`τ_TRUST` → `TAU_TRUST`, `τ_trust` → `trust threshold`
|
|
@@ -233,8 +292,8 @@ or `pyproject.toml` triggers a regeneration. If the artifact drifted, a
|
|
|
233
292
|
follow-up `chore(metrics): auto-regenerate [skip ci]` commit is pushed
|
|
234
293
|
back to main. Stale numbers self-heal — no human intervention.
|
|
235
294
|
|
|
236
|
-
When the `
|
|
237
|
-
auto-regen also clones the IP-protected
|
|
295
|
+
When the `PROOF_CORPUS_DEPLOY_KEY` org secret is configured, the
|
|
296
|
+
auto-regen also clones the IP-protected proof corpus over deploy-key
|
|
238
297
|
SSH and refreshes the Lean theorem count. Without the secret, the prior
|
|
239
298
|
lean count is preserved (never zeroed by a routine push).
|
|
240
299
|
|
|
@@ -251,7 +310,7 @@ targeted-subset passes). The artifact now carries all three explicitly:
|
|
|
251
310
|
|
|
252
311
|
Every public number Forge claims about itself — MCP tool count, action
|
|
253
312
|
count, CLI verb count, source/test files, lines of code, and the count
|
|
254
|
-
of formally-verified Lean4 theorems in the IP-protected
|
|
313
|
+
of formally-verified Lean4 theorems in the IP-protected proof corpus
|
|
255
314
|
moat — now lives in one canonical artifact: `forge_metrics.json` at the
|
|
256
315
|
repo root, regenerated on every push by `forge metrics --apply`.
|
|
257
316
|
|
|
@@ -265,7 +324,7 @@ artifact drift out of sync with the live forge surface.
|
|
|
265
324
|
- 71 CLI verbs
|
|
266
325
|
- 211 source files · ~40,110 LOC
|
|
267
326
|
- 96 test files
|
|
268
|
-
- **886 Lean4 theorems across 38 files** (
|
|
327
|
+
- **886 Lean4 theorems across 38 files** (formal-proof moat)
|
|
269
328
|
- monadic tiers = 5
|
|
270
329
|
|
|
271
330
|
### feat(cli/mcp): `forge metrics` verb — print or write the artifact
|
|
@@ -279,10 +338,10 @@ forge metrics --self-cert # also embed certify score (slower)
|
|
|
279
338
|
|
|
280
339
|
The verb composes a pure tier-a1 aggregator (`forge_metrics.py`) with
|
|
281
340
|
the live MCP TOOLS dict and CLI registry. Source paths from the
|
|
282
|
-
IP-protected
|
|
341
|
+
IP-protected proof corpus are NEVER written into the public
|
|
283
342
|
artifact — only aggregate counts. Path resolution is via the
|
|
284
|
-
`
|
|
285
|
-
ever being checked in.
|
|
343
|
+
`FORGE_PROOF_CORPUS` env var; gitignore protects the proof corpus
|
|
344
|
+
directory from ever being checked in.
|
|
286
345
|
|
|
287
346
|
### chore: corrected stale README numbers
|
|
288
347
|
|
|
@@ -3069,7 +3128,7 @@ shipped on master.
|
|
|
3069
3128
|
roadmap explicit (v1.0 → v1.1 W8 polyglot_breakdown → v1.2 W12
|
|
3070
3129
|
slsa_attestation → v2.0 W24 bao_rompf_witnesses). Both Lean4 corpora
|
|
3071
3130
|
cited (`aethel-nexus-proofs` — 29 theorems, 0 sorry, 0 axioms — and
|
|
3072
|
-
`
|
|
3131
|
+
`proof-corpus-v22` — 538 theorems, 0 sorry). All signing / lineage
|
|
3073
3132
|
/ attestation fields default to `None` so unsigned dev Receipts
|
|
3074
3133
|
remain structurally valid. Tier-pure a0.
|
|
3075
3134
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: atomadic-forge
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.53.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
|
|
@@ -208,7 +208,7 @@ Full tool reference: [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md) | First call: `welco
|
|
|
208
208
|
| CLI verbs | **71** |
|
|
209
209
|
| Source files | **211** (~40,195 LOC) |
|
|
210
210
|
| Tests | **1,495 passing** across **97 test files** (1,411 static · pytest expands parametrize to 1,495 collected) |
|
|
211
|
-
| Lean4 formal proofs | **872 theorems** across 30 files (mathematically verified core logic — IP-protected
|
|
211
|
+
| Lean4 formal proofs | **872 theorems** across 30 files (mathematically verified core logic — IP-protected formal verification moat) |
|
|
212
212
|
| Monadic tiers | **5** (a0 → a4, strict upward-only composition) |
|
|
213
213
|
| Languages | Python, JS/TS, Swift, Kotlin, Go, Rust |
|
|
214
214
|
| Infrastructure cost | **$5/mo** |
|
|
@@ -176,7 +176,7 @@ Full tool reference: [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md) | First call: `welco
|
|
|
176
176
|
| CLI verbs | **71** |
|
|
177
177
|
| Source files | **211** (~40,195 LOC) |
|
|
178
178
|
| Tests | **1,495 passing** across **97 test files** (1,411 static · pytest expands parametrize to 1,495 collected) |
|
|
179
|
-
| Lean4 formal proofs | **872 theorems** across 30 files (mathematically verified core logic — IP-protected
|
|
179
|
+
| Lean4 formal proofs | **872 theorems** across 30 files (mathematically verified core logic — IP-protected formal verification moat) |
|
|
180
180
|
| Monadic tiers | **5** (a0 → a4, strict upward-only composition) |
|
|
181
181
|
| Languages | Python, JS/TS, Swift, Kotlin, Go, Rust |
|
|
182
182
|
| Infrastructure cost | **$5/mo** |
|
|
@@ -462,7 +462,7 @@ treated as non-code artifacts rather than misplaced source.
|
|
|
462
462
|
| Resource URI | What it is | Use case |
|
|
463
463
|
|---|---|---|
|
|
464
464
|
| `forge://docs/receipt` | The Receipt schema spec | Agent reads this to know what the Receipt JSON contract is. |
|
|
465
|
-
| `forge://docs/formalization` | Citations to `aethel-nexus-proofs` (29 theorems / 0 sorry) and `
|
|
465
|
+
| `forge://docs/formalization` | Citations to `aethel-nexus-proofs` (29 theorems / 0 sorry) and `proof-corpus-v22` (538 theorems / 0 sorry) | Agent presenting Forge to a regulator: cite the proof corpus. |
|
|
466
466
|
| `forge://lineage/chain` | Episodic L1 trace of every Forge run | Replay / debugging / audit. |
|
|
467
467
|
| `forge://schema/receipt` | Machine-readable JSON Schema for the Receipt | Agent doing type-checked Receipt parsing. |
|
|
468
468
|
| `forge://summary/blockers` | Same payload as `agent_summary` MCP tool | One-shot `resources/read` for clients that prefer resources over tools. |
|
|
@@ -84,7 +84,7 @@ rejected by consumers. The set is pinned in
|
|
|
84
84
|
| `artifacts` | list of `{name, path, sha256}` | pointers to `.atomadic-forge/*.json` evidence files |
|
|
85
85
|
| `signatures.sigstore` | object \| null | Rekor uuid + log_index; populated by Lane A W2 signer |
|
|
86
86
|
| `signatures.aaaa_nexus` | object \| null | base64 signature + key_id; from `/v1/verify/forge-receipt` |
|
|
87
|
-
| `lean4_attestation` | object | corpus citations (`aethel-nexus-proofs`, `
|
|
87
|
+
| `lean4_attestation` | object | corpus citations (`aethel-nexus-proofs`, `proof-corpus-v22`) |
|
|
88
88
|
| `lineage.lineage_path` | string | opaque Vanguard ledger pointer (Lane A W4) |
|
|
89
89
|
| `lineage.parent_receipt_hash` | string \| null | SHA-256 of the immediately prior Receipt |
|
|
90
90
|
| `lineage.chain_depth` | int | 1 for first Receipt; n+1 per successor |
|
|
@@ -202,8 +202,8 @@ cited:
|
|
|
202
202
|
"axiom_count": 0
|
|
203
203
|
},
|
|
204
204
|
{
|
|
205
|
-
"name": "
|
|
206
|
-
"repo_url": "https://
|
|
205
|
+
"name": "proof-corpus-v22",
|
|
206
|
+
"repo_url": "https://example.com/proof-corpus",
|
|
207
207
|
"ref_sha": "31bd09...",
|
|
208
208
|
"theorem_count": 538,
|
|
209
209
|
"sorry_count": 0,
|
|
@@ -150,7 +150,7 @@ classification":
|
|
|
150
150
|
| Corpus | Theorems | Claim backed |
|
|
151
151
|
|---|---|---|
|
|
152
152
|
| `aethel-nexus-proofs` | 29, 0 sorry | Monadic composition law: tiers compose upward only |
|
|
153
|
-
| `
|
|
153
|
+
| `proof-corpus-v22` | 538, 0 sorry | Wire-scan completeness and soundness |
|
|
154
154
|
|
|
155
155
|
---
|
|
156
156
|
|
|
@@ -50,7 +50,7 @@ is satisfied by fields in the Atomadic Forge Receipt v1.
|
|
|
50
50
|
| Corpus | Theorems | Sorry | Axioms |
|
|
51
51
|
|--------|----------|-------|--------|
|
|
52
52
|
| `aethel-nexus-proofs` | 29 | 0 | 0 |
|
|
53
|
-
| `
|
|
53
|
+
| `proof-corpus-v22` | 538 | 0 | 0 |
|
|
54
54
|
|
|
55
55
|
### Annex IV §2(b) — Data governance and data management practices
|
|
56
56
|
|
|
@@ -113,7 +113,7 @@ Lean4 corpus with `sorry_count = 0`. The standard Atomadic corpora are:
|
|
|
113
113
|
| Corpus | Repository | Theorems | Sorry | Axioms | Status |
|
|
114
114
|
|--------|-----------|----------|-------|--------|--------|
|
|
115
115
|
| `aethel-nexus-proofs` | Internal | 29 | 0 | 0 | Attesting |
|
|
116
|
-
| `
|
|
116
|
+
| `proof-corpus-v22` | Internal | 538 | 0 | 0 | Attesting |
|
|
117
117
|
|
|
118
118
|
---
|
|
119
119
|
|
|
@@ -73,7 +73,7 @@ Atomadic standard validation corpora:
|
|
|
73
73
|
| Corpus | Theorems | Sorry | Validation claim |
|
|
74
74
|
|--------|----------|-------|-----------------|
|
|
75
75
|
| `aethel-nexus-proofs` | 29 | 0 | Structural invariants of the Atomadic monadic composition law |
|
|
76
|
-
| `
|
|
76
|
+
| `proof-corpus-v22` | 538 | 0 | Mathematical foundations of the tier-effect type system |
|
|
77
77
|
|
|
78
78
|
### PCCP §II.C — Performance Monitoring Plan
|
|
79
79
|
|
|
@@ -48,7 +48,7 @@ corpora cited in every signed Receipt provide:
|
|
|
48
48
|
|---|---|
|
|
49
49
|
| Theoretical basis documented | ASS-ADE MONADIC_DEVELOPMENT.md (5-tier law) + Lean4 proofs |
|
|
50
50
|
| Assumptions stated and justified | `aethel-nexus-proofs` ref `abc1234` — 29 theorems, 0 sorry |
|
|
51
|
-
| Mathematical properties verified | `
|
|
51
|
+
| Mathematical properties verified | `proof-corpus-v22` ref `def5678` — 538 theorems, 0 sorry |
|
|
52
52
|
|
|
53
53
|
A Receipt with no `lean4_attestation` or `sorry_count > 0` provides
|
|
54
54
|
partial conceptual soundness evidence only.
|
|
@@ -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.53.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"
|
{atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a0_qk_constants/receipt_schema.py
RENAMED
|
@@ -187,7 +187,7 @@ class ReceiptLean4Corpus(TypedDict, total=False):
|
|
|
187
187
|
Cites a machine-checked theorem corpus that backs a claim made by
|
|
188
188
|
this Receipt. The Golden Path threads two corpora through every
|
|
189
189
|
Receipt: ``aethel-nexus-proofs`` (29 theorems, 0 sorry, 0 axioms)
|
|
190
|
-
and ``
|
|
190
|
+
and ``proof-corpus-v22`` (538 theorems, 0 sorry).
|
|
191
191
|
"""
|
|
192
192
|
name: str # e.g. "aethel-nexus-proofs"
|
|
193
193
|
repo_url: str
|
|
@@ -13,6 +13,7 @@ single bundle. The orchestration that runs the scans lives in a3.
|
|
|
13
13
|
"""
|
|
14
14
|
from __future__ import annotations
|
|
15
15
|
|
|
16
|
+
import json
|
|
16
17
|
import re
|
|
17
18
|
from collections import Counter
|
|
18
19
|
from pathlib import Path
|
|
@@ -136,6 +137,7 @@ class ContextPack(TypedDict, total=False):
|
|
|
136
137
|
selected_tests: dict
|
|
137
138
|
workflow_recipe: dict # compose_tools plan when intent is provided
|
|
138
139
|
suggested_next_steps: list[dict]
|
|
140
|
+
token_estimate: int # rough token count (chars // 4); repomix synthesis
|
|
139
141
|
|
|
140
142
|
|
|
141
143
|
def _read_repo_purpose(project_root: Path) -> str:
|
|
@@ -442,7 +444,7 @@ def emit_context_pack(
|
|
|
442
444
|
project_root=project_root,
|
|
443
445
|
)
|
|
444
446
|
|
|
445
|
-
|
|
447
|
+
pack = ContextPack(
|
|
446
448
|
schema_version=SCHEMA_VERSION_CONTEXT_PACK_V1,
|
|
447
449
|
project_root=str(project_root),
|
|
448
450
|
repo_purpose=_read_repo_purpose(project_root),
|
|
@@ -478,4 +480,12 @@ def emit_context_pack(
|
|
|
478
480
|
release_gate=release_gate,
|
|
479
481
|
selected_tests=selected_tests,
|
|
480
482
|
),
|
|
483
|
+
token_estimate=0,
|
|
481
484
|
)
|
|
485
|
+
# Patch token_estimate after build — rough approximation: JSON chars / 4 ≈ tokens.
|
|
486
|
+
# No external tokenizer required; accurate enough for context budget decisions.
|
|
487
|
+
try:
|
|
488
|
+
pack["token_estimate"] = len(json.dumps(pack, default=str)) // 4
|
|
489
|
+
except (TypeError, ValueError):
|
|
490
|
+
pass
|
|
491
|
+
return pack
|
{atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/call_graph.py
RENAMED
|
@@ -419,3 +419,113 @@ def build_call_graph(args: dict[str, Any]) -> dict[str, Any]:
|
|
|
419
419
|
"callees_count": len(callees),
|
|
420
420
|
"target_in_graph": canonical_target in edges,
|
|
421
421
|
}
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
# ── Whole-package summary (pyan synthesis) ────────────────────────────
|
|
425
|
+
|
|
426
|
+
SCHEMA_VERSION_CALL_GRAPH_SUMMARY_V1 = "atomadic-forge.call_graph_summary/v1"
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
def _compute_fan_in(edges: dict[str, set[str]]) -> dict[str, int]:
|
|
430
|
+
fan_in: dict[str, int] = defaultdict(int)
|
|
431
|
+
for callees in edges.values():
|
|
432
|
+
for callee in callees:
|
|
433
|
+
fan_in[callee] += 1
|
|
434
|
+
return dict(fan_in)
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
def _max_chain_depth(
|
|
438
|
+
edges: dict[str, set[str]],
|
|
439
|
+
starts: list[str],
|
|
440
|
+
*,
|
|
441
|
+
cap: int = 15,
|
|
442
|
+
) -> int:
|
|
443
|
+
"""BFS from each start node; return the longest path found (capped)."""
|
|
444
|
+
best = 0
|
|
445
|
+
for start in starts[:100]:
|
|
446
|
+
visited: set[str] = {start}
|
|
447
|
+
queue: deque[tuple[str, int]] = deque([(start, 0)])
|
|
448
|
+
while queue:
|
|
449
|
+
node, d = queue.popleft()
|
|
450
|
+
if d >= cap:
|
|
451
|
+
continue
|
|
452
|
+
for callee in edges.get(node, ()):
|
|
453
|
+
if callee not in visited:
|
|
454
|
+
visited.add(callee)
|
|
455
|
+
if d + 1 > best:
|
|
456
|
+
best = d + 1
|
|
457
|
+
queue.append((callee, d + 1))
|
|
458
|
+
return best
|
|
459
|
+
|
|
460
|
+
|
|
461
|
+
def build_call_graph_summary(args: dict[str, Any]) -> dict[str, Any]:
|
|
462
|
+
"""Whole-package call-graph portfolio: orphans, hotspots, max depth.
|
|
463
|
+
|
|
464
|
+
Synthesized from pyan (David Fraser) whole-graph analysis concepts.
|
|
465
|
+
Unlike ``build_call_graph`` (per-symbol callers/callees), this gives
|
|
466
|
+
a portfolio view of the entire package's call structure — useful for
|
|
467
|
+
dead-code audits, refactor prioritization, and complexity estimation.
|
|
468
|
+
|
|
469
|
+
Args (from the dispatcher):
|
|
470
|
+
* ``project_root`` (default: cwd): repo root.
|
|
471
|
+
* ``package`` (default: derived): top-level package name.
|
|
472
|
+
* ``top_n`` (default 10): number of hotspot/orphan rows to return.
|
|
473
|
+
"""
|
|
474
|
+
project_root = Path(args.get("project_root") or ".").resolve()
|
|
475
|
+
top_n = min(int(args.get("top_n", 10)), 50)
|
|
476
|
+
|
|
477
|
+
_raw_package = args.get("package") or _detect_package_name(project_root)
|
|
478
|
+
package = _raw_package.replace("-", "_")
|
|
479
|
+
|
|
480
|
+
package_root = project_root / "src" / package
|
|
481
|
+
if not package_root.exists():
|
|
482
|
+
candidate = project_root / package
|
|
483
|
+
package_root = candidate if candidate.exists() else project_root
|
|
484
|
+
|
|
485
|
+
edges = _walk_package_edges(package_root, package=package)
|
|
486
|
+
aliases = _build_reexport_aliases(package_root, package=package)
|
|
487
|
+
|
|
488
|
+
if aliases:
|
|
489
|
+
canonical_edges: dict[str, set[str]] = defaultdict(set)
|
|
490
|
+
for caller, callees_set in edges.items():
|
|
491
|
+
canonical_caller = _canonicalize(caller, aliases)
|
|
492
|
+
for callee in callees_set:
|
|
493
|
+
canonical_edges[canonical_caller].add(
|
|
494
|
+
_canonicalize(callee, aliases)
|
|
495
|
+
)
|
|
496
|
+
edges = dict(canonical_edges)
|
|
497
|
+
|
|
498
|
+
fan_in = _compute_fan_in(edges)
|
|
499
|
+
|
|
500
|
+
# Defined = every function that appears as a caller (has ≥1 outgoing edge).
|
|
501
|
+
defined: set[str] = {f for f in edges if f.startswith(package)}
|
|
502
|
+
called: set[str] = {f for f in fan_in if f.startswith(package)}
|
|
503
|
+
|
|
504
|
+
# Uncalled callers: defined but never called from within the package.
|
|
505
|
+
# These may be entry-points (CLI/MCP handlers) or dead code.
|
|
506
|
+
uncalled = sorted(defined - called)
|
|
507
|
+
|
|
508
|
+
# Hotspots: package functions with the highest internal fan-in.
|
|
509
|
+
hotspots = sorted(
|
|
510
|
+
[{"qualname": q, "fan_in": c} for q, c in fan_in.items()
|
|
511
|
+
if q.startswith(package)],
|
|
512
|
+
key=lambda x: -x["fan_in"],
|
|
513
|
+
)[:top_n]
|
|
514
|
+
|
|
515
|
+
max_depth = _max_chain_depth(edges, uncalled)
|
|
516
|
+
|
|
517
|
+
total_edges = sum(len(v) for v in edges.values())
|
|
518
|
+
|
|
519
|
+
return {
|
|
520
|
+
"schema_version": SCHEMA_VERSION_CALL_GRAPH_SUMMARY_V1,
|
|
521
|
+
"package": package,
|
|
522
|
+
"package_root": str(package_root),
|
|
523
|
+
"total_callers": len(defined),
|
|
524
|
+
"total_edges": total_edges,
|
|
525
|
+
"uncalled_callers_count": len(uncalled),
|
|
526
|
+
"uncalled_callers": uncalled[:top_n],
|
|
527
|
+
"hotspot_count": len(hotspots),
|
|
528
|
+
"hotspots": hotspots,
|
|
529
|
+
"max_call_depth": max_depth,
|
|
530
|
+
"alias_count": len(aliases),
|
|
531
|
+
}
|
{atomadic_forge-0.52.0 → atomadic_forge-0.53.0}/src/atomadic_forge/a1_at_functions/forge_metrics.py
RENAMED
|
@@ -6,7 +6,7 @@ Worker, shields.io badges) all derive from the same canonical artifact —
|
|
|
6
6
|
``forge_metrics.json`` — produced by this function. No string lives in two
|
|
7
7
|
places; any drift is a CI-detectable bug.
|
|
8
8
|
|
|
9
|
-
The function is pure: given the same repo + (optional)
|
|
9
|
+
The function is pure: given the same repo + (optional) proof corpus path,
|
|
10
10
|
it returns the same dict. Every field carries a ``_basis`` description
|
|
11
11
|
so consumers can trace a number back to its source.
|
|
12
12
|
|
|
@@ -37,10 +37,10 @@ _LEAN_THEOREM_RE = re.compile(
|
|
|
37
37
|
)
|
|
38
38
|
|
|
39
39
|
|
|
40
|
-
def count_lean_theorems(
|
|
41
|
-
"""Return the certified Lean theorem count for
|
|
40
|
+
def count_lean_theorems(proof_corpus_root: Path) -> dict[str, Any]:
|
|
41
|
+
"""Return the certified Lean theorem count for the IP-protected proof corpus.
|
|
42
42
|
|
|
43
|
-
The
|
|
43
|
+
The proof corpus repository is IP-protected — this function only
|
|
44
44
|
surfaces aggregate counts to the public artifact. Source paths and
|
|
45
45
|
file names are NEVER returned. Callers must not log the input path.
|
|
46
46
|
|
|
@@ -50,7 +50,7 @@ def count_lean_theorems(mhed_codex_root: Path) -> dict[str, Any]:
|
|
|
50
50
|
attestation yet; it can overcount scratch or archived Lean files.
|
|
51
51
|
|
|
52
52
|
Args:
|
|
53
|
-
|
|
53
|
+
proof_corpus_root: directory containing a ``proofs/`` subtree of
|
|
54
54
|
``.lean`` files. If the directory does not exist or contains
|
|
55
55
|
no proofs, returns ``{count: 0, files: 0, found: False}``.
|
|
56
56
|
|
|
@@ -59,11 +59,11 @@ def count_lean_theorems(mhed_codex_root: Path) -> dict[str, Any]:
|
|
|
59
59
|
combined), ``theorems``, ``lemmas``, ``files``, ``found``.
|
|
60
60
|
No paths. Counts are always int; never raises on missing path.
|
|
61
61
|
"""
|
|
62
|
-
attested = _count_lean_theorems_from_attestation(Path(
|
|
62
|
+
attested = _count_lean_theorems_from_attestation(Path(proof_corpus_root))
|
|
63
63
|
if attested is not None:
|
|
64
64
|
return attested
|
|
65
65
|
|
|
66
|
-
proofs_dir = Path(
|
|
66
|
+
proofs_dir = Path(proof_corpus_root) / "proofs"
|
|
67
67
|
if not proofs_dir.is_dir():
|
|
68
68
|
return {
|
|
69
69
|
"count": 0, "theorems": 0, "lemmas": 0,
|
|
@@ -92,7 +92,7 @@ def count_lean_theorems(mhed_codex_root: Path) -> dict[str, Any]:
|
|
|
92
92
|
|
|
93
93
|
|
|
94
94
|
def _count_lean_theorems_from_attestation(
|
|
95
|
-
|
|
95
|
+
proof_corpus_root: Path,
|
|
96
96
|
) -> dict[str, Any] | None:
|
|
97
97
|
"""Read the newest build attestation if one exists.
|
|
98
98
|
|
|
@@ -101,7 +101,7 @@ def _count_lean_theorems_from_attestation(
|
|
|
101
101
|
metrics surface. The aggregate proof-tree hash is public-safe and lets
|
|
102
102
|
downstream agents verify the exact attested boundary.
|
|
103
103
|
"""
|
|
104
|
-
dist_dir = Path(
|
|
104
|
+
dist_dir = Path(proof_corpus_root) / "dist"
|
|
105
105
|
if not dist_dir.is_dir():
|
|
106
106
|
return None
|
|
107
107
|
attestations = sorted(dist_dir.glob("BUILD_ATTESTATION_*.json"))
|
|
@@ -223,7 +223,7 @@ def count_lines_of_code(repo_root: Path) -> int:
|
|
|
223
223
|
def compute_forge_metrics(
|
|
224
224
|
repo_root: Path,
|
|
225
225
|
*,
|
|
226
|
-
|
|
226
|
+
proof_corpus_root: Path | None = None,
|
|
227
227
|
package_version: str | None = None,
|
|
228
228
|
tools_count: int | None = None,
|
|
229
229
|
actions_count: int | None = None,
|
|
@@ -241,7 +241,7 @@ def compute_forge_metrics(
|
|
|
241
241
|
|
|
242
242
|
Args:
|
|
243
243
|
repo_root: forge repo path (where ``src/`` and ``tests/`` live).
|
|
244
|
-
|
|
244
|
+
proof_corpus_root: optional path to IP-protected proof corpus. When given,
|
|
245
245
|
``lean_theorems`` block is populated; when None, that block
|
|
246
246
|
is zeroed and ``lean_theorems.found=False``.
|
|
247
247
|
package_version: optional string. If None, the field is omitted.
|
|
@@ -286,8 +286,8 @@ def compute_forge_metrics(
|
|
|
286
286
|
metrics["tests_passing"] = tests_passing
|
|
287
287
|
# Lean theorem block — always present, populated only when found.
|
|
288
288
|
# Public artifact carries counts only — never paths or file names.
|
|
289
|
-
if
|
|
290
|
-
lean = count_lean_theorems(Path(
|
|
289
|
+
if proof_corpus_root is not None:
|
|
290
|
+
lean = count_lean_theorems(Path(proof_corpus_root))
|
|
291
291
|
else:
|
|
292
292
|
lean = {"count": 0, "theorems": 0, "lemmas": 0,
|
|
293
293
|
"files": 0, "found": False}
|