TNFR Logo
TheoryLearnSoftwareResearch

On this page

TNFR

Resonant Fractal Nature Theory — a mathematical framework for coherent patterns on graph-coupled networks.

About
  • Project history
  • Editorial policy
  • Contact
Resources
  • GitHub
  • PyPI
  • DOI · Zenodo
Legal
  • MIT License
  • Citation
© 2026 TNFR project — MIT licensed.DOI 10.5281/zenodo.17602860
docs
grammar
PHYSICS_VERIFICATION.md
API_CONTRACTS.mdCANONICAL_OZ_SEQUENCES.mdEMPIRICAL_CONFRONTATION_EEG.mdREADME.mdSTRUCTURAL_FIELDS_TETRAD.mdSTRUCTURAL_INTERFACE_THEORY.md
theory
APPLIED_STRUCTURAL_ANALYSIS.mdCATALOG_TYPE_HYGIENE_PROGRAMME.mdDISSIPATIVE_AND_OPEN_SYSTEMS.mdEMERGENT_ONTOLOGY.mdEXTENDED_FIELDS_AND_DERIVED_QUANTITIES.mdFUNDAMENTAL_THEORY.mdGAUGE_SYMMETRY_AND_UNIFICATION.mdGLOSSARY.mdMATHEMATICAL_DYNAMICS_BASIS.mdMINIMAL_STRUCTURAL_DEGREES.mdNUCLEUS_A_PRIME_LADDER_ATLAS.mdNUCLEUS_B_EQUIVARIANCE_OBSTRUCTIONS.mdPHYSICAL_REGIME_CORRESPONDENCES.mdREADME.mdREMESH_INFINITY_DERIVATION.mdSTRUCTURAL_CONSERVATION_THEOREM.mdSTRUCTURAL_OPERATORS.mdSTRUCTURAL_STABILITY_AND_DYNAMICS.mdTNFR_BSD_RESEARCH_NOTES.mdTNFR_HODGE_RESEARCH_NOTES.mdTNFR_NAVIER_STOKES_RESEARCH_NOTES.mdTNFR_NUMBER_THEORY.mdTNFR_P_VS_NP_RESEARCH_NOTES.mdTNFR_RIEMANN_RESEARCH_NOTES.mdTNFR_VARIATIONAL_PRINCIPLE.mdTNFR_YANG_MILLS_RESEARCH_NOTES.mdTNFR.pdfUNIFIED_GRAMMAR_RULES.md
factorization-lab
analysis
analyze_patterns.pycertificate_manifest.py
benchmarks
benchmark_analysis.pybenchmark_expansion_suite.pyfull_spectrum_factorization.pypaley_gap_extended.pypaley_gap_smoke.pytest_benchmark_suite.py
demos
experiment_contexts
exp_0b1663cd19b7.jsonexp_0bf0054b7474.jsonexp_75a4c8ca616a.jsonexp_848ee0fd1857.jsonexp_f6fe00562193.jsonexp_fdf3da424e1e.json
failure_telemetry_batch.pyfeedback_integration_demo.pyintegration_demo_snapshots.dbseed_management_integration_demo.pysnapshot_integration_demo.pytrajectory_143.jsontrajectory_77.jsontrajectory_89.jsontrajectory_91.jsontrajectory_97.json
docs
FACTORING_PLAYBOOK.mdFALSE_POSITIVE_TEST_SUITE.mdOPERATOR_CERTIFICATES.mdROADMAP.mdSPECTRAL_ROUTE.md
experiment_contexts
exp_cebe1d9e7d8e.json
notebooks
spectral_history.ipynb
scripts
run_false_positive_tests.py
tests
run_false_positive_test_suite.pytest_cli.pytest_false_positive_methodology.pytest_false_positive_verifier.pytest_feedback_integration.pytest_partitioning.pytest_seed_management.pytest_self_opt_support.pytest_snapshot_system.pytest_spectral_paley.pytest_verification_robustness.py
tnfr_factorization
__init__.pyapi.pycli.pyfailure_telemetry.pyfeedback_adapter.pyfeedback_integration.pypartitioning.pyself_opt_support.pyspectral_paley.py
demo_snapshots.dbLICENSE_SNAPSHOT.mdPACKAGE_SUMMARY.mdREADME.mdseed_management.pysnapshot_system.pytest_certificate_hashing.pytest_installation.pyverification_trajectory_77.json
benchmarks
analyze_tetrad_universality.pyb0star_alpha_canonical_product_graphs.pybenchmark_optimization_tracks.pybenchmark_utils.pyboundary_vibration.pybridge_primes_riemann.pychiral_involution.pycli_utils.pycoherence_projector_sense_index.pycommutant_bridge.pycomposition_arithmetic.pyconfinement_zones_test.pyconservation_law_validation.pydirected_paley_bridge.pyemergent_arithmetic_pulse.pyemergent_atom_dynamics.pyemergent_atomic_shells.pyemergent_base_dimension.pyemergent_dimension_dynamics.pyemergent_fractal_pulse.pyemergent_fractal_simplex_dimension.pyemergent_integers_symmetry.pyemergent_musical_nfr.pyemergent_nfr_geometry.pyemergent_nfr_where.pyemergent_rationals.pyemergent_rhythm.pyemergent_screening.pyemergent_shell_cardinals.pyemergent_shell_ordering.pyemergent_simplex_dimension.pyemergent_substrate_symmetry.pyequivariance_wall.pyexternal_phase_gate_validation.pyfield_methods_battery.pygolden_residue_remesh_bridge.pyintegrated_force_regime_study.pyinverse_spectrum_to_symmetry.pyk_phi_safety_demo.pykuramoto_farey_bridge.pymissing_piece_bridge.pymultichannel_interface_benchmark.pynavier_stokes_recipe_bridge.pynodal_propagator_residue_bridge.pyns_moment_hierarchy_cascade.pyoperational_irreducibility.pypaley_bridge.pyphase_curvature_investigation.pyphase_wall.pyphi_s_confinement_investigation.pyprimes_as_consequence.pypulse_phase_coherence_budget.pyREADME.mdremesh_infinity_riemann_baseline.pyremesh_infinity_riemann_composed.pyremesh_infinity_riemann_modified_graph.pyremesh_infinity_riemann_operator.pyremesh_infinity_riemann_spectral_basis.pyremesh_infinity_riemann_spectral_robustness.pyremesh_infinity_riemann_spectral.pyresidue_phase_vs_riemann.pystructural_interface_benchmark.pytemporal_interface_benchmark.pytetrad_results_aggregate.pyu2_destabilization_irreversibility.pyuniversality_clusters.pyxi_c_fast_experiment.py
primality-test
benchmarks
comprehensive_benchmark.py
docs
ADVANCED_INTEGRATION.mdmathematical_foundation.mdperformance_analysis.md
examples
advanced_examples.pybasic_usage.py
tnfr_primality
__init__.py__main__.pyadvanced_cli.pyadvanced_core.pycli.pyconstants.pycore.pyoptimized.py
MANIFEST.inPACKAGE_SUMMARY.mdREADME.mdRELEASE_NOTES_v1.0.mdsetup.pytest_installation.py
tests
core_physics
__init__.pytest_conservation_laws.pytest_delta_nfr_computation_paths.pytest_delta_nfr.pytest_dispersion_coherence_sign_invariance.pytest_emergent_constants_guard.pytest_lyapunov_operators.pytest_nodal_equation.pytest_structural_triad.py
data
replay_manifests
sample_run
_manifest_summary.json_manifest.json_partition_files.txt.gz
self_opt_validation
seed_alpha
paley.json
seed_beta
integration.json
seed_gamma
unknown.json
self_optimization
test_run
partitioned
test_run
test_run_p0.jsontest_run_p1.json
_manifest_summary.json_manifest.json
engines
test_pattern_discovery_manifest.pytest_self_optimization_engine.py
mathematics
__init__.pytest_autodiff.pytest_backends.pytest_dissipative_dynamics.pytest_epi.pytest_factory_patterns.pytest_metrics.pytest_navier_stokes_refounded.pytest_number_theory_canonical.pytest_operators.pytest_residue_networks.pytest_riemann_nodal_pulse.pytest_riemann_pulse_coherence.pytest_spaces.pytest_transforms.pytest_validator.py
operators
test_canonical_operators_modern.pytest_grammar_canon.pytest_grammar_canonical_consistency.pytest_grammar_dynamics.pytest_operator_contracts.pytest_operator_strategies.py
parallel
test_fractal_partition_manifest.py
physics
test_conservation_gauge_unification.pytest_dissipative_conservation.pytest_emergent_chemistry.pytest_field_cache_invalidation.pytest_gauge.pytest_phase_transition.pytest_signatures.pytest_spectral_conservation.pytest_structural_diffusion.pytest_structural_integrity.pytest_symplectic_substrate.pytest_tetrad_bounds.pytest_variational.pytest_yang_mills_closure.pytest_yang_mills_derivability.pytest_yang_mills_scaling.pytest_yang_mills_structural_gap.pytest_yang_mills_u6_sweep.py
scripts
test_run_self_opt_validation.pytest_run_self_optimization.py
sdk
__init__.pytest_simple_advanced.py
__init__.pyconftest.pyREADME.mdtest_breast_cancer_phase_gate_demo.pytest_classical_mechanics.pytest_distributed_fft.pytest_external_phase_gate_validation.pytest_factorization_entrypoint.pytest_multichannel_interface.pytest_nodal_optimizer.pytest_phase_gate_api.pytest_replay_register_manifest.pytest_signal_confrontation.pytest_structural_interface_api.pytest_structural_interface_baselines.pytest_structural_interface_benchmark.pytest_temporal_interface.pytest_vectorized_coherence_length_regression.pytest_wine_quality_phase_gate_demo.pyutils.py
examples
01_foundations
01_hello_world.py02_musical_resonance.py03_network_formation.py04_operator_sequences.py05_coherence_evolution.py06_network_topologies.py07_phase_transitions.py08_emergent_phenomena.py09_visualization_suite.py10_simplified_sdk_showcase.py
02_physics_regimes
11_classical_limit_comparison.py115_operator_contract_audit.py12_classical_mechanics_demo.py13_quantum_mechanics_demo.py14_uncertainty_and_interference.py15_train_crossing_demo.py17_conservation_law_demo.py26_gauge_structure_demo.py27_variational_principle_demo.py28_dissipative_systems_demo.py29_lyapunov_stability_demo.py30_self_optimization_demo.py31_mathematical_constants_basis.py33_complex_field_unification.py34_conservation_protocol_suite.py35_tetrad_irreducibility.py36_grammar_violation_detector.py37_operator_tetrad_synergy.py38_grammar_energy_landscape.py39_nodal_equation_decomposition.py
03_riemann_zeta
157_nodal_pulse_phase_attack.py41_von_mangoldt_zeta_demo.py42_riemann_zeros_as_resonances.py43_prime_ladder_hamiltonian_demo.py44_weil_explicit_formula_demo.py45_li_keiper_demo.py46_weil_tnfr_positivity_demo.py47_alpha_sweep_demo.py48_admissible_family_sweep_demo.py49_nodeaware_gauge_sweep_demo.py50_uniform_coercivity_demo.py51_adaptive_coercivity_demo.py52_paley_gap_coercivity_demo.py53_lyapunov_spectral_positivity_demo.py54_hilbert_polya_demo.py55_structural_zero_density_demo.py56_spectral_emergence_demo.py57_admissible_rescaling_demo.py58_oscillatory_correction_demo.py
04_riemann_L_twisted
59_dirichlet_l_function_demo.py60_dirichlet_l_continuation_demo.py61_dirichlet_l_hamiltonian_demo.py62_dirichlet_weil_explicit_formula_demo.py63_dirichlet_li_keiper_demo.py64_twisted_weil_positivity_demo.py65_twisted_alpha_sweep_demo.py66_twisted_admissible_family_sweep_demo.py67_twisted_nodeaware_gauge_sweep_demo.py68_twisted_hermite_family_demo.py69_twisted_coercivity_uniform_demo.py70_twisted_paley_gap_coercivity_demo.py71_twisted_lyapunov_spectral_demo.py72_twisted_hilbert_polya_demo.py73_twisted_structural_zero_density_demo.py74_twisted_spectral_emergence_demo.py75_twisted_admissible_rescaling_demo.py76_twisted_oscillatory_correction_demo.py
05_type_hygiene
77_remesh_infinity_residue_split_demo.py78_nuf_type_signature_demo.py79_epi_type_signature_demo.py80_phi_type_signature_demo.py81_dnfr_type_signature_demo.py82_remesh_window_type_signature_demo.py83_delta_phi_max_type_signature_demo.py84_coupling_weights_type_signature_demo.py85_tetrad_closure_signature_demo.py86_currents_closure_signature_demo.py87_aggregates_closure_signature_demo.py88_urules_consistency_signature_demo.py89_operator_catalog_discipline_signature_demo.py
06_navier_stokes
158_navier_stokes_two_face_refounded.py
07_number_theory
100_prime_families_orbits.py101_numbers_as_coupled_network.py102_nodal_flow_primes_equilibria.py116_nuf_emergent_prime_visibility.py146_primality_grammatical_inertness.py147_numbers_as_free_monoid_words.py148_capacity_arm_carries_von_mangoldt.py149_p14_is_the_capacity_arm_operator.py153_structural_frequency_rank_cyclotomy.py40_arithmetic_number_theory.py94_generative_number_construction.py95_primes_from_spectral_waves.py96_spectral_vibration_of_coherence.py97_goldbach_additive_multiplicative.pyemergent_chemistry_particles_demo.py
08_emergent_geometry
103_emergent_substrate_meets_riemann.py106_per_node_polarization_geometry.py107_orthogonal_structure_emergent_geometry.py108_emergent_field_generating_structure.py112_structure_predicts_coherence_flow.py113_overdamped_projection_bridge.py114_substrate_conserved_quantities.py117_emergent_geometry_residue_graph.py118_emergent_vs_classical_operator.py119_phase_sector_directed_residue.py120_symmetry_wall_substrate_vs_spectrum.py121_canonical_symmetry_break_negative.py122_factorization_phase_sector.py123_symmetry_sector_decomposition.py124_emergent_metric_fractal_consistency.py125_node_is_the_emergent_substrate.py126_two_layers_base_fiber.py127_base_is_emergent_not_imposed.py128_base_substrate_coemergence.py129_spectral_gap_base_fiber_clock.py130_operators_break_substrate_charges.py131_coemergent_loop_convergence.py132_geometric_phase_holonomy.py133_psi_topological_defects.py134_spectral_dimension_heat_kernel.py135_arrow_of_time_h_theorem.py136_heat_kernel_coefficients.py137_synchronization_transition.py138_structure_frequency_synchronization.py139_grammar_formal_language.py140_grammar_automaton.py141_grammar_rule_decomposition.py142_grammar_operator_quotient.py143_glyphic_function_sublanguage.py144_branching_combinator.py145_syntactic_monoid_starfree.py150_emergent_grammatical_pattern_parry.py151_grammar_in_emergent_geometry.py152_operator_contract_tetrahedron.py154_conductor_annotated_qr_spectrum.py155_ontological_position_of_numbers.py156_emergence_directness_law.py98_emergent_symplectic_substrate.py99_structural_diffusion.pyunified_fields_showcase.py
09_millennium
109_p_vs_np_coherence_synthesis.py110_bsd_rank_structural_pressure.py111_hodge_discrete_and_honest_gap.py
10_applications
159_empirical_confrontation_pipeline.py90_phase_gate_monitor_demo.py91_breast_cancer_phase_gate_demo.py92_wine_quality_phase_gate_demo.py93_structural_interface_demo.pypytorch_cuda_demo.py
README.md
scripts
replay
__init__.pyregister_manifest.py
__init__.pyREADME.mdrebuild_failure_manifest.pyrun_reproducible_benchmarks.pyrun_self_opt_validation.pyrun_self_optimization.pytnfr_is_prime.pyvalidate_conservation_law.pyverify_internal_references.py
src
core
__init__.pyevaluation.py
tnfr
backends
__init__.pyjax_backend.pynumpy_backend.pyoptimized_numpy.pyREADME.mdtorch_backend.py
cli
__init__.py__init__.pyiarguments.pyarguments.pyiexecution.pyexecution.pyiinteractive_validator.pyREADME.mdutils.pyutils.pyi
compat
__init__.pydataclass.pyjsonschema_stub.pymatplotlib_stub.pynumpy_stub.pyREADME.md
config
__init__.py__init__.pyiconstants.pyconstants.pyidefaults_core.pydefaults_init.pydefaults_metric.pydefaults.pyfeature_flags.pyfeature_flags.pyiglyph_constants.pyoperator_names.pyoperator_names.pyiphysics_derivation.pyprecision_modes.pypresets.pypresets.pyiREADME.mdsecurity.pythresholds.pytnfr_config.py
constants
__init__.py__init__.pyialiases.pyaliases.pyicanonical.pymetric.pymetric.pyioperational.py
core
__init__.pycontainer.pydefault_implementations.pyexceptions.pyinterfaces.pyREADME.md
dynamics
__init__.py__init__.pyiadaptation.pyadaptation.pyiadaptive_sequences.pyadaptive_sequences.pyiadelic.pyadvanced_cache_optimizer.pyadvanced_fft_arithmetic.pyaliases.pyaliases.pyibifurcation.pycache_aware_fft_engine.pycanonical.pycanonical.pyicomputational_hub.pycoordination.pycoordination.pyidistributed_fft.pydnfr.pydnfr.pyidynamic_limits.pyemergent_centralization.pyemergent_integration_engine.pyfeedback.pyfeedback.pyifft_backend.pyfft_cache_coordinator.pyfft_dispatchers.pyfft_engine.pyfft_workers.pyfused_dnfr.pyhomeostasis.pyhomeostasis.pyiintegrators.pyintegrators.pyilearning.pylearning.pyimetabolism.pymulti_modal_cache.pynbody_tnfr.pynbody.pynodal_optimizer.pyoptimization_orchestrator.pypropagation.pyREADME.mdruntime.pyruntime.pyisampling.pysampling.pyiselectors.pyselectors.pyiself_optimizing_engine.pyspectral_structural_fusion.pystructural_cache.pystructural_clip.pysymplectic.pyunified_backend.pyunified_mathematical_cache_orchestrator.py
engines
computation
__init__.pyfft_engine.pyunified_fft_engine.pyunified_gpu_system.py
constants
__init__.pycanonical.pyoperational.py
integration
__init__.pyemergent_integration.py
pattern_discovery
__init__.pymathematical_patterns.pymulti_modal_cache.py
self_optimization
__init__.pyengine.py
__init__.pyREADME.md
errors
__init__.pycontextual.py
factorization
__init__.py
flatten
README.md
gamma
README.md
glyph_history
README.md
glyph_runtime
README.md
immutable
README.md
initialization
README.md
io
README.md
math
__init__.pyfields_symbolic.pygrammar_validators.pyoptimizer.pyREADME.mdsymbolic.py
mathematics
__init__.pybackend.pybackend.pyidynamics.pydynamics.pyiepi.pyepi.pyigenerators.pygenerators.pyiliouville.pymetrics.pymetrics.pyinumber_theory.pyoperators_factory.pyoperators_factory.pyioperators.pyoperators.pyioptimized_primality.pyprojection.pyprojection.pyiREADME.mdruntime.pyruntime.pyispaces.pyspaces.pyispectral.pytransforms.pytransforms.pyiunified_cache.pyunified_numerical.pyzeta.py
metrics
__init__.py__init__.pyibuffer_cache.pybuffer_cache.pyicache_utils.pycoherence.pycoherence.pyicommon.pycommon.pyicore.pycore.pyidiagnosis.pydiagnosis.pyiemergence.pyexport.pyexport.pyiglyph_timing.pyglyph_timing.pyilearning_metrics.pylearning_metrics.pyilocal_coherence.pyphase_coherence.pyphase_compatibility.pyREADME.mdreporting.pyreporting.pyisense_index.pysense_index.pyitelemetry.pytetrad.pytrig_cache.pytrig_cache.pyitrig.pytrig.pyi
multiscale
__init__.pyhierarchical.pyREADME.md
navier_stokes
__init__.pyconservative_face.pyoperator.py
node
README.md
observers
README.md
operators
network_analysis
__init__.pysource_detection.py
postconditions
__init__.pymutation.py
preconditions
__init__.pycoherence.pydissonance.pyemission.pymutation.pyreception.pyresonance.py
strategies
__init__.pydefaults.pygpu_strategies.pystrategy.py
__init__.py__init__.pyialgebra.pycanonical_patterns.pycascade.pycoherence.pycontraction.pycoupling.pycycle_detection.pydefinitions_base.pydefinitions.pydefinitions.pyidissonance.pyemission.pyexpansion.pygrammar_application.pygrammar_canon.pygrammar_context.pygrammar_core.pygrammar_dynamics.pygrammar_error_factory.pygrammar_memoization.pygrammar_patterns.pygrammar_telemetry.pygrammar_types.pygrammar_u6.pygrammar_validate.pygrammar.pygrammar.pyihamiltonian.pyhealth_analyzer.pyintrospection.pyjitter.pyjitter.pyilifecycle.pymetabolism.pymetrics_basic.pymetrics_core.pymetrics_network.pymetrics_structural.pymetrics_u6.pymetrics.pymutation.pynodal_equation.pyoperator_contracts.pypattern_detection.pypatterns.pyREADME.mdreception.pyrecursivity.pyregistry.pyregistry.pyiremesh.pyremesh.pyiresonance.pyself_organization.pysilence.pystructural_units.pytransition.py
parallel
__init__.pyauto_scaler.pydistributed.pyengine.pymonitoring.pypartitioner.pyREADME.md
performance
guardrails.py
physics
__init__.py_helpers.pycalibration.pycanonical.pycell.pyclassical_mechanics.pyconservation_gauge_unification.pyconservation.pydissipative_conservation.pyemergent_chemistry.pyemergent_particles.pyextended.pyfields.pygauge.pyintegrity.pyinteractions.pylife.pylyapunov.pypatterns.pyphase_transition.pyquantum_mechanics.pyREADME.mdsignatures.pyspectral_conservation.pyspectral_metrics.pystructural_diffusion.pysymplectic_substrate.pytelemetry.pyunified.pyvariational.pyvectorized_ops.py
primality
__init__.py
recipes
__init__.pycookbook.pyREADME.md
riemann
__init__.pyadmissible_family_sweep.pyadmissible_rescaling.pyaggregates_closure_signature.pyalpha_sweep.pyanalytic_continuation_dirichlet.pyanalytic_continuation.pycoercivity_uniform.pycoupling_weights_type_signature.pycurrents_closure_signature.pydelta_phi_max_type_signature.pydirichlet_l.pydnfr_type_signature.pyepi_type_signature.pyhilbert_polya.pyli_keiper.pylyapunov_spectral_positivity.pynodal_pulse.pynodeaware_gauge_sweep.pynuf_type_signature.pyoperator_catalog_discipline_signature.pyoperator.pyoscillatory_correction.pypaley_gap_coercivity.pyphi_type_signature.pyprime_ladder_hamiltonian.pypulse_coherence.pyremesh_infinity_residue_split.pyremesh_window_type_signature.pyspectral_emergence.pystructural_zero_density.pytelemetry.pytetrad_closure_signature.pytwisted_admissible_family_sweep.pytwisted_admissible_rescaling.pytwisted_alpha_sweep.pytwisted_coercivity_uniform.pytwisted_hermite_family.pytwisted_hilbert_polya.pytwisted_li_keiper.pytwisted_lyapunov_spectral_positivity.pytwisted_nodeaware_gauge_sweep.pytwisted_oscillatory_correction.pytwisted_paley_gap_coercivity.pytwisted_prime_ladder_hamiltonian.pytwisted_spectral_emergence.pytwisted_structural_zero_density.pytwisted_weil_explicit_formula.pytwisted_weil_positivity.pyurules_consistency_signature.pyvon_mangoldt.pyweil_explicit_formula.pyweil_positivity.py
schemas
__init__.pygrammar.jsonREADME.md
sdk
__init__.py__init__.pyiadaptive_system.pyadaptive_system.pyibuilders.pybuilders.pyifluent.pyfluent.pyiREADME.mdself_opt.pysimple.pytemplates.pytemplates.pyiutils.py
security
__init__.pycrypto.pydatabase.pyREADME.mdsubprocess.pyvalidation.py
sequencing
__init__.pypatterns.pyREADME.md
services
__init__.pyorchestrator.pyREADME.md
sparse
__init__.pyREADME.mdrepresentations.py
structural
README.md
telemetry
__init__.pycache_metrics.pycache_metrics.pyiconstants.pynu_f.pynu_f.pyiREADME.mdunified_telemetry_system.pyverbosity.pyverbosity.pyi
tools
__init__.pydomain_templates.pyREADME.mdsequence_generator.pytnfr_is_prime_cli_optimized.pytnfr_is_prime_cli.py
topology
__init__.pyasymmetry.pyREADME.md
utils
cache_layers.pycache.pycache.pyicallbacks.pycallbacks.pyichunks.pychunks.pyidata.pydata.pyifast_diameter.pygraph.pygraph.pyiinit.pyinit.pyiio.pyio.pyinumeric.pynumeric.pyiREADME.mdtopology.pyunified_cache.py
validation
__init__.py__init__.pyiaggregator.pybase.pycompatibility.pycompatibility.pyiconfig.pygraph.pygraph.pyihealth.pyinput_validation.pyinterface_baselines.pyinvariants.pymultichannel_interface.pyphase_gate.pyREADME.mdrules.pyrules.pyiruntime.pyruntime.pyisequence_validator.pysignal_confrontation.pysoft_filters.pysoft_filters.pyispectral.pyspectral.pyistructural_interface.pytemporal_interface.pyunified_validation_system.pyvalidator.pywindow.pywindow.pyi
visualization
__init__.pycascade_viz.pyhierarchy.pyREADME.mdsequence_plotter.py
yang_mills
__init__.pyclosure.pyderivability.pyscaling.pystructural_gap.pyu6_sweep.py
__init__.py__init__.pyi_compat.py_version.py_version.pyialias.pyalias.pyibackend_config.pycache.pycache.pyiexecution.pyexecution.pyiflatten.pyflatten.pyigamma.pygamma.pyiglyph_history.pyglyph_history.pyiglyph_runtime.pyglyph_runtime.pyiimmutable.pyimmutable.pyiinitialization.pyinitialization.pyiio.pyio.pyilocking.pylocking.pyinode.pynode.pyiobservers.pyobservers.pyiontosim.pyontosim.pyipy.typedrng.pyrng.pyisecure_config.pyselector.pyselector.pyisense.pysense.pyistructural.pystructural.pyitokens.pytokens.pyitrace.pytrace.pyitypes.pytypes.pyiunits.pyunits.pyi
tetrad_evaluator.py
.pre-commit-config.yaml.semgrep.yaml.zenodo.jsonARCHITECTURE.mdbandit.yamlCHANGELOG.mdCITATION.cffCONTRIBUTING.mdEMERGENT_CANON_AUDIT.mdEMERGENT_DERIVATION_PLAN.mdLICENSE.mdMakefileMANIFEST.inpyproject.tomlpyrightconfig.jsonPYTORCH_CUDA_INTEGRATION.mdREADME.mdSECURITY.mdTESTING.mdTNFR_Website_Content_Brief.md
FILE: src/tnfr/validation/invariants.py

invariants.py

TNFR Invariant Validators.

This module implements the 10 canonical TNFR invariants as described in AGENTS.md. Each invariant is a structural constraint that must be preserved to maintain coherence within the TNFR paradigm.

Canonical Invariants:

  1. EPI as coherent form: changes only via structural operators
  2. Structural units: νf expressed in Hz_str (structural hertz)
  3. ΔNFR semantics: sign and magnitude modulate reorganization rate
  4. Operator closure: composition yields valid TNFR states
  5. Phase check: explicit phase verification for coupling
  6. Node birth/collapse: minimal conditions maintained
  7. Operational fractality: EPIs can nest without losing identity
  8. Controlled determinism: reproducible and traceable
  9. Structural metrics: expose C(t), Si, phase, νf
  10. Domain neutrality: trans-scale and trans-domain

Source Code

python
"""TNFR Invariant Validators.

This module implements the 10 canonical TNFR invariants as described in AGENTS.md.
Each invariant is a structural constraint that must be preserved to maintain
coherence within the TNFR paradigm.

Canonical Invariants:
1. EPI as coherent form: changes only via structural operators
2. Structural units: νf expressed in Hz_str (structural hertz)
3. ΔNFR semantics: sign and magnitude modulate reorganization rate
4. Operator closure: composition yields valid TNFR states
5. Phase check: explicit phase verification for coupling
6. Node birth/collapse: minimal conditions maintained
7. Operational fractality: EPIs can nest without losing identity
8. Controlled determinism: reproducible and traceable
9. Structural metrics: expose C(t), Si, phase, νf
10. Domain neutrality: trans-scale and trans-domain
"""

from __future__ import annotations

import math
from abc import ABC, abstractmethod
from dataclasses import dataclass
from enum import Enum
from typing import Any

from ..constants import DEFAULTS, DNFR_PRIMARY, EPI_PRIMARY, THETA_PRIMARY, VF_PRIMARY
from ..constants.canonical import DELTA_PHI_MAX
from ..types import TNFRGraph

# ---------------------------------------------------------------------------
# Invariant guardrail thresholds
# ---------------------------------------------------------------------------
_VF_MIN_SUSTAINED = 0.001
_VF_MAX_REASONABLE = 1000.0
_DNFR_MAGNITUDE_WARNING = 1000.0
_DNFR_EXTREME_DISSONANCE = 10.0

__all__ = [
    "InvariantSeverity",
    "InvariantViolation",
    "TNFRInvariant",
    "Invariant1_EPIOnlyThroughOperators",
    "Invariant2_VfInHzStr",
    "Invariant3_DNFRSemantics",
    "Invariant4_OperatorClosure",
    "Invariant5_ExplicitPhaseChecks",
    "Invariant6_NodeBirthCollapse",
    "Invariant7_OperationalFractality",
    "Invariant8_ControlledDeterminism",
    "Invariant9_StructuralMetrics",
    "Invariant10_DomainNeutrality",
]


class InvariantSeverity(Enum):
    """Severity levels for invariant violations."""

    INFO = "info"  # Information, not a problem
    WARNING = "warning"  # Minor inconsistency
    ERROR = "error"  # Violation that prevents execution
    CRITICAL = "critical"  # Data corruption


@dataclass
class InvariantViolation:
    """Detailed description of invariant violation."""

    invariant_id: int
    severity: InvariantSeverity
    description: str
    node_id: str | None = None
    expected_value: Any | None = None
    actual_value: Any | None = None
    suggestion: str | None = None


class TNFRInvariant(ABC):
    """Base class for TNFR invariant validators."""

    @property
    @abstractmethod
    def invariant_id(self) -> int:
        """TNFR invariant number (1-10)."""

    @property
    @abstractmethod
    def description(self) -> str:
        """Human-readable description of the invariant."""

    @abstractmethod
    def validate(self, graph: TNFRGraph) -> list[InvariantViolation]:
        """Validates invariant in the graph, returns found violations."""


class Invariant1_EPIOnlyThroughOperators(TNFRInvariant):
    """Invariant 1: EPI changes only through structural operators."""

    invariant_id = 1
    description = "EPI changes only through structural operators"

    def __init__(self) -> None:
        self._previous_epi_values: dict[Any, float] = {}

    def validate(self, graph: TNFRGraph) -> list[InvariantViolation]:
        violations = []

        # Get configuration bounds
        config = getattr(graph, "graph", {})
        epi_min = config.get("EPI_MIN", DEFAULTS.get("EPI_MIN", 0.0))
        epi_max = config.get("EPI_MAX", DEFAULTS.get("EPI_MAX", 1.0))

        for node_id in graph.nodes():
            node_data = graph.nodes[node_id]
            current_epi = node_data.get(EPI_PRIMARY, 0.0)

            # Handle complex EPI structures (dict, complex numbers)
            # Extract scalar value for validation
            if isinstance(current_epi, dict):
                # EPI can be a dict with 'continuous', 'discrete', 'grid' keys
                # Try to extract a scalar value for validation
                if "continuous" in current_epi:
                    epi_value = current_epi["continuous"]
                    if isinstance(epi_value, (tuple, list)) and len(epi_value) > 0:
                        epi_value = epi_value[0]
                    if isinstance(epi_value, complex):
                        epi_value = abs(epi_value)
                    current_epi = (
                        float(epi_value)
                        if isinstance(epi_value, (int, float, complex))
                        else 0.0
                    )
                else:
                    # Skip validation for complex structures we can't interpret
                    continue

            elif isinstance(current_epi, complex):
                # For complex numbers, use magnitude
                current_epi = abs(current_epi)

            # Verify valid EPI range
            if not (epi_min <= current_epi <= epi_max):
                violations.append(
                    InvariantViolation(
                        invariant_id=1,
                        severity=InvariantSeverity.ERROR,
                        description=f"EPI out of valid range [{epi_min},{epi_max}]",
                        node_id=str(node_id),
                        expected_value=f"{epi_min} <= EPI <= {epi_max}",
                        actual_value=current_epi,
                        suggestion="Check operator implementation for EPI clamping",
                    )
                )

            # Verify that EPI is a finite number
            if not isinstance(current_epi, (int, float)) or not math.isfinite(
                current_epi
            ):
                violations.append(
                    InvariantViolation(
                        invariant_id=1,
                        severity=InvariantSeverity.CRITICAL,
                        description="EPI is not a finite number",
                        node_id=str(node_id),
                        expected_value="finite float",
                        actual_value=f"{type(current_epi).__name__}: {current_epi}",
                        suggestion="Check operator implementation for EPI assignment",
                    )
                )

            # Detect unauthorized changes (requires tracking)
            # Only verify if there is a previously registered operator
            if hasattr(graph, "_last_operator_applied"):
                if node_id in self._previous_epi_values:
                    prev_epi = self._previous_epi_values[node_id]
                    if abs(current_epi - prev_epi) > 1e-10:  # Change detected
                        if not graph._last_operator_applied:
                            violations.append(
                                InvariantViolation(
                                    invariant_id=1,
                                    severity=InvariantSeverity.CRITICAL,
                                    description="EPI changed without operator application",
                                    node_id=str(node_id),
                                    expected_value=prev_epi,
                                    actual_value=current_epi,
                                    suggestion="Ensure all EPI modifications go through structural operators",
                                )
                            )

        # Actualizar tracking
        for node_id in graph.nodes():
            epi_value = graph.nodes[node_id].get(EPI_PRIMARY, 0.0)
            # Store scalar value for tracking
            if isinstance(epi_value, dict) and "continuous" in epi_value:
                epi_val = epi_value["continuous"]
                if isinstance(epi_val, (tuple, list)) and len(epi_val) > 0:
                    epi_val = epi_val[0]
                if isinstance(epi_val, complex):
                    epi_val = abs(epi_val)
                epi_value = (
                    float(epi_val)
                    if isinstance(epi_val, (int, float, complex))
                    else 0.0
                )
            elif isinstance(epi_value, complex):
                epi_value = abs(epi_value)

            self._previous_epi_values[node_id] = epi_value

        return violations


class Invariant2_VfInHzStr(TNFRInvariant):
    """Invariante 2: νf stays in Hz_str units."""

    invariant_id = 2
    description = "νf stays in Hz_str units"

    def validate(self, graph: TNFRGraph) -> list[InvariantViolation]:
        violations = []

        # Get configuration bounds
        config = getattr(graph, "graph", {})
        vf_min = config.get("VF_MIN", DEFAULTS.get("VF_MIN", _VF_MIN_SUSTAINED))
        vf_max = config.get("VF_MAX", DEFAULTS.get("VF_MAX", _VF_MAX_REASONABLE))

        for node_id in graph.nodes():
            node_data = graph.nodes[node_id]
            vf = node_data.get(VF_PRIMARY, 0.0)

            # Verify valid structural range (Hz_str)
            if not (vf_min <= vf <= vf_max):
                violations.append(
                    InvariantViolation(
                        invariant_id=2,
                        severity=InvariantSeverity.ERROR,
                        description=f"νf outside typical Hz_str range [{vf_min}, {vf_max}]",
                        node_id=str(node_id),
                        expected_value=f"{vf_min} <= νf <= {vf_max} Hz_str",
                        actual_value=vf,
                        suggestion="Verify νf units and operator calculations",
                    )
                )

            # Verify that it's a valid number
            if not isinstance(vf, (int, float)) or not math.isfinite(vf):
                violations.append(
                    InvariantViolation(
                        invariant_id=2,
                        severity=InvariantSeverity.CRITICAL,
                        description="νf is not a finite number",
                        node_id=str(node_id),
                        expected_value="finite float",
                        actual_value=f"{type(vf).__name__}: {vf}",
                        suggestion="Check operator implementation for νf assignment",
                    )
                )

            # Verify νf is positive (structural requirement)
            if isinstance(vf, (int, float)) and vf <= 0:
                violations.append(
                    InvariantViolation(
                        invariant_id=2,
                        severity=InvariantSeverity.ERROR,
                        description="νf must be positive (structural frequency)",
                        node_id=str(node_id),
                        expected_value="νf > 0",
                        actual_value=vf,
                        suggestion="Structural frequency must be positive for coherent nodes",
                    )
                )

        return violations


class Invariant5_ExplicitPhaseChecks(TNFRInvariant):
    """Invariante 5: Explicit phase checks for coupling."""

    invariant_id = 5
    description = "Explicit phase checks for coupling"

    def __init__(self, phase_coupling_threshold: float = DELTA_PHI_MAX) -> None:
        self.phase_coupling_threshold = phase_coupling_threshold

    def validate(self, graph: TNFRGraph) -> list[InvariantViolation]:
        violations = []

        for node_id in graph.nodes():
            node_data = graph.nodes[node_id]
            phase = node_data.get(THETA_PRIMARY, 0.0)

            # Verify that phase is a finite number
            if not isinstance(phase, (int, float)) or not math.isfinite(phase):
                violations.append(
                    InvariantViolation(
                        invariant_id=5,
                        severity=InvariantSeverity.CRITICAL,
                        description="Phase is not a finite number",
                        node_id=str(node_id),
                        expected_value="finite float",
                        actual_value=f"{type(phase).__name__}: {phase}",
                        suggestion="Check operator implementation for phase assignment",
                    )
                )
                continue

            # Verify phase range [0, 2π] or normalizable
            # TNFR allows phases outside this range if they can be normalized
            # Emit warning if phase is not in canonical range
            if not (0.0 <= phase <= 2 * math.pi):
                violations.append(
                    InvariantViolation(
                        invariant_id=5,
                        severity=InvariantSeverity.WARNING,
                        description="Phase outside [0, 2π] range (normalization possible)",
                        node_id=str(node_id),
                        expected_value="0.0 <= phase <= 2π",
                        actual_value=phase,
                        suggestion="Consider normalizing phase to [0, 2π] range",
                    )
                )

        # Verify synchronization in coupled nodes (edges)
        if hasattr(graph, "edges"):
            for edge in graph.edges():
                node1, node2 = edge
                phase1 = graph.nodes[node1].get(THETA_PRIMARY, 0.0)
                phase2 = graph.nodes[node2].get(THETA_PRIMARY, 0.0)

                # Verify that both phases are finite numbers before calculating difference
                if not (
                    isinstance(phase1, (int, float))
                    and math.isfinite(phase1)
                    and isinstance(phase2, (int, float))
                    and math.isfinite(phase2)
                ):
                    continue

                phase_diff = abs(phase1 - phase2)
                # Account for periodicity
                phase_diff = min(phase_diff, 2 * math.pi - phase_diff)

                # If the difference is very large, it may indicate decoupling
                if phase_diff > self.phase_coupling_threshold:
                    violations.append(
                        InvariantViolation(
                            invariant_id=5,
                            severity=InvariantSeverity.WARNING,
                            description="Large phase difference between coupled nodes",
                            node_id=f"{node1}-{node2}",
                            expected_value=f"< {self.phase_coupling_threshold}",
                            actual_value=phase_diff,
                            suggestion="Check coupling strength or phase coordination",
                        )
                    )

        return violations


class Invariant3_DNFRSemantics(TNFRInvariant):
    """Invariante 3: ΔNFR semantics - sign and magnitude modulate reorganization rate."""

    invariant_id = 3
    description = "ΔNFR semantics: sign and magnitude modulate reorganization rate"

    def validate(self, graph: TNFRGraph) -> list[InvariantViolation]:
        violations = []

        for node_id in graph.nodes():
            node_data = graph.nodes[node_id]
            dnfr = node_data.get(DNFR_PRIMARY, 0.0)

            # Verify that ΔNFR is a finite number
            if not isinstance(dnfr, (int, float)) or not math.isfinite(dnfr):
                violations.append(
                    InvariantViolation(
                        invariant_id=3,
                        severity=InvariantSeverity.CRITICAL,
                        description="ΔNFR is not a finite number",
                        node_id=str(node_id),
                        expected_value="finite float",
                        actual_value=f"{type(dnfr).__name__}: {dnfr}",
                        suggestion="Check operator implementation for ΔNFR calculation",
                    )
                )

            # Verify ΔNFR is not treated as error/loss gradient
            # (this is more conceptual, but we can verify reasonable ranges)
            if isinstance(dnfr, (int, float)) and math.isfinite(dnfr):
                # Excessively large ΔNFR could indicate erroneous treatment
                if abs(dnfr) > _DNFR_MAGNITUDE_WARNING:
                    violations.append(
                        InvariantViolation(
                            invariant_id=3,
                            severity=InvariantSeverity.WARNING,
                            description="ΔNFR magnitude is unusually large",
                            node_id=str(node_id),
                            expected_value="|ΔNFR| < 1000",
                            actual_value=abs(dnfr),
                            suggestion="Verify ΔNFR is not being misused as error gradient",
                        )
                    )

        return violations


class Invariant4_OperatorClosure(TNFRInvariant):
    """Invariante 4: Operator closure - composition yields valid TNFR states."""

    invariant_id = 4
    description = "Operator closure: composition yields valid TNFR states"

    def validate(self, graph: TNFRGraph) -> list[InvariantViolation]:
        violations = []

        # Verify that graph maintains valid state after operators
        for node_id in graph.nodes():
            node_data = graph.nodes[node_id]

            # Verify essential attributes exist
            required_attrs = [EPI_PRIMARY, VF_PRIMARY, THETA_PRIMARY]
            missing_attrs = [attr for attr in required_attrs if attr not in node_data]

            if missing_attrs:
                violations.append(
                    InvariantViolation(
                        invariant_id=4,
                        severity=InvariantSeverity.CRITICAL,
                        description=f"Node missing required TNFR attributes: {missing_attrs}",
                        node_id=str(node_id),
                        expected_value="All TNFR attributes present",
                        actual_value=f"Missing: {missing_attrs}",
                        suggestion="Operator composition broke TNFR state structure",
                    )
                )

        # Verify the graph has a ΔNFR hook
        if hasattr(graph, "graph"):
            if "compute_delta_nfr" not in graph.graph:
                violations.append(
                    InvariantViolation(
                        invariant_id=4,
                        severity=InvariantSeverity.WARNING,
                        description="Graph missing ΔNFR computation hook",
                        expected_value="compute_delta_nfr hook present",
                        actual_value="Hook missing",
                        suggestion="Ensure ΔNFR hook is installed for proper operator closure",
                    )
                )

        return violations


class Invariant6_NodeBirthCollapse(TNFRInvariant):
    """Invariante 6: Node birth/collapse - minimal conditions maintained."""

    invariant_id = 6
    description = "Node birth/collapse: minimal conditions maintained"

    def validate(self, graph: TNFRGraph) -> list[InvariantViolation]:
        violations = []

        for node_id in graph.nodes():
            node_data = graph.nodes[node_id]
            vf = node_data.get(VF_PRIMARY, 0.0)
            dnfr = node_data.get(DNFR_PRIMARY, 0.0)

            # Extract scalar values if needed
            if isinstance(vf, dict) and "continuous" in vf:
                continue  # Skip complex structures

            if isinstance(dnfr, dict):
                continue  # Skip complex structures

            # Minimum birth conditions: sufficient νf
            if isinstance(vf, (int, float)) and vf < _VF_MIN_SUSTAINED:
                violations.append(
                    InvariantViolation(
                        invariant_id=6,
                        severity=InvariantSeverity.WARNING,
                        description="Node has insufficient νf for sustained existence",
                        node_id=str(node_id),
                        expected_value="νf >= 0.001",
                        actual_value=vf,
                        suggestion="Node may be approaching collapse condition",
                    )
                )

            # Collapse conditions: extreme ΔNFR or νf near zero
            if isinstance(dnfr, (int, float)) and math.isfinite(dnfr):
                if abs(dnfr) > _DNFR_EXTREME_DISSONANCE:  # Dissonance extrema
                    violations.append(
                        InvariantViolation(
                            invariant_id=6,
                            severity=InvariantSeverity.WARNING,
                            description="Node experiencing extreme dissonance (collapse risk)",
                            node_id=str(node_id),
                            expected_value="|ΔNFR| < 10",
                            actual_value=abs(dnfr),
                            suggestion="High dissonance may trigger node collapse",
                        )
                    )

        return violations


class Invariant7_OperationalFractality(TNFRInvariant):
    """Invariante 7: Operational fractality - EPIs can nest without losing identity."""

    invariant_id = 7
    description = "Operational fractality: EPIs can nest without losing identity"

    def validate(self, graph: TNFRGraph) -> list[InvariantViolation]:
        violations = []

        # Verify complex EPI structures maintain identity
        for node_id in graph.nodes():
            node_data = graph.nodes[node_id]
            epi = node_data.get(EPI_PRIMARY, 0.0)

            # If EPI is a nested structure, verify integrity
            if isinstance(epi, dict):
                # Verify it has the expected keys for fractality
                expected_keys = {"continuous", "discrete", "grid"}
                actual_keys = set(epi.keys())

                if not actual_keys.issubset(expected_keys):
                    violations.append(
                        InvariantViolation(
                            invariant_id=7,
                            severity=InvariantSeverity.WARNING,
                            description="EPI structure has unexpected keys (fractality may be broken)",
                            node_id=str(node_id),
                            expected_value=f"Keys subset of {expected_keys}",
                            actual_value=f"Keys: {actual_keys}",
                            suggestion="Verify nested EPI structure maintains identity",
                        )
                    )

                # Verify that sub-EPIs have valid values
                for key in ["continuous", "discrete"]:
                    if key in epi:
                        sub_epi = epi[key]
                        if isinstance(sub_epi, (tuple, list)):
                            for val in sub_epi:
                                if isinstance(val, complex) and not math.isfinite(
                                    abs(val)
                                ):
                                    violations.append(
                                        InvariantViolation(
                                            invariant_id=7,
                                            severity=InvariantSeverity.ERROR,
                                            description=f"Sub-EPI '{key}' contains non-finite values",
                                            node_id=str(node_id),
                                            expected_value="finite values",
                                            actual_value=f"{val}",
                                            suggestion="Nested EPI identity compromised by invalid values",
                                        )
                                    )

        return violations


class Invariant8_ControlledDeterminism(TNFRInvariant):
    """Invariante 8: Controlled determinism - reproducible and traceable."""

    invariant_id = 8
    description = "Controlled determinism: reproducible and traceable"

    def validate(self, graph: TNFRGraph) -> list[InvariantViolation]:
        violations = []

        # Verify traceability (history)
        if hasattr(graph, "graph"):
            config = graph.graph

            # Verify there is a history/trace system
            if "history" not in config and "HISTORY_MAXLEN" not in config:
                violations.append(
                    InvariantViolation(
                        invariant_id=8,
                        severity=InvariantSeverity.WARNING,
                        description="No history tracking configured (traceability compromised)",
                        expected_value="history or HISTORY_MAXLEN in config",
                        actual_value="Not found",
                        suggestion="Configure history tracking for reproducibility",
                    )
                )

            # Verify seed is configured for reproducibility
            if "RANDOM_SEED" not in config and "seed" not in config:
                violations.append(
                    InvariantViolation(
                        invariant_id=8,
                        severity=InvariantSeverity.WARNING,
                        description="No random seed configured (reproducibility at risk)",
                        expected_value="RANDOM_SEED or seed in config",
                        actual_value="Not found",
                        suggestion="set random seed for deterministic simulations",
                    )
                )

        return violations


class Invariant9_StructuralMetrics(TNFRInvariant):
    """Invariante 9: Structural metrics - expose C(t), Si, phase, νf."""

    invariant_id = 9
    description = "Structural metrics: expose C(t), Si, phase, νf"

    def validate(self, graph: TNFRGraph) -> list[InvariantViolation]:
        violations = []

        # Verify that nodes expose structural metrics
        for node_id in graph.nodes():
            node_data = graph.nodes[node_id]

            # Verify basic metrics (νf, phase already verified in other invariants)
            # Here we verify derived metrics if they exist

            # If Si metric (sense index) exists, verify it's valid
            if "Si" in node_data or "si" in node_data:
                si = node_data.get("Si", node_data.get("si", 0.0))
                if isinstance(si, (int, float)):
                    if not (0.0 <= si <= 1.0):
                        violations.append(
                            InvariantViolation(
                                invariant_id=9,
                                severity=InvariantSeverity.WARNING,
                                description="Sense index (Si) outside expected range",
                                node_id=str(node_id),
                                expected_value="0.0 <= Si <= 1.0",
                                actual_value=si,
                                suggestion="Verify Si calculation maintains TNFR semantics",
                            )
                        )

        # Verify that there are global coherence metrics
        if hasattr(graph, "graph"):
            config = graph.graph
            has_coherence_metric = (
                "coherence" in config or "C_t" in config or "total_coherence" in config
            )

            if not has_coherence_metric:
                violations.append(
                    InvariantViolation(
                        invariant_id=9,
                        severity=InvariantSeverity.WARNING,
                        description="No global coherence metric C(t) exposed",
                        expected_value="C(t) or coherence metric in graph",
                        actual_value="Not found",
                        suggestion="Expose total coherence C(t) for structural metrics",
                    )
                )

        return violations


class Invariant10_DomainNeutrality(TNFRInvariant):
    """Invariante 10: Domain neutrality - trans-scale and trans-domain."""

    invariant_id = 10
    description = "Domain neutrality: trans-scale and trans-domain"

    def validate(self, graph: TNFRGraph) -> list[InvariantViolation]:
        violations = []

        # Verify no hard-coded domain assumptions
        if hasattr(graph, "graph"):
            config = graph.graph

            # Search for keys suggesting domain-specific assumptions
            domain_specific_keys = [
                "physical_units",
                "meters",
                "seconds",
                "temperature",
                "biology",
                "neurons",
                "particles",
            ]

            found_domain_keys = [key for key in domain_specific_keys if key in config]

            if found_domain_keys:
                violations.append(
                    InvariantViolation(
                        invariant_id=10,
                        severity=InvariantSeverity.WARNING,
                        description=f"Domain-specific keys found: {found_domain_keys}",
                        expected_value="Domain-neutral configuration",
                        actual_value=f"Found: {found_domain_keys}",
                        suggestion="Remove domain-specific assumptions from core engine",
                    )
                )

        # Verify that units are structural (Hz_str, not physical Hz)
        for node_id in graph.nodes():
            node_data = graph.nodes[node_id]

            # If explicit units exist, they must be structural
            if "units" in node_data:
                units = node_data["units"]
                if isinstance(units, dict) and "vf" in units:
                    if units["vf"] not in ["Hz_str", "structural_hertz", None]:
                        violations.append(
                            InvariantViolation(
                                invariant_id=10,
                                severity=InvariantSeverity.ERROR,
                                description=f"Non-structural units for νf: {units['vf']}",
                                node_id=str(node_id),
                                expected_value="Hz_str or structural_hertz",
                                actual_value=units["vf"],
                                suggestion="Use structural units (Hz_str) not physical units",
                            )
                        )

        return violations