factorforge-cds 3.5.3__tar.gz → 3.5.10__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.
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/PKG-INFO +62 -7
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/README.md +60 -6
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/pyproject.toml +10 -2
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/analysis/metrics.py +1 -3
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/analysis/sequence_risks.py +1 -1
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/benchmark/runner.py +1 -2
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/cli/main.py +22 -72
- factorforge_cds-3.5.10/src/factorforge/closed_loop/__init__.py +27 -0
- factorforge_cds-3.5.10/src/factorforge/closed_loop/contracts.py +103 -0
- factorforge_cds-3.5.10/src/factorforge/closed_loop/ledger.py +222 -0
- factorforge_cds-3.5.10/src/factorforge/closed_loop/readiness.py +172 -0
- factorforge_cds-3.5.10/src/factorforge/codon/__init__.py +25 -0
- factorforge_cds-3.5.10/src/factorforge/codon/allocator.py +87 -0
- factorforge_cds-3.5.10/src/factorforge/codon/policy.py +212 -0
- factorforge_cds-3.5.10/src/factorforge/codon/qa.py +166 -0
- factorforge_cds-3.5.10/src/factorforge/codon/twin_generator.py +338 -0
- factorforge_cds-3.5.10/src/factorforge/core/__init__.py +35 -0
- factorforge_cds-3.5.10/src/factorforge/core/experiment.py +282 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/core/host_model.py +0 -1
- factorforge_cds-3.5.10/src/factorforge/core/policy.py +403 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/core/reranker.py +2 -2
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/core/slate_engine.py +0 -2
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/core/slate_generator.py +0 -1
- factorforge_cds-3.5.10/src/factorforge/data/human_stemcell_codons.json +329 -0
- factorforge_cds-3.5.10/src/factorforge/data/profiles/human_stemcell_derived_codons.json +329 -0
- factorforge_cds-3.5.10/src/factorforge/data/profiles/human_stemcell_policy.json +76 -0
- factorforge_cds-3.5.10/src/factorforge/database.py +450 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/db/connector.py +3 -4
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/__init__.py +26 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/dp_v2.py +1 -1
- factorforge_cds-3.5.10/src/factorforge/engines/dp_v2_2.py +617 -0
- factorforge_cds-3.5.10/src/factorforge/engines/dp_v2_3.py +770 -0
- factorforge_cds-3.5.10/src/factorforge/engines/local_rewriter.py +1575 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/utils.py +1 -0
- factorforge_cds-3.5.10/src/factorforge/engines/sllm/adapters.py +241 -0
- factorforge_cds-3.5.10/src/factorforge/engines/stemcell_3dp.py +395 -0
- factorforge_cds-3.5.10/src/factorforge/engines/structural_pause.py +219 -0
- factorforge_cds-3.5.10/src/factorforge/engines/structure_web.py +111 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/targeted_remediator.py +3 -3
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/evaluation/evaluator.py +1 -1
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/evaluation/metrics.py +1 -1
- factorforge_cds-3.5.10/src/factorforge/guards/__init__.py +15 -0
- factorforge_cds-3.5.10/src/factorforge/guards/initiation_mfe.py +141 -0
- factorforge_cds-3.5.10/src/factorforge/guards/plant_rna_guards.py +303 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/io/__init__.py +2 -2
- factorforge_cds-3.5.10/src/factorforge/io/package_compiler.py +467 -0
- factorforge_cds-3.5.10/src/factorforge/nbfold/__init__.py +94 -0
- factorforge_cds-3.5.10/src/factorforge/nbfold/annotations.py +1743 -0
- factorforge_cds-3.5.10/src/factorforge/nbfold/bridge.py +1200 -0
- factorforge_cds-3.5.10/src/factorforge/nbfold/cli.py +228 -0
- factorforge_cds-3.5.10/src/factorforge/nbfold/contracts.py +303 -0
- factorforge_cds-3.5.10/src/factorforge/nbfold/pipeline.py +1580 -0
- factorforge_cds-3.5.10/src/factorforge/pipeline/__init__.py +5 -0
- factorforge_cds-3.5.10/src/factorforge/pipeline/design_pipeline.py +631 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/profiles/profile_snapshot.py +1 -2
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/registry/method_registry.py +1 -1
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/registry/version_manifest.json +30 -3
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/review/evaluation_integrity.py +1 -1
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/rules/registry.py +80 -5
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/schemas/evidence.py +0 -1
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/scoring/quantization.py +1 -1
- factorforge_cds-3.5.10/src/factorforge/structure/__init__.py +11 -0
- factorforge_cds-3.5.10/src/factorforge/structure/auto_annotator.py +296 -0
- factorforge_cds-3.5.10/src/factorforge/structure/auto_resolver.py +174 -0
- factorforge_cds-3.5.10/src/factorforge/telemetry/__init__.py +19 -0
- factorforge_cds-3.5.10/src/factorforge/telemetry/gcs_reconciliation.py +266 -0
- factorforge_cds-3.5.10/src/factorforge/telemetry/training_logger.py +600 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/validation/hub.py +0 -1
- factorforge_cds-3.5.10/src/factorforge/validation/tradeoff_suite.py +591 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge_cds.egg-info/PKG-INFO +62 -7
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge_cds.egg-info/SOURCES.txt +68 -2
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge_cds.egg-info/requires.txt +1 -0
- factorforge_cds-3.5.10/src/factorforge_cds.egg-info/top_level.txt +1 -0
- factorforge_cds-3.5.10/tests/test_3dp_review_regressions.py +33 -0
- factorforge_cds-3.5.10/tests/test_3dp_validation_suite.py +149 -0
- factorforge_cds-3.5.10/tests/test_auto_annotator.py +111 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_benchmark_harness.py +0 -3
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_benchmark_regression.py +2 -1
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_benchmark_scoring.py +0 -2
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_benchmark_smoke.py +2 -2
- factorforge_cds-3.5.10/tests/test_candidate_review_safety.py +98 -0
- factorforge_cds-3.5.10/tests/test_database.py +121 -0
- factorforge_cds-3.5.10/tests/test_database_configuration.py +119 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_dp_v2_1_initiation.py +3 -3
- factorforge_cds-3.5.10/tests/test_dp_v2_2_0.py +153 -0
- factorforge_cds-3.5.10/tests/test_dp_v2_3_0.py +184 -0
- factorforge_cds-3.5.10/tests/test_durable_reconciliation.py +225 -0
- factorforge_cds-3.5.10/tests/test_enterprise_integration_396.py +142 -0
- factorforge_cds-3.5.10/tests/test_hpx_viewer.py +125 -0
- factorforge_cds-3.5.10/tests/test_initiation_mfe.py +54 -0
- factorforge_cds-3.5.10/tests/test_job350_codon_twins.py +159 -0
- factorforge_cds-3.5.10/tests/test_job351_closed_loop_foundation.py +253 -0
- factorforge_cds-3.5.10/tests/test_job355_design_experiment.py +523 -0
- factorforge_cds-3.5.10/tests/test_learning_workflow_boundary.py +11 -0
- factorforge_cds-3.5.10/tests/test_local_rewriter.py +353 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_multi_engine_governance.py +3 -3
- factorforge_cds-3.5.10/tests/test_nbfold_phase_c.py +767 -0
- factorforge_cds-3.5.10/tests/test_nbfold_phase_c_benchmark.py +817 -0
- factorforge_cds-3.5.10/tests/test_nbfold_pipeline.py +897 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_no_raw_sequence_logging.py +0 -1
- factorforge_cds-3.5.10/tests/test_oct23_review.py +73 -0
- factorforge_cds-3.5.10/tests/test_onnx_adapter_contract.py +126 -0
- factorforge_cds-3.5.10/tests/test_plant_rna_guards.py +139 -0
- factorforge_cds-3.5.10/tests/test_policy_type_iis_targets.py +30 -0
- factorforge_cds-3.5.10/tests/test_public_surface_scanner.py +37 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_quantized_scoring.py +0 -1
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_rule_registry.py +32 -1
- factorforge_cds-3.5.10/tests/test_scientific_web_397.py +168 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_sllm_biological_pipeline.py +8 -2
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_slm_interface.py +0 -1
- factorforge_cds-3.5.10/tests/test_stemcell_3dp.py +255 -0
- factorforge_cds-3.5.10/tests/test_structural_pause.py +82 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_suite_capability_compat.py +13 -4
- factorforge_cds-3.5.10/tests/test_training_logger.py +266 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_version_manifest.py +5 -2
- factorforge_cds-3.5.3/src/factorforge/database.py +0 -147
- factorforge_cds-3.5.3/src/factorforge/engines/sllm/adapters.py +0 -193
- factorforge_cds-3.5.3/src/factorforge_cds.egg-info/top_level.txt +0 -3
- factorforge_cds-3.5.3/src/scratch/integrity_test.py +0 -100
- factorforge_cds-3.5.3/src/scripts/seed_fixtures.py +0 -107
- factorforge_cds-3.5.3/tests/test_database.py +0 -47
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/LICENSE +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/setup.cfg +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/__init__.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/__main__.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/analysis/__init__.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/analysis/feasibility.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/benchmark/models.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/cli/__init__.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/cli/benchmark_cli.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/cli/legacy_cli.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/constraints/__init__.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/constraints/type_iis.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/core/interfaces/__init__.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/core/interfaces/exporter.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/core/interfaces/optimizer.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/core/interfaces/validator.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/nbenthamiana_codons.json +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/nbenthamiana_golden_set.json +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/ntabacum_codons.json +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/profiles/nbev11_cds_all_derived_codons.json +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/profiles/nbev11_cds_all_derived_filtered_stats.json +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/profiles/nbev11_cds_all_derived_manifest.json +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/profiles/nbev11_cds_hc_derived_codons.json +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/profiles/nbev11_cds_hc_derived_filtered_stats.json +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/profiles/nbev11_cds_hc_derived_manifest.json +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/profiles/qld183_v103_derived_codons.json +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/profiles/qld183_v103_derived_manifest.json +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/profiles/qld183_v103_filtered_stats.json +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/reference/reference_policy_manifest.json +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/templates/high_expression.json +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/templates/standard_expression.json +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/wolffia_globosa_codons.json +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/db/__init__.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/design_review.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/discovery/__init__.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/discovery/acquisition.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/discovery/acquisition_logger.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/discovery/filter.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/discovery/generator.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/discovery/panel_builder.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/discovery/schemas.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/discovery/slate.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/discovery/traits.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/balanced_optimizer.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/dp_adapter.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/dp_v2_1.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/dp_v2_1_1.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/lm/__init__.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/lm/adapter.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/lm/diagnostics.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/lm/inference.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/lm/models/__init__.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/lm/models/mbart_codon.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/lm/tokenizer/control_tokenizer.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/__init__.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/codon_table_builder.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/construct_builder.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/exporter.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/optimizer.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/pipeline.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/rules/__init__.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/rules/domesticator.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/rules/reverse_translator.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/rules/rule_engine.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/scoring.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/scoring_ml.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/validator.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/registry.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/sllm/automaton.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/sllm/compiler.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/sllm/data/__init__.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/sllm/data/corpus_builder.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/sllm/data/tokenizer.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/sllm/decoder.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/sllm/interfaces.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/sllm/model/__init__.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/sllm/model/arch.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/sllm/model/baselines.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/sllm/model/export_onnx.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/evaluation/evidence_logger.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/evaluation/models.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/io/fasta.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/io/validation.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/learning/__init__.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/learning/ranker.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/protein_risk/__init__.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/protein_risk/annotate.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/protein_risk/kd_scale.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/protein_risk/risk_classifier.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/protein_risk/sp_predict.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/protein_risk/tm_predict.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/registry/__init__.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/registry/model_registry.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/registry/registry_loader.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/registry/versioning.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/review/__init__.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/rules/models.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/schemas/__init__.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/schemas/design_package.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/schemas/design_package.schema.json +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/schemas/run_config.schema.json +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/sops/config.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/utils/__init__.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/utils/construct_id.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/utils/exceptions.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/utils/restriction_sites.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/utils/sequence_identity.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/utils/sequence_validator.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/utils/validation.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/validation/__init__.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/validation/cli.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/validation/package_generator.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/validation_registry.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/validation_report.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge_cds.egg-info/dependency_links.txt +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge_cds.egg-info/entry_points.txt +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_baselines.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_benchmark_cli_output_guard.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_benchmark_codon_table_metadata.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_cai.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_codon_table_manifest.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_cross_engine_evaluation.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_db_connector.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_design_package_schema.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_design_package_semantics.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_design_package_serialization.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_design_review.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_docs_consistency.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_dp_v2_1_1.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_fasta_io.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_gc_content.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_host_profile_metadata.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_iupac_validation.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_legacy_cli.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_lm_alpha_contract.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_math_v2_dp_optimality.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_openbio_missing_metric_contract.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_optional_postgres.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_parameter_registry.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_partial_dp_rescue.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_prepare_lm_dataset.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_protein_risk.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_registry_production_sync.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_restriction_sites.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_sequence_validator.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_slm_decoder.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_sop_profile.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_translation_integrity.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_validation_contract_compat.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_validation_registry.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_validation_report.py +0 -0
- {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_worked_example.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: factorforge-cds
|
|
3
|
-
Version: 3.5.
|
|
3
|
+
Version: 3.5.10
|
|
4
4
|
Summary: FactorForge - open-source CDS design and pre-synthesis sequence review by Eijex.
|
|
5
5
|
Author-email: Eijex <eijex.lab@gmail.com>
|
|
6
6
|
License-Expression: AGPL-3.0-only
|
|
@@ -22,6 +22,7 @@ Requires-Dist: pydantic>=2.0
|
|
|
22
22
|
Provides-Extra: postgres
|
|
23
23
|
Requires-Dist: psycopg2-binary>=2.9; extra == "postgres"
|
|
24
24
|
Requires-Dist: sqlalchemy>=2.0; extra == "postgres"
|
|
25
|
+
Requires-Dist: eijex-db-core==0.1.2; extra == "postgres"
|
|
25
26
|
Provides-Extra: dev
|
|
26
27
|
Requires-Dist: jsonschema>=4.0; extra == "dev"
|
|
27
28
|
Requires-Dist: pandas>=2.0; extra == "dev"
|
|
@@ -51,7 +52,7 @@ Dynamic: license-file
|
|
|
51
52
|
|
|
52
53
|
FactorForge performs deterministic CDS design with CAI/GC metrics, PolyA-signal screening, and Golden Gate/MoClo-aware checks. It is positioned as a pre-synthesis review harness: it helps teams generate reproducible CDS candidates, inspect assembly-relevant sequence constraints, and package design metadata before downstream synthesis, cloning, or experimental review. Primary support: *N. benthamiana* (agroinfiltration). Experimental host context: Tobacco BY-2 (`--host by2`).
|
|
53
54
|
|
|
54
|
-
FactorForge v3.5.
|
|
55
|
+
FactorForge v3.5.10 uses independently versioned engines:
|
|
55
56
|
|
|
56
57
|
| Generation | Engine | Version | Availability |
|
|
57
58
|
|---|---|---:|---|
|
|
@@ -89,6 +90,12 @@ Or use the **[web app](https://factorforge.eijex.com)** — no installation requ
|
|
|
89
90
|
|
|
90
91
|
## Repository Structure
|
|
91
92
|
|
|
93
|
+
Experimental codon-distribution and evidence-ledger modules in the development
|
|
94
|
+
checkout are scaffolds, not a validated laboratory policy or active learned
|
|
95
|
+
recommendation service. Computational checks do not establish synthesis readiness
|
|
96
|
+
or biological performance. Private inputs and collaborator packages must remain
|
|
97
|
+
outside public repositories and dashboards.
|
|
98
|
+
|
|
92
99
|
The supported deterministic engines are the profile engine, stable DP v2, and
|
|
93
100
|
the explicit DP v2.1.1 development candidate under:
|
|
94
101
|
|
|
@@ -107,7 +114,7 @@ are available, a separately evaluated 5′ MFE value. It is not the default; its
|
|
|
107
114
|
single-target calibration does not establish holdout generalization or biological
|
|
108
115
|
performance.
|
|
109
116
|
|
|
110
|
-
The v3.5.
|
|
117
|
+
The v3.5.x discovery-slate surface generates versioned Top-K research candidates,
|
|
111
118
|
applies a shared deterministic hard-constraint filter, and records generator and
|
|
112
119
|
fallback lineage. The sLLM path is disabled by default. A partial-DP rescue solves
|
|
113
120
|
an exact suffix conditioned on the retained prefix; it is not a claim of global
|
|
@@ -127,7 +134,7 @@ FactorForge outputs are **in-silico only** and have not been experimentally vali
|
|
|
127
134
|
## Citing
|
|
128
135
|
|
|
129
136
|
```
|
|
130
|
-
FactorForge v3.5.
|
|
137
|
+
FactorForge v3.5.10 (2026). Open-source constraint-based CDS design and sequence review.
|
|
131
138
|
Eijex. https://github.com/eijex/factorforge-cds
|
|
132
139
|
```
|
|
133
140
|
|
|
@@ -139,9 +146,20 @@ Mun-Kyu Kim ([@eijex](https://github.com/eijex))
|
|
|
139
146
|
|
|
140
147
|
## Optional PostgreSQL support
|
|
141
148
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
149
|
+
FactorForge design, CLI, Python API, and file export do not require a database.
|
|
150
|
+
PostgreSQL persistence is an explicit Eijex integration path for retaining shared
|
|
151
|
+
campaign and candidate identities; it is not enabled by default.
|
|
152
|
+
|
|
153
|
+
The extra pins `eijex-db-core==0.1.2`. Supply its approved wheel bundle using
|
|
154
|
+
`pip install --find-links PATH_TO_BUNDLE "factorforge-cds[postgres]"`; the shared
|
|
155
|
+
package is not assumed to have been published on PyPI. Standalone installation
|
|
156
|
+
does not require it.
|
|
157
|
+
The deployment must also provide a compatible `eijex-db-core` package and set
|
|
158
|
+
`FACTORFORGE_DATABASE_URL`. FactorForge contains no default database credentials and
|
|
159
|
+
does not silently fall back to another backend. See [Persistence](docs/persistence.md).
|
|
160
|
+
|
|
161
|
+
Explicit local SQLite research checkpoints in `factorforge.db.connector` remain a
|
|
162
|
+
separate local-only utility and are not the shared DBTL system of record.
|
|
145
163
|
|
|
146
164
|
## License
|
|
147
165
|
|
|
@@ -168,3 +186,40 @@ GNU Affero General Public License v3.0 — see [LICENSE](LICENSE).
|
|
|
168
186
|
- **Eijex MCP** — [mcp.eijex.com](https://mcp.eijex.com)
|
|
169
187
|
- **Lab** — [www.eijex.com](https://www.eijex.com)
|
|
170
188
|
|
|
189
|
+
|
|
190
|
+
## Testing status
|
|
191
|
+
|
|
192
|
+
The web UI now labels watermark as disabled and distinguishes the sequence-only baseline from experimental structure-conditioned testing. The local approved workflow supports explicit 1DP-only or paired 3DP mode. 3DP availability is local research testing; it is not a new public optimization endpoint or a biological-performance claim. See [web UI boundaries](web/README.md).
|
|
193
|
+
|
|
194
|
+
## Direct 3DP browser testing (unreleased)
|
|
195
|
+
|
|
196
|
+
The FactorForge form supports explicit 1DP/3DP selection. 3DP uploads a PDB/mmCIF file, selects chain and one-based file model order, and requires reviewed one-based protein positions. The selected observed chain must exactly match the complete protein; partial or homologous structures require the retained local reviewed mapping workflow. Direct requests use `/api/optimize` with `design_mode=paired_3dp` and `structure_context={content,format,chain,model,positions,positions_reviewed,target_adaptiveness,penalty_weight}`.
|
|
197
|
+
|
|
198
|
+
Limits: 3–300 amino acids, structure content 250 KB, HTTP JSON body 1 MB. Both candidates use the configured codon reference, requested GC and canonical motif exclusions plus custom additions. Invalid inputs and infeasible candidates fail without a baseline fallback. Existing sequence-only settings and API requests remain supported. 3DP uses its explicit DP settings and does not apply Kozak, TpA, template or seed transformations. SOP checks are reported for both candidates; regeneration is manual and never silently changes mode. Watermark stays disabled.
|
|
199
|
+
|
|
200
|
+
This is stateless computational testing, with no external service dependencies or remote database recording. Those existing integrations remain available for later operational use. The structure file is not retained in the response or browser history; normal design results may be retained in local browser history. Submit only public-safe inputs. Structural conformity metrics are codon-weight proxies, not folding/expression measurements. These source changes are not deployed or a new package release.
|
|
201
|
+
|
|
202
|
+
## Current public policy UI (2026-10-12)
|
|
203
|
+
|
|
204
|
+
Custom SOP management is paused. The built-in FactorForge default policy is applied; upload/export/preset/editing controls are hidden and disabled. Their code and previous browser configuration remain available for later reactivation through ENABLE_CUSTOM_SOP. Saved custom SOPs are ignored without deletion. 1DP/3DP mode selection and explicit structure inputs remain active. This supersedes the earlier public SOP upload/export instructions. Public API contracts are retained.
|
|
205
|
+
|
|
206
|
+
### Scientific web observations
|
|
207
|
+
|
|
208
|
+
Direct 1DP/3DP browser testing reports sense-CDS RNA motif scans and available initiation-window MFE in results, downloadable reports and local history. Structure confidence observations can suggest positions for explicit acceptance and review; unsupported inputs do not invent positions. These checks do not establish expression, yield or folding benefits. The default policy remains active and custom SOP management remains paused. See `docs/experimental-structure.md` for the API and measurement boundary.
|
|
209
|
+
|
|
210
|
+
### Local reviewed structure file workflow
|
|
211
|
+
|
|
212
|
+
`factorforge nbfold annotate` and `factorforge nbfold optimize` provide the experimental local Phase A/B workflow for exact-match structure files and an explicit user review manifest. See [NB-Fold documentation](docs/experimental-structure.md).
|
|
213
|
+
|
|
214
|
+
Web structure handling now requires exact-match uploaded PDB/mmCIF coordinates and explicit reviewed positions. Automatic external folding, artificial structure/confidence fallback, and auto-approval are disabled. Structure metrics are synthetic reconstruction checks; independent public-structure/DSSP validation remains open.
|
|
215
|
+
|
|
216
|
+
### Experimental human-reference prototype
|
|
217
|
+
|
|
218
|
+
`factorforge.engines.stemcell_3dp.StemCell3DPOptimizer` is a local experimental interface using a generic human-frequency reference and provisional Eijex review criteria. It is not an MSC/iPSC-calibrated model or a laboratory-approved SOP. See [prototype boundaries](docs/model_cards/human-reference-prototype.md). It is not a new production web host.
|
|
219
|
+
# Local research candidate: DP v2.2
|
|
220
|
+
|
|
221
|
+
The opt-in Python `DPV220Optimizer` shares the v2.1.1 DP core and adds reviewed
|
|
222
|
+
position penalties. The experimental generic-human adapter uses this core;
|
|
223
|
+
existing plant web/NB-Fold routes retain their prior objective. See the
|
|
224
|
+
[model card](docs/model_cards/dp_v2_2.md) for usage, relaxation reporting and
|
|
225
|
+
engineering validation boundaries. This is not an expression or folding claim.
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
FactorForge performs deterministic CDS design with CAI/GC metrics, PolyA-signal screening, and Golden Gate/MoClo-aware checks. It is positioned as a pre-synthesis review harness: it helps teams generate reproducible CDS candidates, inspect assembly-relevant sequence constraints, and package design metadata before downstream synthesis, cloning, or experimental review. Primary support: *N. benthamiana* (agroinfiltration). Experimental host context: Tobacco BY-2 (`--host by2`).
|
|
16
16
|
|
|
17
|
-
FactorForge v3.5.
|
|
17
|
+
FactorForge v3.5.10 uses independently versioned engines:
|
|
18
18
|
|
|
19
19
|
| Generation | Engine | Version | Availability |
|
|
20
20
|
|---|---|---:|---|
|
|
@@ -52,6 +52,12 @@ Or use the **[web app](https://factorforge.eijex.com)** — no installation requ
|
|
|
52
52
|
|
|
53
53
|
## Repository Structure
|
|
54
54
|
|
|
55
|
+
Experimental codon-distribution and evidence-ledger modules in the development
|
|
56
|
+
checkout are scaffolds, not a validated laboratory policy or active learned
|
|
57
|
+
recommendation service. Computational checks do not establish synthesis readiness
|
|
58
|
+
or biological performance. Private inputs and collaborator packages must remain
|
|
59
|
+
outside public repositories and dashboards.
|
|
60
|
+
|
|
55
61
|
The supported deterministic engines are the profile engine, stable DP v2, and
|
|
56
62
|
the explicit DP v2.1.1 development candidate under:
|
|
57
63
|
|
|
@@ -70,7 +76,7 @@ are available, a separately evaluated 5′ MFE value. It is not the default; its
|
|
|
70
76
|
single-target calibration does not establish holdout generalization or biological
|
|
71
77
|
performance.
|
|
72
78
|
|
|
73
|
-
The v3.5.
|
|
79
|
+
The v3.5.x discovery-slate surface generates versioned Top-K research candidates,
|
|
74
80
|
applies a shared deterministic hard-constraint filter, and records generator and
|
|
75
81
|
fallback lineage. The sLLM path is disabled by default. A partial-DP rescue solves
|
|
76
82
|
an exact suffix conditioned on the retained prefix; it is not a claim of global
|
|
@@ -90,7 +96,7 @@ FactorForge outputs are **in-silico only** and have not been experimentally vali
|
|
|
90
96
|
## Citing
|
|
91
97
|
|
|
92
98
|
```
|
|
93
|
-
FactorForge v3.5.
|
|
99
|
+
FactorForge v3.5.10 (2026). Open-source constraint-based CDS design and sequence review.
|
|
94
100
|
Eijex. https://github.com/eijex/factorforge-cds
|
|
95
101
|
```
|
|
96
102
|
|
|
@@ -102,9 +108,20 @@ Mun-Kyu Kim ([@eijex](https://github.com/eijex))
|
|
|
102
108
|
|
|
103
109
|
## Optional PostgreSQL support
|
|
104
110
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
111
|
+
FactorForge design, CLI, Python API, and file export do not require a database.
|
|
112
|
+
PostgreSQL persistence is an explicit Eijex integration path for retaining shared
|
|
113
|
+
campaign and candidate identities; it is not enabled by default.
|
|
114
|
+
|
|
115
|
+
The extra pins `eijex-db-core==0.1.2`. Supply its approved wheel bundle using
|
|
116
|
+
`pip install --find-links PATH_TO_BUNDLE "factorforge-cds[postgres]"`; the shared
|
|
117
|
+
package is not assumed to have been published on PyPI. Standalone installation
|
|
118
|
+
does not require it.
|
|
119
|
+
The deployment must also provide a compatible `eijex-db-core` package and set
|
|
120
|
+
`FACTORFORGE_DATABASE_URL`. FactorForge contains no default database credentials and
|
|
121
|
+
does not silently fall back to another backend. See [Persistence](docs/persistence.md).
|
|
122
|
+
|
|
123
|
+
Explicit local SQLite research checkpoints in `factorforge.db.connector` remain a
|
|
124
|
+
separate local-only utility and are not the shared DBTL system of record.
|
|
108
125
|
|
|
109
126
|
## License
|
|
110
127
|
|
|
@@ -131,3 +148,40 @@ GNU Affero General Public License v3.0 — see [LICENSE](LICENSE).
|
|
|
131
148
|
- **Eijex MCP** — [mcp.eijex.com](https://mcp.eijex.com)
|
|
132
149
|
- **Lab** — [www.eijex.com](https://www.eijex.com)
|
|
133
150
|
|
|
151
|
+
|
|
152
|
+
## Testing status
|
|
153
|
+
|
|
154
|
+
The web UI now labels watermark as disabled and distinguishes the sequence-only baseline from experimental structure-conditioned testing. The local approved workflow supports explicit 1DP-only or paired 3DP mode. 3DP availability is local research testing; it is not a new public optimization endpoint or a biological-performance claim. See [web UI boundaries](web/README.md).
|
|
155
|
+
|
|
156
|
+
## Direct 3DP browser testing (unreleased)
|
|
157
|
+
|
|
158
|
+
The FactorForge form supports explicit 1DP/3DP selection. 3DP uploads a PDB/mmCIF file, selects chain and one-based file model order, and requires reviewed one-based protein positions. The selected observed chain must exactly match the complete protein; partial or homologous structures require the retained local reviewed mapping workflow. Direct requests use `/api/optimize` with `design_mode=paired_3dp` and `structure_context={content,format,chain,model,positions,positions_reviewed,target_adaptiveness,penalty_weight}`.
|
|
159
|
+
|
|
160
|
+
Limits: 3–300 amino acids, structure content 250 KB, HTTP JSON body 1 MB. Both candidates use the configured codon reference, requested GC and canonical motif exclusions plus custom additions. Invalid inputs and infeasible candidates fail without a baseline fallback. Existing sequence-only settings and API requests remain supported. 3DP uses its explicit DP settings and does not apply Kozak, TpA, template or seed transformations. SOP checks are reported for both candidates; regeneration is manual and never silently changes mode. Watermark stays disabled.
|
|
161
|
+
|
|
162
|
+
This is stateless computational testing, with no external service dependencies or remote database recording. Those existing integrations remain available for later operational use. The structure file is not retained in the response or browser history; normal design results may be retained in local browser history. Submit only public-safe inputs. Structural conformity metrics are codon-weight proxies, not folding/expression measurements. These source changes are not deployed or a new package release.
|
|
163
|
+
|
|
164
|
+
## Current public policy UI (2026-10-12)
|
|
165
|
+
|
|
166
|
+
Custom SOP management is paused. The built-in FactorForge default policy is applied; upload/export/preset/editing controls are hidden and disabled. Their code and previous browser configuration remain available for later reactivation through ENABLE_CUSTOM_SOP. Saved custom SOPs are ignored without deletion. 1DP/3DP mode selection and explicit structure inputs remain active. This supersedes the earlier public SOP upload/export instructions. Public API contracts are retained.
|
|
167
|
+
|
|
168
|
+
### Scientific web observations
|
|
169
|
+
|
|
170
|
+
Direct 1DP/3DP browser testing reports sense-CDS RNA motif scans and available initiation-window MFE in results, downloadable reports and local history. Structure confidence observations can suggest positions for explicit acceptance and review; unsupported inputs do not invent positions. These checks do not establish expression, yield or folding benefits. The default policy remains active and custom SOP management remains paused. See `docs/experimental-structure.md` for the API and measurement boundary.
|
|
171
|
+
|
|
172
|
+
### Local reviewed structure file workflow
|
|
173
|
+
|
|
174
|
+
`factorforge nbfold annotate` and `factorforge nbfold optimize` provide the experimental local Phase A/B workflow for exact-match structure files and an explicit user review manifest. See [NB-Fold documentation](docs/experimental-structure.md).
|
|
175
|
+
|
|
176
|
+
Web structure handling now requires exact-match uploaded PDB/mmCIF coordinates and explicit reviewed positions. Automatic external folding, artificial structure/confidence fallback, and auto-approval are disabled. Structure metrics are synthetic reconstruction checks; independent public-structure/DSSP validation remains open.
|
|
177
|
+
|
|
178
|
+
### Experimental human-reference prototype
|
|
179
|
+
|
|
180
|
+
`factorforge.engines.stemcell_3dp.StemCell3DPOptimizer` is a local experimental interface using a generic human-frequency reference and provisional Eijex review criteria. It is not an MSC/iPSC-calibrated model or a laboratory-approved SOP. See [prototype boundaries](docs/model_cards/human-reference-prototype.md). It is not a new production web host.
|
|
181
|
+
# Local research candidate: DP v2.2
|
|
182
|
+
|
|
183
|
+
The opt-in Python `DPV220Optimizer` shares the v2.1.1 DP core and adds reviewed
|
|
184
|
+
position penalties. The experimental generic-human adapter uses this core;
|
|
185
|
+
existing plant web/NB-Fold routes retain their prior objective. See the
|
|
186
|
+
[model card](docs/model_cards/dp_v2_2.md) for usage, relaxation reporting and
|
|
187
|
+
engineering validation boundaries. This is not an expression or folding claim.
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "factorforge-cds"
|
|
7
|
-
version = "3.5.
|
|
7
|
+
version = "3.5.10"
|
|
8
8
|
description = "FactorForge - open-source CDS design and pre-synthesis sequence review by Eijex."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "AGPL-3.0-only"
|
|
@@ -30,6 +30,7 @@ dependencies = [
|
|
|
30
30
|
postgres = [
|
|
31
31
|
"psycopg2-binary>=2.9",
|
|
32
32
|
"sqlalchemy>=2.0",
|
|
33
|
+
"eijex-db-core==0.1.2",
|
|
33
34
|
]
|
|
34
35
|
dev = [
|
|
35
36
|
"jsonschema>=4.0",
|
|
@@ -56,6 +57,7 @@ factorforge-validate = "factorforge.validation.cli:main"
|
|
|
56
57
|
|
|
57
58
|
[tool.setuptools.packages.find]
|
|
58
59
|
where = ["src"]
|
|
60
|
+
include = ["factorforge*"]
|
|
59
61
|
|
|
60
62
|
[tool.setuptools.package-data]
|
|
61
63
|
"factorforge" = ["data/*.json", "data/templates/*.json", "data/profiles/*.json", "data/reference/*.json", "schemas/*.json", "registry/*.json"]
|
|
@@ -68,4 +70,10 @@ pythonpath = ["src"]
|
|
|
68
70
|
[tool.ruff]
|
|
69
71
|
line-length = 100
|
|
70
72
|
target-version = "py310"
|
|
71
|
-
|
|
73
|
+
# Versioned reproducibility deposits are immutable evidence, not maintained code.
|
|
74
|
+
exclude = ["archive", "reproducibility"]
|
|
75
|
+
|
|
76
|
+
[tool.ruff.lint.per-file-ignores]
|
|
77
|
+
# Tests initialize paths/optional-dependency skips before importing modules.
|
|
78
|
+
"tests/**" = ["E402"]
|
|
79
|
+
"benchmarks/test_data/test_toy_flip.py" = ["E402"]
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import collections
|
|
5
6
|
import json
|
|
6
7
|
import math
|
|
7
8
|
from collections import Counter
|
|
@@ -434,9 +435,6 @@ def detect_invalid_codons(sequence: str) -> list[dict[str, Any]]:
|
|
|
434
435
|
elif codon not in STANDARD_GENETIC_CODE:
|
|
435
436
|
findings.append({"start": start, "end": start + 3, "codon": codon, "reason": "unknown"})
|
|
436
437
|
return findings
|
|
437
|
-
import math
|
|
438
|
-
import collections
|
|
439
|
-
|
|
440
438
|
def calculate_synonymous_entropy(sequence, codon_to_aa):
|
|
441
439
|
from factorforge.analysis.metrics import _codons
|
|
442
440
|
codons = _codons(sequence)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import List, Dict
|
|
1
|
+
from typing import List, Dict
|
|
2
2
|
import time
|
|
3
3
|
import hashlib
|
|
4
4
|
|
|
@@ -108,7 +108,6 @@ class BenchmarkRunner:
|
|
|
108
108
|
pass_counts = {}
|
|
109
109
|
total_targets = len(set(r.target_id for r in results))
|
|
110
110
|
|
|
111
|
-
cai_sums = {}
|
|
112
111
|
cai_vals = {}
|
|
113
112
|
gc_sums = {}
|
|
114
113
|
engine_counts = {}
|
|
@@ -7,18 +7,18 @@ Usage:
|
|
|
7
7
|
factorforge list-engines
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
|
-
from pathlib import Path
|
|
11
10
|
import hashlib
|
|
12
11
|
import json
|
|
13
12
|
import sys
|
|
13
|
+
from pathlib import Path
|
|
14
14
|
|
|
15
15
|
import click
|
|
16
16
|
|
|
17
17
|
from factorforge import __version__
|
|
18
18
|
from factorforge.analysis.feasibility import DEFAULT_CAI_TARGET
|
|
19
19
|
from factorforge.engines import register_builtin_engines
|
|
20
|
-
from factorforge.engines.registry import EngineRegistry
|
|
21
20
|
from factorforge.engines.profile.utils import parse_fasta_records
|
|
21
|
+
from factorforge.engines.registry import EngineRegistry
|
|
22
22
|
|
|
23
23
|
register_builtin_engines()
|
|
24
24
|
|
|
@@ -710,7 +710,10 @@ def evaluate_model(model_id, train_snapshot, eval_snapshot, input_sequence):
|
|
|
710
710
|
mock_train_seqs = ["ATGGCTAAATGGTAA", "ATGCGTACGTGCTAG"]
|
|
711
711
|
mock_eval_seqs = ["ATGCCCGGGAAATTT"]
|
|
712
712
|
|
|
713
|
-
from factorforge.review.evaluation_integrity import
|
|
713
|
+
from factorforge.review.evaluation_integrity import (
|
|
714
|
+
DatasetLeakageAuditor,
|
|
715
|
+
GenerationMemorizationAuditor,
|
|
716
|
+
)
|
|
714
717
|
|
|
715
718
|
# 2. Dataset Leakage Audit
|
|
716
719
|
ds_auditor = DatasetLeakageAuditor(mock_train_seqs, mock_eval_seqs)
|
|
@@ -914,82 +917,22 @@ def audit(sequence_fasta, reference_codon_profile, exclude_region, output):
|
|
|
914
917
|
Run generic sequence audit to report codon usage, CAI, GC, and AA distribution.
|
|
915
918
|
"""
|
|
916
919
|
_configure_stdio()
|
|
917
|
-
from factorforge.engines.profile.utils import parse_fasta_records
|
|
918
|
-
from factorforge.analysis.metrics import load_codon_usage_table, calculate_cai, calculate_gc, codon_usage_profile, translate_dna
|
|
919
920
|
import hashlib
|
|
920
921
|
import json
|
|
921
|
-
|
|
922
922
|
from pathlib import Path
|
|
923
|
-
fasta_records = parse_fasta_records(Path(sequence_fasta).read_text(encoding='utf-8'))
|
|
924
|
-
if not fasta_records:
|
|
925
|
-
raise click.UsageError(f"No FASTA records found in {sequence_fasta}")
|
|
926
|
-
|
|
927
|
-
results = {}
|
|
928
|
-
for header, sequence in fasta_records:
|
|
929
|
-
seq = sequence.upper().replace("U", "T")
|
|
930
|
-
seq = "".join(seq.split())
|
|
931
|
-
|
|
932
|
-
if exclude_region:
|
|
933
|
-
parts = exclude_region.split(":")
|
|
934
|
-
range_str = parts[-1]
|
|
935
|
-
try:
|
|
936
|
-
start, end = map(int, range_str.split("-"))
|
|
937
|
-
seq = seq[end:] # Naively assume we're removing the N-terminal SP 1-N.
|
|
938
|
-
except ValueError:
|
|
939
|
-
click.echo(f"Warning: Could not parse exclude region {exclude_region}", err=True)
|
|
940
|
-
|
|
941
|
-
table = load_codon_usage_table()
|
|
942
|
-
|
|
943
|
-
cai = calculate_cai(seq, table.codon_weights)
|
|
944
|
-
gc = calculate_gc(seq)
|
|
945
|
-
usage = codon_usage_profile(seq)
|
|
946
|
-
|
|
947
|
-
aa_seq = translate_dna(seq)
|
|
948
|
-
aa_counts = {}
|
|
949
|
-
for aa in aa_seq:
|
|
950
|
-
aa_counts[aa] = aa_counts.get(aa, 0) + 1
|
|
951
|
-
|
|
952
|
-
res = {
|
|
953
|
-
"input_sha256": hashlib.sha256(sequence.encode('utf-8')).hexdigest(),
|
|
954
|
-
"codon_table_sha256": hashlib.sha256(json.dumps(table.codon_weights, sort_keys=True).encode()).hexdigest(),
|
|
955
|
-
"tool_version": "1.0",
|
|
956
|
-
"cai": cai,
|
|
957
|
-
"gc_percent": gc,
|
|
958
|
-
"length": len(seq),
|
|
959
|
-
"aa_counts": aa_counts,
|
|
960
|
-
"codon_counts": usage,
|
|
961
|
-
}
|
|
962
|
-
results[header or "Sequence"] = res
|
|
963
|
-
|
|
964
|
-
if output:
|
|
965
|
-
with open(output, "w", encoding="utf-8") as f:
|
|
966
|
-
json.dump(results, f, indent=2)
|
|
967
|
-
click.echo(f"Audit report saved to: {output}")
|
|
968
|
-
else:
|
|
969
|
-
click.echo(json.dumps(results, indent=2))
|
|
970
923
|
|
|
971
|
-
|
|
972
|
-
@cli.command("audit")
|
|
973
|
-
@click.argument("sequence_fasta", type=click.Path(exists=True))
|
|
974
|
-
@click.option("--reference-codon-profile", default="nbev11", help="Reference codon profile to use")
|
|
975
|
-
@click.option("--exclude-region", help="Region to exclude from analysis (e.g., SP:1-60 or 1-60)")
|
|
976
|
-
@click.option("--output", "-o", type=click.Path(), help="Output path for JSON report")
|
|
977
|
-
def audit(sequence_fasta, reference_codon_profile, exclude_region, output):
|
|
978
|
-
"""
|
|
979
|
-
Run generic sequence audit to report codon usage, CAI, GC, and AA distribution.
|
|
980
|
-
"""
|
|
981
|
-
_configure_stdio()
|
|
982
|
-
from factorforge.engines.profile.utils import parse_fasta_records
|
|
983
924
|
from factorforge.analysis.metrics import (
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
925
|
+
calculate_cai,
|
|
926
|
+
calculate_gc,
|
|
927
|
+
calculate_max_synonymous_share,
|
|
928
|
+
calculate_reference_distance,
|
|
929
|
+
calculate_synonymous_entropy,
|
|
930
|
+
codon_usage_profile,
|
|
931
|
+
load_codon_usage_table,
|
|
932
|
+
translate_dna,
|
|
987
933
|
)
|
|
988
934
|
from factorforge.engines.balanced_optimizer import STANDARD_GENETIC_CODE
|
|
989
|
-
|
|
990
|
-
import hashlib
|
|
991
|
-
import json
|
|
992
|
-
from pathlib import Path
|
|
935
|
+
from factorforge.engines.profile.utils import parse_fasta_records
|
|
993
936
|
|
|
994
937
|
fasta_records = parse_fasta_records(Path(sequence_fasta).read_text(encoding='utf-8'))
|
|
995
938
|
if not fasta_records:
|
|
@@ -1053,6 +996,13 @@ def audit(sequence_fasta, reference_codon_profile, exclude_region, output):
|
|
|
1053
996
|
else:
|
|
1054
997
|
click.echo(json.dumps(results, indent=2))
|
|
1055
998
|
|
|
999
|
+
|
|
1000
|
+
from factorforge.nbfold.cli import nbfold_cli
|
|
1001
|
+
|
|
1002
|
+
cli.add_command(nbfold_cli)
|
|
1003
|
+
|
|
1004
|
+
|
|
1056
1005
|
if __name__ == "__main__":
|
|
1057
1006
|
cli()
|
|
1058
1007
|
|
|
1008
|
+
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""FactorForge Closed-Loop Codon Evidence Foundation Package."""
|
|
2
|
+
|
|
3
|
+
from factorforge.closed_loop.contracts import (
|
|
4
|
+
ConstructRecord,
|
|
5
|
+
ConstructSetRecord,
|
|
6
|
+
ExperimentRecord,
|
|
7
|
+
MeasurementRecord,
|
|
8
|
+
PolicyRecord,
|
|
9
|
+
)
|
|
10
|
+
from factorforge.closed_loop.ledger import EvidenceLedger
|
|
11
|
+
from factorforge.closed_loop.readiness import (
|
|
12
|
+
ModelRecommendationGate,
|
|
13
|
+
ReadinessEvaluator,
|
|
14
|
+
ReadinessStatus,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
__all__ = [
|
|
18
|
+
"ConstructRecord",
|
|
19
|
+
"ConstructSetRecord",
|
|
20
|
+
"EvidenceLedger",
|
|
21
|
+
"ExperimentRecord",
|
|
22
|
+
"MeasurementRecord",
|
|
23
|
+
"ModelRecommendationGate",
|
|
24
|
+
"PolicyRecord",
|
|
25
|
+
"ReadinessEvaluator",
|
|
26
|
+
"ReadinessStatus",
|
|
27
|
+
]
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"""Data contracts and schemas for Closed-Loop DBTL Lineage."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import hashlib
|
|
6
|
+
import json
|
|
7
|
+
import math
|
|
8
|
+
from datetime import datetime, timezone
|
|
9
|
+
|
|
10
|
+
from pydantic import BaseModel, Field, model_validator
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class PolicyRecord(BaseModel):
|
|
14
|
+
"""Metadata record of an approved codon distribution policy."""
|
|
15
|
+
|
|
16
|
+
policy_id: str
|
|
17
|
+
canonical_sha256: str
|
|
18
|
+
target_distribution: dict[str, dict[str, float]]
|
|
19
|
+
region_definition: str = "mature_chain"
|
|
20
|
+
feedback_source_id: str = "unspecified"
|
|
21
|
+
created_at: str = Field(default_factory=lambda: datetime.now(timezone.utc).isoformat())
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class ConstructRecord(BaseModel):
|
|
25
|
+
"""Immutable sequence identity record for a designed construct."""
|
|
26
|
+
|
|
27
|
+
construct_id: str
|
|
28
|
+
cds_sha256: str
|
|
29
|
+
protein_sha256: str
|
|
30
|
+
chain: str # "LC" or "HC"
|
|
31
|
+
watermark_pair_id: str
|
|
32
|
+
watermark_applied: bool
|
|
33
|
+
achieved_distribution: dict[str, dict[str, float]]
|
|
34
|
+
policy_id: str
|
|
35
|
+
engine_version: str = "FactorForge-v3.3.0"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class ConstructSetRecord(BaseModel):
|
|
39
|
+
"""Co-expressed pair of Light Chain and Heavy Chain constructs."""
|
|
40
|
+
|
|
41
|
+
construct_set_id: str
|
|
42
|
+
light_construct_id: str
|
|
43
|
+
heavy_construct_id: str
|
|
44
|
+
watermark_applied: bool
|
|
45
|
+
description: str = ""
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class ExperimentRecord(BaseModel):
|
|
49
|
+
"""Wet-lab or benchmark experiment metadata."""
|
|
50
|
+
|
|
51
|
+
experiment_id: str
|
|
52
|
+
construct_set_id: str
|
|
53
|
+
host: str = "Nicotiana benthamiana"
|
|
54
|
+
expression_system: str = "Agroinfiltration (Transient Leaf Expression)"
|
|
55
|
+
batch_id: str
|
|
56
|
+
experiment_date: str
|
|
57
|
+
protocol_version: str = "unspecified"
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class MeasurementRecord(BaseModel):
|
|
61
|
+
"""Single empirical or synthetic readout record."""
|
|
62
|
+
|
|
63
|
+
measurement_id: str
|
|
64
|
+
experiment_id: str
|
|
65
|
+
construct_set_id: str
|
|
66
|
+
biological_replicate_id: str
|
|
67
|
+
technical_replicate_id: str
|
|
68
|
+
measurement_type: str # "protein_yield", "mrna_abundance", "functional_binding"
|
|
69
|
+
value: float | None
|
|
70
|
+
unit: str # "mg/L", "relative_fold", "%"
|
|
71
|
+
qc_status: str = "PASS" # "PASS", "FAIL", "FLAGGED"
|
|
72
|
+
is_synthetic: bool = (
|
|
73
|
+
False # CRITICAL: If True, flagged as test_only and excluded from real training
|
|
74
|
+
)
|
|
75
|
+
tag: str = "empirical"
|
|
76
|
+
notes: str = ""
|
|
77
|
+
recorded_at: str = Field(default_factory=lambda: datetime.now(timezone.utc).isoformat())
|
|
78
|
+
|
|
79
|
+
@model_validator(mode="after")
|
|
80
|
+
def validate_measurement(self):
|
|
81
|
+
if self.value is not None and not math.isfinite(self.value):
|
|
82
|
+
raise ValueError("Measurement value must be finite or null")
|
|
83
|
+
if self.is_synthetic:
|
|
84
|
+
self.tag = "test_only"
|
|
85
|
+
if self.qc_status not in {"PASS", "FAIL", "FLAGGED"}:
|
|
86
|
+
raise ValueError("Unknown QC status")
|
|
87
|
+
return self
|
|
88
|
+
|
|
89
|
+
@property
|
|
90
|
+
def record_hash(self) -> str:
|
|
91
|
+
payload = {
|
|
92
|
+
"measurement_id": self.measurement_id,
|
|
93
|
+
"experiment_id": self.experiment_id,
|
|
94
|
+
"construct_set_id": self.construct_set_id,
|
|
95
|
+
"biological_replicate_id": self.biological_replicate_id,
|
|
96
|
+
"technical_replicate_id": self.technical_replicate_id,
|
|
97
|
+
"measurement_type": self.measurement_type,
|
|
98
|
+
"value": self.value,
|
|
99
|
+
"unit": self.unit,
|
|
100
|
+
"is_synthetic": self.is_synthetic,
|
|
101
|
+
}
|
|
102
|
+
encoded = json.dumps(payload, sort_keys=True, separators=(",", ":")).encode("utf-8")
|
|
103
|
+
return hashlib.sha256(encoded).hexdigest()
|