The grammar thread (139-150) studied the unified grammar U1-U6 as a PURELY COMBINATORIAL object: a formal language, a finite automaton, a syntactic monoid, a Parry measure. That automaton is a labelled directed graph — a "graph" in the plain combinatorial sense. This example checks a deeper, doctrine-critical claim: the grammar does NOT float free on that automaton. Its coherence rules are conditions on the CANONICAL EMERGENT GEOMETRY of TNFR — the symplectic substrate and the structural-field tetrad — measured here on the canonical engine modules.
The base/fiber lesson (examples 126-130) made this distinction decisive before: the genuine TNFR content lives in the EMERGENT geometry (the symplectic substrate, the tetrad fields), not in the imposed graph. The same question applies to the grammar: is U1-U6 a property of the automaton (the symbolic shadow), or of the emergent geometry (where coherence physically lives)?
So U1-U6 already CLAIM to be geometric conditions. This example MEASURES them on the canonical symplectic substrate (symplectic_substrate.py) and the canonical conservation/tetrad machinery (conservation.py, fields.py), confirming the grammar develops in the emergent geometry — and confirming that emergent geometry is the canonical, SDK-integrated home of the engine (net.symplectic_substrate()).
M1 U2 IS A SUBSTRATE-BOUNDEDNESS CONDITION. The grammar forbids unbalanced destabilizers exactly because, on the canonical symplectic substrate, they make the substrate Hamiltonian H_sub and the tetrad potential Φ_s DIVERGE super-exponentially (the ∫ νf·ΔNFR runaway). Adding the U2-required stabilizers is the negative-feedback lever that re-bounds the trajectory. The U2 boundary in the automaton (139-150) is the geometric boundedness boundary of the substrate.
M2 EACH RULE HAS ITS OWN GEOMETRIC MEANING (the honest, decisive nuance). The correspondence is rule-by-rule, NOT a blanket "every invalid word is geometrically incoherent". A U1a-invalid word [EN, IL, SHA] is energetically IDENTICAL to the valid [AL, IL, SHA] — because U1 is a trajectory-endpoint rule, not an energy rule. U2/U6 map to substrate energy / Φ_s confinement; U1 maps to the trajectory's endpoints. The same rule->constraint map asserted descriptively in example 38, now measured on the canonical substrate.
M3 THE SUBSTRATE IS THE CANONICAL HOME OF COHERENT EVOLUTION. Gentle grammatical words preserve the canonical symplectic manifold (verify_substrate_geometry: all seven certificates valid); the U2-forbidden divergent word leaves it (the manifold breaks). Coherent (grammatical) trajectories live ON the canonical emergent geometry, which is integrated in the engine and exposed by the SDK as net.symplectic_substrate(). The automaton is the combinatorial shadow.
This is a CHARACTERIZATION connecting the combinatorial grammar thread (139-150) to the canonical symplectic substrate (98-137). The substrate geometry and the U2/U6 derivations already exist in the engine; the contribution is the measured bridge.
The correspondence is at the level of RULE <-> geometric-property (derived + measured), NOT a per-word "valid <=> bounded" classifier: the canonical operators have amplitude, so at aggressive amplitude (every operator applied to every node) even a valid word carries a large transient excursion — that excursion is U4's territory (controlled bifurcation), while U2 only requires that stabilizers be PRESENT. At gentle amplitude (one target node per step) valid words trace bounded trajectories and preserve the manifold. Not new mathematics, closes no open problem.
#!/usr/bin/env python3
"""
Example 151 — The Grammar Develops in the Emergent Geometry, Not Just the Automaton
==================================================================================
The grammar thread (139-150) studied the unified grammar U1-U6 as a PURELY
COMBINATORIAL object: a formal language, a finite automaton, a syntactic monoid,
a Parry measure. That automaton is a labelled directed graph — a "graph" in the
plain combinatorial sense. This example checks a deeper, doctrine-critical claim:
the grammar does NOT float free on that automaton. Its coherence rules are
conditions on the CANONICAL EMERGENT GEOMETRY of TNFR — the symplectic substrate
and the structural-field tetrad — measured here on the canonical engine modules.
The base/fiber lesson (examples 126-130) made this distinction decisive before:
the genuine TNFR content lives in the EMERGENT geometry (the symplectic substrate,
the tetrad fields), not in the imposed graph. The same question applies to the
grammar: is U1-U6 a property of the automaton (the symbolic shadow), or of the
emergent geometry (where coherence physically lives)?
What the grammar rules MEAN geometrically (already derived in AGENTS.md)
-----------------------------------------------------------------------
- U2 (convergence/boundedness) is DERIVED from the requirement that the integral
∫ νf·ΔNFR dt converges — i.e. the substrate energy stays bounded. Destabilizers
{OZ, ZHIR, VAL} without stabilizers {IL, THOL} drive the integral to diverge.
- U6 (structural-potential confinement) monitors Φ_s < π/2 ≈ 1.5708 — a literal bound
on a tetrad field of the emergent geometry.
- U1 (initiation/closure) is a TRAJECTORY-ENDPOINT rule: a generator supplies the
start from EPI=0, a closure leaves a coherent attractor. It is NOT an energy rule.
So U1-U6 already CLAIM to be geometric conditions. This example MEASURES them on
the canonical symplectic substrate (symplectic_substrate.py) and the canonical
conservation/tetrad machinery (conservation.py, fields.py), confirming the grammar
develops in the emergent geometry — and confirming that emergent geometry is the
canonical, SDK-integrated home of the engine (net.symplectic_substrate()).
Three measured results
----------------------
M1 U2 IS A SUBSTRATE-BOUNDEDNESS CONDITION. The grammar forbids unbalanced
destabilizers exactly because, on the canonical symplectic substrate, they make
the substrate Hamiltonian H_sub and the tetrad potential Φ_s DIVERGE
super-exponentially (the ∫ νf·ΔNFR runaway). Adding the U2-required stabilizers
is the negative-feedback lever that re-bounds the trajectory. The U2 boundary in
the automaton (139-150) is the geometric boundedness boundary of the substrate.
M2 EACH RULE HAS ITS OWN GEOMETRIC MEANING (the honest, decisive nuance). The
correspondence is rule-by-rule, NOT a blanket "every invalid word is
geometrically incoherent". A U1a-invalid word [EN, IL, SHA] is energetically
IDENTICAL to the valid [AL, IL, SHA] — because U1 is a trajectory-endpoint rule,
not an energy rule. U2/U6 map to substrate energy / Φ_s confinement; U1 maps to
the trajectory's endpoints. The same rule->constraint map asserted descriptively
in example 38, now measured on the canonical substrate.
M3 THE SUBSTRATE IS THE CANONICAL HOME OF COHERENT EVOLUTION. Gentle grammatical
words preserve the canonical symplectic manifold (verify_substrate_geometry: all
seven certificates valid); the U2-forbidden divergent word leaves it (the
manifold breaks). Coherent (grammatical) trajectories live ON the canonical
emergent geometry, which is integrated in the engine and exposed by the SDK as
net.symplectic_substrate(). The automaton is the combinatorial shadow.
Honest scope
------------
This is a CHARACTERIZATION connecting the combinatorial grammar thread (139-150) to
the canonical symplectic substrate (98-137). The substrate geometry and the U2/U6
derivations already exist in the engine; the contribution is the measured bridge.
The correspondence is at the level of RULE <-> geometric-property (derived +
measured), NOT a per-word "valid <=> bounded" classifier: the canonical operators
have amplitude, so at aggressive amplitude (every operator applied to every node)
even a valid word carries a large transient excursion — that excursion is U4's
territory (controlled bifurcation), while U2 only requires that stabilizers be
PRESENT. At gentle amplitude (one target node per step) valid words trace bounded
trajectories and preserve the manifold. Not new mathematics, closes no open problem.
References
----------
- src/tnfr/physics/symplectic_substrate.py (extract_phase_space_point,
substrate_hamiltonian, verify_substrate_geometry — the canonical emergent geometry)
- src/tnfr/physics/conservation.py (compute_energy_functional, the tetrad Lyapunov energy)
- src/tnfr/physics/fields.py (compute_structural_potential — the Φ_s tetrad field)
- src/tnfr/operators/grammar_validate.py (the canonical validate_grammar oracle, U1-U6)
- examples/02_physics_regimes/38_grammar_energy_landscape.py (the earlier scalar-energy bridge)
- examples/08_emergent_geometry/126_two_layers_base_fiber.py (the base/fiber optic)
- examples/08_emergent_geometry/130_operators_break_substrate_charges.py (operators on the fiber)
- examples/08_emergent_geometry/150_emergent_grammatical_pattern_parry.py (the automaton thread)
- AGENTS.md "Unified Grammar (U1-U6)" (U2/U6 derivations), "Emergent Symplectic Substrate"
"""
import math
import os
import sys
import warnings
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "src"))
import networkx as nx
import numpy as np
from tnfr.constants import inject_defaults
from tnfr.constants.canonical import U6_STRUCTURAL_POTENTIAL_LIMIT
from tnfr.operators.definitions import (
Coherence,
Contraction,
Coupling,
Dissonance,
Emission,
Expansion,
Mutation,
Reception,
Recursivity,
Resonance,
SelfOrganization,
Silence,
Transition,
)
from tnfr.operators.grammar_validate import validate_grammar
from tnfr.physics.conservation import compute_energy_functional
from tnfr.physics.fields import compute_structural_potential
from tnfr.physics.symplectic_substrate import (
extract_phase_space_point,
substrate_hamiltonian,
verify_substrate_geometry,
)
# Operator instances keyed by canonical glyph mnemonic.
INST = {
"AL": Emission(),
"EN": Reception(),
"IL": Coherence(),
"OZ": Dissonance(),
"UM": Coupling(),
"RA": Resonance(),
"SHA": Silence(),
"VAL": Expansion(),
"NUL": Contraction(),
"THOL": SelfOrganization(),
"ZHIR": Mutation(),
"NAV": Transition(),
"REMESH": Recursivity(),
}
SEED = 42
def build_graph(n=24, p=0.25):
"""Connected ER graph with TNFR defaults and a non-trivial reproducible state."""
G = nx.erdos_renyi_graph(n, p, seed=SEED)
if not nx.is_connected(G):
comps = list(nx.connected_components(G))
for i in range(1, len(comps)):
G.add_edge(next(iter(comps[i - 1])), next(iter(comps[i])))
inject_defaults(G)
rng = np.random.default_rng(SEED)
for nd in G.nodes():
G.nodes[nd]["phase"] = rng.uniform(0, 2 * math.pi)
G.nodes[nd]["theta"] = G.nodes[nd]["phase"]
G.nodes[nd]["delta_nfr"] = rng.uniform(-0.3, 0.3)
G.nodes[nd]["nu_f"] = rng.uniform(0.8, 1.2)
return G
def phi_s_max(G):
"""Maximum |Phi_s| over nodes (the U6 confinement field)."""
return max(abs(v) for v in compute_structural_potential(G).values())
def is_valid(word):
"""Canonical grammar verdict (U1-U6) for a glyph word."""
return validate_grammar([INST[g] for g in word], 0.0)
def run_word(word, sweep):
"""Apply a glyph word to the canonical substrate; return (H_sub, E, Phi_s_max).
sweep=True applies each operator to every node (compounding amplitude),
sweep=False applies each operator to a single target node (gentle amplitude).
"""
G = build_graph()
with warnings.catch_warnings():
warnings.simplefilter("ignore")
for g in word:
if sweep:
for nd in list(G.nodes()):
try:
INST[g](G, nd)
except Exception:
pass
else:
try:
INST[g](G, 0)
except Exception:
pass
pt = extract_phase_space_point(G)
return substrate_hamiltonian(pt), compute_energy_functional(G), phi_s_max(G)
def experiment_1_u2_boundedness():
print("=" * 76)
print("M1: U2 is a substrate-boundedness condition (not just an automaton rule)")
print("=" * 76)
print(" The grammar forbids unbalanced destabilizers because, on the canonical")
print(" symplectic substrate, they drive the substrate Hamiltonian H_sub to")
print(" diverge (the integral of nu_f*dNFR runs away). Measured (sweep):")
print()
print(f" {'word':32s} {'U1-U6':6s} {'H_sub':>16s} {'Phi_s_max':>12s}")
print(" " + "-" * 70)
for k in range(0, 4):
w = ["AL"] + ["OZ"] * k + ["SHA"]
H, _E, P = run_word(w, sweep=True)
flag = "valid" if is_valid(w) else "FORBID"
print(f" {str(w):32s} {flag:6s} {H:16.2f} {P:12.2f}")
print()
print(" -> 0-1 unbalanced destabilizers stay bounded; 2+ trigger the runaway")
print(" the grammar exists to forbid (H_sub 2.5e5 -> 7.3e9 the substrate")
print(" energy escapes). U2's combinatorial boundary IS the substrate's")
print(" boundedness boundary.")
print()
print(" The U2 stabilizer is the negative-feedback lever (matched destabilizer")
print(" count, front-loaded; +k IL stabilizers reduce the escape):")
print()
print(f" {'word':40s} {'U1-U6':6s} {'H_sub':>16s}")
print(" " + "-" * 64)
for k in (1, 2, 3):
wi = ["AL"] + ["OZ"] * k + ["SHA"]
wv = ["AL"] + ["OZ"] * k + ["IL"] * k + ["SHA"]
Hi, _, _ = run_word(wi, sweep=True)
Hv, _, _ = run_word(wv, sweep=True)
print(f" {str(wi):40s} {'FORBID':6s} {Hi:16.2f}")
print(f" {str(wv):40s} {'valid':6s} {Hv:16.2f}")
print()
print(" -> at matched destabilizer count the stabilizer requirement always")
print(" reduces the substrate-energy escape (the negative feedback U2 names).")
def experiment_2_rule_specificity():
print()
print("=" * 76)
print("M2: each rule has its own geometric meaning (U1 is not an energy rule)")
print("=" * 76)
print(" The grammar<->geometry correspondence is rule-by-rule, NOT a blanket")
print(" 'every invalid word is geometrically incoherent'. Measured (gentle,")
print(" single target node):")
print()
print(f" {'word':24s} {'U1-U6':6s} {'H_sub':>10s} {'E':>10s} {'Phi_s':>8s}")
print(" " + "-" * 62)
pairs = [
(["AL", "IL", "SHA"], "valid baseline"),
(["EN", "IL", "SHA"], "U1a-invalid (EN not a generator)"),
(["AL", "UM", "IL", "SHA"], "valid (UM coupling)"),
]
rows = []
for w, _desc in pairs:
H, E, P = run_word(w, sweep=False)
rows.append((w, H, E, P))
flag = "valid" if is_valid(w) else "FORBID"
print(f" {str(w):24s} {flag:6s} {H:10.3f} {E:10.3f} {P:8.3f}")
same = abs(rows[0][2] - rows[1][2]) < 1e-6
print()
print(f" -> [AL,IL,SHA] and [EN,IL,SHA] have IDENTICAL energy: {same}")
print(" U1a flags a different geometric property (a defined start from")
print(" EPI=0), NOT boundedness. So U2/U6 map to substrate energy / Phi_s;")
print(" U1 maps to the trajectory's endpoints. Each rule = a distinct")
print(" geometric condition, measured on the canonical substrate.")
print()
print(
f" U6 confinement = a literal tetrad-field bound "
f"(pi/2 = {U6_STRUCTURAL_POTENTIAL_LIMIT:.4f}):"
)
print(f" {'word':30s} {'U1-U6':6s} {'Phi_s_max':>12s} status")
print(" " + "-" * 64)
for w in (
["AL", "IL", "SHA"],
["AL", "OZ", "IL", "SHA"],
["AL", "OZ", "OZ", "SHA"],
["AL", "OZ", "OZ", "OZ", "SHA"],
):
_, _, P = run_word(w, sweep=True)
flag = "valid" if is_valid(w) else "FORBID"
if P < U6_STRUCTURAL_POTENTIAL_LIMIT:
status = "CONFINED (< pi/2)"
elif P < 2.0:
status = "past pi/2"
else:
status = "ESCAPED (>> 2.0 ceiling)"
print(f" {str(w):30s} {flag:6s} {P:12.2f} {status}")
print(" -> U6 is not symbolic: it is the Phi_s tetrad field crossing its")
print(" canonical confinement threshold on the emergent geometry.")
def experiment_3_substrate_is_canonical_home():
print()
print("=" * 76)
print("M3: the substrate is the canonical home of coherent evolution")
print("=" * 76)
print(" Gentle grammatical words preserve the canonical symplectic manifold")
print(" (all seven verify_substrate_geometry certificates); the U2-forbidden")
print(" divergent word leaves it. Measured:")
print()
valid_words = [
["AL", "IL", "SHA"],
["AL", "UM", "IL", "SHA"],
["AL", "OZ", "IL", "SHA"],
]
for w in valid_words:
G = build_graph()
with warnings.catch_warnings():
warnings.simplefilter("ignore")
for g in w:
try:
INST[g](G, 0)
except Exception:
pass
rep = verify_substrate_geometry(G)
print(
f" {str(w):34s} valid, gentle manifold_valid = "
f"{rep.all_structures_valid}"
)
# divergent forbidden word (sweep)
wf = ["AL", "OZ", "OZ", "OZ", "SHA"]
G = build_graph()
with warnings.catch_warnings():
warnings.simplefilter("ignore")
for g in wf:
for nd in list(G.nodes()):
try:
INST[g](G, nd)
except Exception:
pass
rep = verify_substrate_geometry(G)
print(
f" {str(wf):34s} FORBID, diverged manifold_valid = "
f"{rep.all_structures_valid}"
)
print()
print(" -> coherent (grammatical) trajectories live ON the canonical emergent")
print(" geometry; the divergent forbidden trajectory leaves the manifold.")
print(" The emergent geometry is canonical and engine-integrated: the SDK")
print(" exposes it as net.symplectic_substrate(); symplectic_substrate.py")
print(" bundles the seven certificates. The automaton (139-150) is its")
print(" combinatorial shadow; the geometric content is substrate")
print(" boundedness (U2) and Phi_s confinement (U6).")
def main():
print()
print("#" * 76)
print("# Example 151 - The Grammar Develops in the Emergent Geometry,")
print("# Not Just the Automaton")
print("#" * 76)
print()
experiment_1_u2_boundedness()
experiment_2_rule_specificity()
experiment_3_substrate_is_canonical_home()
print()
print("=" * 76)
print("Summary")
print("=" * 76)
print(" The grammar does not float free on its automaton. Its coherence rules")
print(" are conditions on the canonical TNFR emergent geometry, measured here on")
print(" the canonical symplectic substrate and tetrad: U2 = substrate-energy")
print(" boundedness (the integral of nu_f*dNFR runaway that the grammar forbids),")
print(" U6 = Phi_s tetrad-field confinement, U1 = trajectory endpoints (a")
print(" distinct geometric property, energetically blind). Gentle grammatical")
print(" words preserve the canonical symplectic manifold; forbidden divergent")
print(" words leave it. The emergent geometry is canonical and SDK-integrated")
print(" (net.symplectic_substrate()); the automaton is its combinatorial shadow.")
print(" Characterization bridging the grammar thread (139-150) to the substrate")
print(" (98-137); no operator physics changed, no open problem closed.")
print()
if __name__ == "__main__":
main()