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.
Files changed (273) hide show
  1. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/PKG-INFO +62 -7
  2. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/README.md +60 -6
  3. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/pyproject.toml +10 -2
  4. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/analysis/metrics.py +1 -3
  5. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/analysis/sequence_risks.py +1 -1
  6. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/benchmark/runner.py +1 -2
  7. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/cli/main.py +22 -72
  8. factorforge_cds-3.5.10/src/factorforge/closed_loop/__init__.py +27 -0
  9. factorforge_cds-3.5.10/src/factorforge/closed_loop/contracts.py +103 -0
  10. factorforge_cds-3.5.10/src/factorforge/closed_loop/ledger.py +222 -0
  11. factorforge_cds-3.5.10/src/factorforge/closed_loop/readiness.py +172 -0
  12. factorforge_cds-3.5.10/src/factorforge/codon/__init__.py +25 -0
  13. factorforge_cds-3.5.10/src/factorforge/codon/allocator.py +87 -0
  14. factorforge_cds-3.5.10/src/factorforge/codon/policy.py +212 -0
  15. factorforge_cds-3.5.10/src/factorforge/codon/qa.py +166 -0
  16. factorforge_cds-3.5.10/src/factorforge/codon/twin_generator.py +338 -0
  17. factorforge_cds-3.5.10/src/factorforge/core/__init__.py +35 -0
  18. factorforge_cds-3.5.10/src/factorforge/core/experiment.py +282 -0
  19. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/core/host_model.py +0 -1
  20. factorforge_cds-3.5.10/src/factorforge/core/policy.py +403 -0
  21. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/core/reranker.py +2 -2
  22. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/core/slate_engine.py +0 -2
  23. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/core/slate_generator.py +0 -1
  24. factorforge_cds-3.5.10/src/factorforge/data/human_stemcell_codons.json +329 -0
  25. factorforge_cds-3.5.10/src/factorforge/data/profiles/human_stemcell_derived_codons.json +329 -0
  26. factorforge_cds-3.5.10/src/factorforge/data/profiles/human_stemcell_policy.json +76 -0
  27. factorforge_cds-3.5.10/src/factorforge/database.py +450 -0
  28. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/db/connector.py +3 -4
  29. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/__init__.py +26 -0
  30. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/dp_v2.py +1 -1
  31. factorforge_cds-3.5.10/src/factorforge/engines/dp_v2_2.py +617 -0
  32. factorforge_cds-3.5.10/src/factorforge/engines/dp_v2_3.py +770 -0
  33. factorforge_cds-3.5.10/src/factorforge/engines/local_rewriter.py +1575 -0
  34. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/utils.py +1 -0
  35. factorforge_cds-3.5.10/src/factorforge/engines/sllm/adapters.py +241 -0
  36. factorforge_cds-3.5.10/src/factorforge/engines/stemcell_3dp.py +395 -0
  37. factorforge_cds-3.5.10/src/factorforge/engines/structural_pause.py +219 -0
  38. factorforge_cds-3.5.10/src/factorforge/engines/structure_web.py +111 -0
  39. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/targeted_remediator.py +3 -3
  40. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/evaluation/evaluator.py +1 -1
  41. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/evaluation/metrics.py +1 -1
  42. factorforge_cds-3.5.10/src/factorforge/guards/__init__.py +15 -0
  43. factorforge_cds-3.5.10/src/factorforge/guards/initiation_mfe.py +141 -0
  44. factorforge_cds-3.5.10/src/factorforge/guards/plant_rna_guards.py +303 -0
  45. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/io/__init__.py +2 -2
  46. factorforge_cds-3.5.10/src/factorforge/io/package_compiler.py +467 -0
  47. factorforge_cds-3.5.10/src/factorforge/nbfold/__init__.py +94 -0
  48. factorforge_cds-3.5.10/src/factorforge/nbfold/annotations.py +1743 -0
  49. factorforge_cds-3.5.10/src/factorforge/nbfold/bridge.py +1200 -0
  50. factorforge_cds-3.5.10/src/factorforge/nbfold/cli.py +228 -0
  51. factorforge_cds-3.5.10/src/factorforge/nbfold/contracts.py +303 -0
  52. factorforge_cds-3.5.10/src/factorforge/nbfold/pipeline.py +1580 -0
  53. factorforge_cds-3.5.10/src/factorforge/pipeline/__init__.py +5 -0
  54. factorforge_cds-3.5.10/src/factorforge/pipeline/design_pipeline.py +631 -0
  55. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/profiles/profile_snapshot.py +1 -2
  56. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/registry/method_registry.py +1 -1
  57. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/registry/version_manifest.json +30 -3
  58. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/review/evaluation_integrity.py +1 -1
  59. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/rules/registry.py +80 -5
  60. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/schemas/evidence.py +0 -1
  61. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/scoring/quantization.py +1 -1
  62. factorforge_cds-3.5.10/src/factorforge/structure/__init__.py +11 -0
  63. factorforge_cds-3.5.10/src/factorforge/structure/auto_annotator.py +296 -0
  64. factorforge_cds-3.5.10/src/factorforge/structure/auto_resolver.py +174 -0
  65. factorforge_cds-3.5.10/src/factorforge/telemetry/__init__.py +19 -0
  66. factorforge_cds-3.5.10/src/factorforge/telemetry/gcs_reconciliation.py +266 -0
  67. factorforge_cds-3.5.10/src/factorforge/telemetry/training_logger.py +600 -0
  68. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/validation/hub.py +0 -1
  69. factorforge_cds-3.5.10/src/factorforge/validation/tradeoff_suite.py +591 -0
  70. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge_cds.egg-info/PKG-INFO +62 -7
  71. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge_cds.egg-info/SOURCES.txt +68 -2
  72. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge_cds.egg-info/requires.txt +1 -0
  73. factorforge_cds-3.5.10/src/factorforge_cds.egg-info/top_level.txt +1 -0
  74. factorforge_cds-3.5.10/tests/test_3dp_review_regressions.py +33 -0
  75. factorforge_cds-3.5.10/tests/test_3dp_validation_suite.py +149 -0
  76. factorforge_cds-3.5.10/tests/test_auto_annotator.py +111 -0
  77. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_benchmark_harness.py +0 -3
  78. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_benchmark_regression.py +2 -1
  79. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_benchmark_scoring.py +0 -2
  80. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_benchmark_smoke.py +2 -2
  81. factorforge_cds-3.5.10/tests/test_candidate_review_safety.py +98 -0
  82. factorforge_cds-3.5.10/tests/test_database.py +121 -0
  83. factorforge_cds-3.5.10/tests/test_database_configuration.py +119 -0
  84. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_dp_v2_1_initiation.py +3 -3
  85. factorforge_cds-3.5.10/tests/test_dp_v2_2_0.py +153 -0
  86. factorforge_cds-3.5.10/tests/test_dp_v2_3_0.py +184 -0
  87. factorforge_cds-3.5.10/tests/test_durable_reconciliation.py +225 -0
  88. factorforge_cds-3.5.10/tests/test_enterprise_integration_396.py +142 -0
  89. factorforge_cds-3.5.10/tests/test_hpx_viewer.py +125 -0
  90. factorforge_cds-3.5.10/tests/test_initiation_mfe.py +54 -0
  91. factorforge_cds-3.5.10/tests/test_job350_codon_twins.py +159 -0
  92. factorforge_cds-3.5.10/tests/test_job351_closed_loop_foundation.py +253 -0
  93. factorforge_cds-3.5.10/tests/test_job355_design_experiment.py +523 -0
  94. factorforge_cds-3.5.10/tests/test_learning_workflow_boundary.py +11 -0
  95. factorforge_cds-3.5.10/tests/test_local_rewriter.py +353 -0
  96. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_multi_engine_governance.py +3 -3
  97. factorforge_cds-3.5.10/tests/test_nbfold_phase_c.py +767 -0
  98. factorforge_cds-3.5.10/tests/test_nbfold_phase_c_benchmark.py +817 -0
  99. factorforge_cds-3.5.10/tests/test_nbfold_pipeline.py +897 -0
  100. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_no_raw_sequence_logging.py +0 -1
  101. factorforge_cds-3.5.10/tests/test_oct23_review.py +73 -0
  102. factorforge_cds-3.5.10/tests/test_onnx_adapter_contract.py +126 -0
  103. factorforge_cds-3.5.10/tests/test_plant_rna_guards.py +139 -0
  104. factorforge_cds-3.5.10/tests/test_policy_type_iis_targets.py +30 -0
  105. factorforge_cds-3.5.10/tests/test_public_surface_scanner.py +37 -0
  106. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_quantized_scoring.py +0 -1
  107. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_rule_registry.py +32 -1
  108. factorforge_cds-3.5.10/tests/test_scientific_web_397.py +168 -0
  109. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_sllm_biological_pipeline.py +8 -2
  110. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_slm_interface.py +0 -1
  111. factorforge_cds-3.5.10/tests/test_stemcell_3dp.py +255 -0
  112. factorforge_cds-3.5.10/tests/test_structural_pause.py +82 -0
  113. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_suite_capability_compat.py +13 -4
  114. factorforge_cds-3.5.10/tests/test_training_logger.py +266 -0
  115. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_version_manifest.py +5 -2
  116. factorforge_cds-3.5.3/src/factorforge/database.py +0 -147
  117. factorforge_cds-3.5.3/src/factorforge/engines/sllm/adapters.py +0 -193
  118. factorforge_cds-3.5.3/src/factorforge_cds.egg-info/top_level.txt +0 -3
  119. factorforge_cds-3.5.3/src/scratch/integrity_test.py +0 -100
  120. factorforge_cds-3.5.3/src/scripts/seed_fixtures.py +0 -107
  121. factorforge_cds-3.5.3/tests/test_database.py +0 -47
  122. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/LICENSE +0 -0
  123. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/setup.cfg +0 -0
  124. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/__init__.py +0 -0
  125. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/__main__.py +0 -0
  126. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/analysis/__init__.py +0 -0
  127. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/analysis/feasibility.py +0 -0
  128. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/benchmark/models.py +0 -0
  129. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/cli/__init__.py +0 -0
  130. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/cli/benchmark_cli.py +0 -0
  131. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/cli/legacy_cli.py +0 -0
  132. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/constraints/__init__.py +0 -0
  133. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/constraints/type_iis.py +0 -0
  134. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/core/interfaces/__init__.py +0 -0
  135. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/core/interfaces/exporter.py +0 -0
  136. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/core/interfaces/optimizer.py +0 -0
  137. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/core/interfaces/validator.py +0 -0
  138. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/nbenthamiana_codons.json +0 -0
  139. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/nbenthamiana_golden_set.json +0 -0
  140. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/ntabacum_codons.json +0 -0
  141. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/profiles/nbev11_cds_all_derived_codons.json +0 -0
  142. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/profiles/nbev11_cds_all_derived_filtered_stats.json +0 -0
  143. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/profiles/nbev11_cds_all_derived_manifest.json +0 -0
  144. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/profiles/nbev11_cds_hc_derived_codons.json +0 -0
  145. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/profiles/nbev11_cds_hc_derived_filtered_stats.json +0 -0
  146. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/profiles/nbev11_cds_hc_derived_manifest.json +0 -0
  147. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/profiles/qld183_v103_derived_codons.json +0 -0
  148. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/profiles/qld183_v103_derived_manifest.json +0 -0
  149. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/profiles/qld183_v103_filtered_stats.json +0 -0
  150. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/reference/reference_policy_manifest.json +0 -0
  151. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/templates/high_expression.json +0 -0
  152. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/templates/standard_expression.json +0 -0
  153. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/data/wolffia_globosa_codons.json +0 -0
  154. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/db/__init__.py +0 -0
  155. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/design_review.py +0 -0
  156. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/discovery/__init__.py +0 -0
  157. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/discovery/acquisition.py +0 -0
  158. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/discovery/acquisition_logger.py +0 -0
  159. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/discovery/filter.py +0 -0
  160. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/discovery/generator.py +0 -0
  161. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/discovery/panel_builder.py +0 -0
  162. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/discovery/schemas.py +0 -0
  163. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/discovery/slate.py +0 -0
  164. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/discovery/traits.py +0 -0
  165. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/balanced_optimizer.py +0 -0
  166. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/dp_adapter.py +0 -0
  167. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/dp_v2_1.py +0 -0
  168. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/dp_v2_1_1.py +0 -0
  169. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/lm/__init__.py +0 -0
  170. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/lm/adapter.py +0 -0
  171. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/lm/diagnostics.py +0 -0
  172. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/lm/inference.py +0 -0
  173. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/lm/models/__init__.py +0 -0
  174. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/lm/models/mbart_codon.py +0 -0
  175. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/lm/tokenizer/control_tokenizer.py +0 -0
  176. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/__init__.py +0 -0
  177. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/codon_table_builder.py +0 -0
  178. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/construct_builder.py +0 -0
  179. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/exporter.py +0 -0
  180. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/optimizer.py +0 -0
  181. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/pipeline.py +0 -0
  182. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/rules/__init__.py +0 -0
  183. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/rules/domesticator.py +0 -0
  184. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/rules/reverse_translator.py +0 -0
  185. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/rules/rule_engine.py +0 -0
  186. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/scoring.py +0 -0
  187. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/scoring_ml.py +0 -0
  188. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/profile/validator.py +0 -0
  189. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/registry.py +0 -0
  190. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/sllm/automaton.py +0 -0
  191. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/sllm/compiler.py +0 -0
  192. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/sllm/data/__init__.py +0 -0
  193. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/sllm/data/corpus_builder.py +0 -0
  194. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/sllm/data/tokenizer.py +0 -0
  195. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/sllm/decoder.py +0 -0
  196. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/sllm/interfaces.py +0 -0
  197. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/sllm/model/__init__.py +0 -0
  198. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/sllm/model/arch.py +0 -0
  199. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/sllm/model/baselines.py +0 -0
  200. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/engines/sllm/model/export_onnx.py +0 -0
  201. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/evaluation/evidence_logger.py +0 -0
  202. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/evaluation/models.py +0 -0
  203. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/io/fasta.py +0 -0
  204. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/io/validation.py +0 -0
  205. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/learning/__init__.py +0 -0
  206. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/learning/ranker.py +0 -0
  207. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/protein_risk/__init__.py +0 -0
  208. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/protein_risk/annotate.py +0 -0
  209. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/protein_risk/kd_scale.py +0 -0
  210. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/protein_risk/risk_classifier.py +0 -0
  211. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/protein_risk/sp_predict.py +0 -0
  212. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/protein_risk/tm_predict.py +0 -0
  213. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/registry/__init__.py +0 -0
  214. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/registry/model_registry.py +0 -0
  215. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/registry/registry_loader.py +0 -0
  216. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/registry/versioning.py +0 -0
  217. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/review/__init__.py +0 -0
  218. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/rules/models.py +0 -0
  219. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/schemas/__init__.py +0 -0
  220. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/schemas/design_package.py +0 -0
  221. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/schemas/design_package.schema.json +0 -0
  222. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/schemas/run_config.schema.json +0 -0
  223. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/sops/config.py +0 -0
  224. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/utils/__init__.py +0 -0
  225. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/utils/construct_id.py +0 -0
  226. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/utils/exceptions.py +0 -0
  227. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/utils/restriction_sites.py +0 -0
  228. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/utils/sequence_identity.py +0 -0
  229. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/utils/sequence_validator.py +0 -0
  230. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/utils/validation.py +0 -0
  231. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/validation/__init__.py +0 -0
  232. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/validation/cli.py +0 -0
  233. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/validation/package_generator.py +0 -0
  234. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/validation_registry.py +0 -0
  235. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge/validation_report.py +0 -0
  236. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge_cds.egg-info/dependency_links.txt +0 -0
  237. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/src/factorforge_cds.egg-info/entry_points.txt +0 -0
  238. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_baselines.py +0 -0
  239. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_benchmark_cli_output_guard.py +0 -0
  240. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_benchmark_codon_table_metadata.py +0 -0
  241. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_cai.py +0 -0
  242. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_codon_table_manifest.py +0 -0
  243. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_cross_engine_evaluation.py +0 -0
  244. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_db_connector.py +0 -0
  245. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_design_package_schema.py +0 -0
  246. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_design_package_semantics.py +0 -0
  247. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_design_package_serialization.py +0 -0
  248. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_design_review.py +0 -0
  249. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_docs_consistency.py +0 -0
  250. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_dp_v2_1_1.py +0 -0
  251. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_fasta_io.py +0 -0
  252. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_gc_content.py +0 -0
  253. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_host_profile_metadata.py +0 -0
  254. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_iupac_validation.py +0 -0
  255. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_legacy_cli.py +0 -0
  256. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_lm_alpha_contract.py +0 -0
  257. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_math_v2_dp_optimality.py +0 -0
  258. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_openbio_missing_metric_contract.py +0 -0
  259. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_optional_postgres.py +0 -0
  260. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_parameter_registry.py +0 -0
  261. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_partial_dp_rescue.py +0 -0
  262. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_prepare_lm_dataset.py +0 -0
  263. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_protein_risk.py +0 -0
  264. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_registry_production_sync.py +0 -0
  265. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_restriction_sites.py +0 -0
  266. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_sequence_validator.py +0 -0
  267. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_slm_decoder.py +0 -0
  268. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_sop_profile.py +0 -0
  269. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_translation_integrity.py +0 -0
  270. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_validation_contract_compat.py +0 -0
  271. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_validation_registry.py +0 -0
  272. {factorforge_cds-3.5.3 → factorforge_cds-3.5.10}/tests/test_validation_report.py +0 -0
  273. {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
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.1 uses independently versioned engines:
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.1 discovery-slate surface generates versioned Top-K research candidates,
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.3 (2026). Open-source constraint-based CDS design and sequence review.
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
- Install `pip install "factorforge-cds[postgres]"` only when using the PostgreSQL
143
- connector. Explicit local SQLite checkpoints do not require a PostgreSQL driver.
144
- Database integration tests require an explicitly configured `DATABASE_URL`.
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.1 uses independently versioned engines:
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.1 discovery-slate surface generates versioned Top-K research candidates,
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.3 (2026). Open-source constraint-based CDS design and sequence review.
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
- Install `pip install "factorforge-cds[postgres]"` only when using the PostgreSQL
106
- connector. Explicit local SQLite checkpoints do not require a PostgreSQL driver.
107
- Database integration tests require an explicitly configured `DATABASE_URL`.
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.3"
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
- exclude = ["archive"]
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)
@@ -3,7 +3,7 @@
3
3
  Extracted from legacy RuleEngine to serve as shared evaluation metrics.
4
4
  """
5
5
  import re
6
- from typing import Dict, Any, List, Set, Tuple
6
+ from typing import Dict, Any, List
7
7
 
8
8
  # Polyadenylation signals (true biological motifs)
9
9
  POLYA_PATTERNS = {
@@ -1,4 +1,4 @@
1
- from typing import List, Dict, Any, Type
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 DatasetLeakageAuditor, GenerationMemorizationAuditor
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
- load_codon_usage_table, calculate_cai, calculate_gc, codon_usage_profile,
985
- translate_dna, calculate_synonymous_entropy, calculate_max_synonymous_share,
986
- calculate_reference_distance
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()