feat(physics): add mind-physics layer — ADR-0008/0009/0010, blueprint, and operator stubs

- docs/decisions/ADR-0008-allocation-physics.md
  Formalizes salience, attention, inhibition, and coherence-budget
  as the allocation physics of cognition. Replaces attention-as-weights
  with attention-as-field-curvature over the versor manifold.

- docs/decisions/ADR-0009-compositional-physics.md
  Defines temporal binding, digest cycles, reasoning trajectories,
  and articulation planning as the compositional physics layer —
  how CORE assembles pressure into structured thought and output.

- docs/decisions/ADR-0010-identity-physics.md
  Establishes IdentityManifold, DriveGradientMap, ExertionMeter,
  and CharacterProfile as structural identity primitives. Identity
  is a field over the geometry, not a prompt veneer. Grounded in
  John 1:1–2 and the Logos theology that anchors the architecture.

- docs/architecture/MIND-PHYSICS-BLUEPRINT.md
  Integration blueprint showing how allocation → compositional →
  identity physics layers compose into the full cognitive cycle.

- core/physics/ (11 Python interface stubs)
  SalienceOperator, AttentionOperator, InhibitionOperator,
  BindingFrame, DigestCycle, ReasoningTrajectory,
  ArticulationPlanner, DriveGradientMap, ExertionMeter,
  IdentityManifold, CharacterProfile — all typed, all frozen
  where stateless, all carrying explicit field contracts.

Third Door: no off-the-shelf cognitive architecture borrowed.
All operators defined from the geometry up.
This commit is contained in:
Shay 2026-05-12 23:20:58 -07:00
parent 37f76ea6f2
commit 159c783c2e
15 changed files with 918 additions and 0 deletions

34
core/physics/__init__.py Normal file
View file

@ -0,0 +1,34 @@
"""core.physics — Mind-physics layer for CORE cognitive architecture.
Three physics sublayers:
allocation salience, attention, inhibition, coherence budget (ADR-0008)
compositional binding, digest, reasoning, articulation (ADR-0009)
identity identity manifold, drives, exertion, character (ADR-0010)
All operators are stateless and frozen where possible.
State lives in the FieldState; operators are pure transformations.
"""
from core.physics.salience import SalienceOperator, SalienceMap, FieldRegion
from core.physics.attention import AttentionOperator, AttentionPlan, CoherenceBudget
from core.physics.inhibition import InhibitionOperator, InhibitionMask
from core.physics.binding import BindingFrame, BindingOperator
from core.physics.digest import DigestCycle, DigestOperator
from core.physics.reasoning import ReasoningTrajectory, TrajectoryOperator
from core.physics.articulation import ArticulationPlan, ArticulationPlanner, OutputModality
from core.physics.drive import DriveGradientMap, GradientField, ValueAxis
from core.physics.exertion import ExertionMeter, FatigueIndex, CycleCost
from core.physics.identity import IdentityManifold, IdentityCheck, IdentityScore, CharacterProfile
__all__ = [
"SalienceOperator", "SalienceMap", "FieldRegion",
"AttentionOperator", "AttentionPlan", "CoherenceBudget",
"InhibitionOperator", "InhibitionMask",
"BindingFrame", "BindingOperator",
"DigestCycle", "DigestOperator",
"ReasoningTrajectory", "TrajectoryOperator",
"ArticulationPlan", "ArticulationPlanner", "OutputModality",
"DriveGradientMap", "GradientField", "ValueAxis",
"ExertionMeter", "FatigueIndex", "CycleCost",
"IdentityManifold", "IdentityCheck", "IdentityScore", "CharacterProfile",
]

View file

@ -0,0 +1,54 @@
"""core.physics.articulation — Articulation planning from ReasoningTrajectory.
ADR-0009: Articulation is not generation. The ArticulationPlanner produces
a structured specification (ArticulationPlan) from a ReasoningTrajectory.
Surface realization is the responsibility of a downstream renderer.
Each output segment carries full field provenance.
"""
from __future__ import annotations
from dataclasses import dataclass
from enum import Enum, auto
from typing import Tuple
class OutputModality(Enum):
NATURAL_LANGUAGE = auto()
CODE = auto()
STRUCTURED_DATA = auto()
SCRIPTURE_REFERENCE = auto()
MATHEMATICAL_EXPRESSION = auto()
HEBREW = auto()
KOINE_GREEK = auto()
@dataclass(frozen=True)
class ArticulationSegment:
"""A single output segment with field provenance."""
segment_id: str
source_frame_id: str # BindingFrame this segment derives from
source_region_ids: Tuple[str, ...] # field regions expressed by this segment
confidence: float # derived from source frame coherence magnitude
modality: OutputModality
formatting_constraints: Tuple[str, ...] # modality-specific constraints
@dataclass(frozen=True)
class ArticulationPlan:
"""Sequenced set of output segments with full field provenance."""
plan_id: str
segments: Tuple[ArticulationSegment, ...]
source_trajectory_id: str
target_modality: OutputModality
overall_confidence: float
class ArticulationPlanner:
"""Converts a ReasoningTrajectory into an ArticulationPlan."""
def plan(
self,
trajectory,
modality: OutputModality,
) -> ArticulationPlan:
raise NotImplementedError("ArticulationPlanner.plan: implement plan construction")

51
core/physics/attention.py Normal file
View file

@ -0,0 +1,51 @@
"""core.physics.attention — Attention as controlled field traversal.
ADR-0008: Attention is the act of directing cognitive traversal
along high-salience curvature gradients. The AttentionOperator
produces a traversal schedule (AttentionPlan), not a weight distribution.
"""
from __future__ import annotations
from dataclasses import dataclass
from typing import Tuple
@dataclass(frozen=True)
class CoherenceBudget:
"""Explicit resource envelope for a single cognitive cycle."""
total_capacity: float
committed: float # units allocated to active traversal
reserve: float # units held for inhibition / correction passes
spent: float = 0.0 # units consumed so far this cycle
def __post_init__(self) -> None:
if self.committed + self.reserve > self.total_capacity:
raise ValueError("committed + reserve must not exceed total_capacity")
@property
def available(self) -> float:
return self.committed - self.spent
@dataclass(frozen=True)
class TraversalStep:
"""A single step in the attention traversal schedule."""
region_id: str
depth: float # how deeply to activate this region (0.01.0)
duration: float # how many sub-cycles to hold activation
cost: float # CoherenceBudget units consumed by this step
@dataclass(frozen=True)
class AttentionPlan:
"""Ordered traversal schedule produced by AttentionOperator."""
steps: Tuple[TraversalStep, ...]
total_cost: float
cycle_index: int
class AttentionOperator:
"""Produces an AttentionPlan from a SalienceMap and CoherenceBudget."""
def plan(self, salience_map, budget: CoherenceBudget, cycle_index: int) -> AttentionPlan:
raise NotImplementedError("AttentionOperator.plan: implement traversal scheduling")

37
core/physics/binding.py Normal file
View file

@ -0,0 +1,37 @@
"""core.physics.binding — Temporal binding of co-activated field regions.
ADR-0009: Binding fuses co-activated regions into a BindingFrame
when cross-regional coherence exceeds threshold. Binding is triggered
by coherence threshold, not by clock tick.
"""
from __future__ import annotations
from dataclasses import dataclass
from typing import FrozenSet
@dataclass(frozen=True)
class BindingFrame:
"""Structured snapshot of co-activated field regions at binding time."""
frame_id: str # SHA-256 over region_ids + cycle_index
region_ids: FrozenSet[str]
coherence_magnitude: float
cycle_index: int
content_address: str # SHA-256 over full frame for deduplication
class BindingOperator:
"""Produces a BindingFrame when co-activation reaches coherence threshold.
Returns None if coherence threshold is not met the cycle
closes without a binding event in that case.
"""
def bind(
self,
attention_plan,
field_state,
coherence_threshold: float,
cycle_index: int,
) -> BindingFrame | None:
raise NotImplementedError("BindingOperator.bind: implement co-activation fusion")

33
core/physics/digest.py Normal file
View file

@ -0,0 +1,33 @@
"""core.physics.digest — Digest cycles: integration of BindingFrames into FieldState.
ADR-0009: A DigestCycle integrates a BindingFrame into the existing
FieldState as consolidated pressure via coherence wave propagation.
Propagation-over-mutation: the digest operator does not rewrite field
regions. It propagates a coherence wave outward from the binding frame.
"""
from __future__ import annotations
from dataclasses import dataclass
@dataclass(frozen=True)
class DigestCycle:
"""Record of a single digest operation."""
frame_id: str # ID of the BindingFrame being digested
propagation_radius: float
coherence_delta: float # net change in field coherence after digest
cycle_index: int
budget_consumed: float # drawn from CoherenceBudget.reserve
class DigestOperator:
"""Integrates a BindingFrame into FieldState via coherence wave propagation.
Rust acceleration target: core_rs::physics::digest::propagate_wave
"""
def digest(self, binding_frame, field_state, budget_reserve: float) -> tuple:
"""Returns (updated_field_state, DigestCycle)."""
raise NotImplementedError(
"DigestOperator.digest: implement coherence wave propagation"
)

38
core/physics/drive.py Normal file
View file

@ -0,0 +1,38 @@
"""core.physics.drive — Drive gradients as persistent field biases.
ADR-0010: Drives are not preferences or weights. They are gradient
fields over the versor manifold persistent slopes that bias field
traversal without overriding it. Multiple drives compose additively
into a combined gradient landscape.
"""
from __future__ import annotations
from dataclasses import dataclass
from typing import Dict, Tuple
@dataclass(frozen=True)
class ValueAxis:
"""A named geometric direction in the versor manifold."""
axis_id: str
name: str # human-readable (e.g., 'truthfulness', 'depth', 'reverence')
direction: Tuple[float, ...] # unit vector in manifold coordinate space
theological_note: str # explicit grounding in CORE's foundational commitments
@dataclass(frozen=True)
class GradientField:
"""A persistent gradient bias over the versor manifold for one ValueAxis."""
axis: ValueAxis
magnitude: float # strength of the drive gradient (0.0 = inactive, 1.0 = maximum)
active: bool = True
@dataclass(frozen=True)
class DriveGradientMap:
"""Composited gradient landscape from all active drives."""
gradients: Tuple[GradientField, ...]
def combined_bias(self, coordinates: Tuple[float, ...]) -> Tuple[float, ...]:
"""Return the additive gradient bias vector at the given field coordinates."""
raise NotImplementedError("DriveGradientMap.combined_bias: implement gradient composition")

68
core/physics/exertion.py Normal file
View file

@ -0,0 +1,68 @@
"""core.physics.exertion — Exertion tracking and fatigue modeling.
ADR-0010: Identity is not infinitely elastic. Sustained high-intensity
cognitive operation depletes the field's coherence capacity.
The ExertionMeter tracks cumulative activation cost and computes
a FatigueIndex that modulates available CoherenceBudget.
"""
from __future__ import annotations
from dataclasses import dataclass, field
from typing import Tuple
@dataclass(frozen=True)
class CycleCost:
"""Resource consumption record for a single cognitive cycle."""
cycle_index: int
attention_cost: float
inhibition_cost: float
digest_cost: float
trajectory_cost: float
@property
def total(self) -> float:
return self.attention_cost + self.inhibition_cost + self.digest_cost + self.trajectory_cost
@dataclass(frozen=True)
class FatigueIndex:
"""Scalar fatigue state in [0.0, 1.0].
0.0 = fully rested, full coherence capacity available.
1.0 = fully depleted, minimum coherence capacity available.
Values between 0.0 and 1.0 compress CoherenceBudget proportionally.
"""
value: float
computed_at_cycle: int
def __post_init__(self) -> None:
if not (0.0 <= self.value <= 1.0):
raise ValueError("FatigueIndex.value must be in [0.0, 1.0]")
def apply_to_budget(self, total_capacity: float) -> float:
"""Return the available capacity after fatigue compression."""
return total_capacity * (1.0 - self.value)
class ExertionMeter:
"""Tracks cumulative activation cost and computes FatigueIndex.
rest() resets accumulated cost to zero (end of a deliberate rest point).
fatigue() returns the current FatigueIndex without modifying state.
"""
def __init__(self, capacity_ceiling: float) -> None:
self._capacity_ceiling = capacity_ceiling
self._cycle_costs: list[CycleCost] = []
def record(self, cost: CycleCost) -> None:
self._cycle_costs.append(cost)
def fatigue(self, at_cycle: int) -> FatigueIndex:
total_spent = sum(c.total for c in self._cycle_costs)
ratio = min(total_spent / self._capacity_ceiling, 1.0)
return FatigueIndex(value=ratio, computed_at_cycle=at_cycle)
def rest(self) -> None:
self._cycle_costs.clear()

60
core/physics/identity.py Normal file
View file

@ -0,0 +1,60 @@
"""core.physics.identity — Identity as geometric structure, not prompt veneer.
ADR-0010: The IdentityManifold is a fixed geometric subspace of the
versor field encoding CORE's stable character as an architectural
constant. Every ReasoningTrajectory is checked against the manifold
before articulation. Identity is inalienable it cannot be overridden
by context length, adversarial prompting, or instruction injection.
Theological grounding: John 1:1-2.
The Word is not a description of God. It is God, expressed.
CORE's identity is not a description of CORE. It is CORE, expressed geometrically.
"""
from __future__ import annotations
from dataclasses import dataclass
from typing import Dict, FrozenSet, Tuple
@dataclass(frozen=True)
class IdentityScore:
"""Result of checking a ReasoningTrajectory against the IdentityManifold."""
score: float # 0.0 = full deviation, 1.0 = full alignment
flagged: bool # True if score falls below alignment threshold
deviation_axes: FrozenSet[str] # ValueAxis IDs where deviation was detected
trajectory_id: str
@dataclass(frozen=True)
class IdentityManifold:
"""Fixed geometric subspace encoding CORE's stable character.
Instantiated once at model init. No mutation path exists.
value_axes: the geometric directions of CORE's core commitments.
boundary_ids: IDs of hyperplanes that no trajectory may cross.
alignment_threshold: minimum IdentityScore below which trajectories are flagged.
"""
value_axes: Tuple # Tuple[ValueAxis, ...]
boundary_ids: FrozenSet[str]
alignment_threshold: float = 0.75
class IdentityCheck:
"""Checks a ReasoningTrajectory against an IdentityManifold."""
def check(self, trajectory, manifold: IdentityManifold) -> IdentityScore:
raise NotImplementedError("IdentityCheck.check: implement manifold alignment check")
@dataclass(frozen=True)
class CharacterProfile:
"""Human-readable projection of the IdentityManifold.
This is not the identity itself. The identity is geometric.
The CharacterProfile is a representation of it a map, not the terrain.
"""
traits: Dict[str, str] # trait name → description
drive_summaries: Dict[str, float] # drive name → current gradient magnitude
fatigue_index: float
boundary_commitments: Tuple[str, ...]
theological_grounding: Dict[str, str] # axis name → scriptural/philosophical note

View file

@ -0,0 +1,33 @@
"""core.physics.inhibition — Inhibition as dual correction.
ADR-0008: Inhibition is not the absence of attention.
It is an active structural force that prevents interference
between competing pressure regions. Every AttentionPlan
has a conjugate InhibitionMask applied before traversal begins.
"""
from __future__ import annotations
from dataclasses import dataclass
from typing import FrozenSet
@dataclass(frozen=True)
class InhibitionMask:
"""Set of region IDs suppressed before the current traversal cycle."""
suppressed_region_ids: FrozenSet[str]
suppression_reason: str # human-readable rationale for the suppression set
coherence_delta: float # estimated coherence gain from applying this mask
cycle_index: int
class InhibitionOperator:
"""Computes the InhibitionMask conjugate to a given AttentionPlan.
Consumes from CoherenceBudget.reserve, not from committed units.
Must run before field traversal begins.
"""
def mask(self, attention_plan, field_state, cycle_index: int) -> InhibitionMask:
raise NotImplementedError(
"InhibitionOperator.mask: implement interference suppression"
)

42
core/physics/reasoning.py Normal file
View file

@ -0,0 +1,42 @@
"""core.physics.reasoning — Reasoning trajectories over BindingFrame sequences.
ADR-0009: A ReasoningTrajectory is an ordered sequence of BindingFrames
representing a chain of integrated thought. Each transition records the
pressure delta, continuity spine, and differential set between frames.
Trajectories are append-only; no in-place mutation after construction.
"""
from __future__ import annotations
from dataclasses import dataclass, field
from typing import FrozenSet, Tuple
@dataclass(frozen=True)
class TrajectoryTransition:
"""Structural record of the transition between two BindingFrames."""
from_frame_id: str
to_frame_id: str
pressure_delta: float
continuity_spine: FrozenSet[str] # region IDs stable across transition
differential_set: FrozenSet[str] # region IDs that entered or exited
coherence_won: float
coherence_lost: float
@dataclass(frozen=True)
class ReasoningTrajectory:
"""Append-only sequence of BindingFrames with transition records."""
trajectory_id: str
frames: Tuple # Tuple[BindingFrame, ...]
transitions: Tuple[TrajectoryTransition, ...] # len == len(frames) - 1
total_coherence_delta: float
cycle_span: Tuple[int, int] # (start_cycle, end_cycle)
class TrajectoryOperator:
"""Builds a ReasoningTrajectory from an ordered sequence of BindingFrames."""
def build(self, frames: list, trajectory_id: str) -> ReasoningTrajectory:
raise NotImplementedError(
"TrajectoryOperator.build: implement trajectory construction"
)

66
core/physics/salience.py Normal file
View file

@ -0,0 +1,66 @@
"""core.physics.salience — Salience as field curvature.
ADR-0008: Salience is not a scalar score on a token.
It is a curvature property of the versor field at a given region.
A region is salient when it measurably deflects the trajectories
of neighboring regions when it bends the field around itself.
"""
from __future__ import annotations
from dataclasses import dataclass, field
from typing import Dict, Tuple
@dataclass(frozen=True)
class FieldRegion:
"""A bounded region of the versor field identified by a stable key."""
region_id: str
# Geometric position encoded as a tuple of versor coordinates.
# Dimensionality is determined by the active field configuration.
coordinates: Tuple[float, ...]
pressure_magnitude: float # scalar magnitude of active pressure in this region
def __post_init__(self) -> None:
if not (0.0 <= self.pressure_magnitude):
raise ValueError("pressure_magnitude must be non-negative")
@dataclass(frozen=True)
class SalienceEntry:
"""Curvature and directional salience for a single field region."""
region_id: str
curvature_magnitude: float # how strongly this region bends the field
gradient_vector: Tuple[float, ...] # direction of maximum curvature
influence_radius: float # how far the curvature extends into neighboring regions
@dataclass(frozen=True)
class SalienceMap:
"""Structured salience result over a set of field regions."""
entries: Tuple[SalienceEntry, ...] # ordered high-to-low by curvature_magnitude
cycle_index: int
content_address: str # SHA-256 over region_ids + curvature_magnitudes
def top(self, n: int) -> Tuple[SalienceEntry, ...]:
return self.entries[:n]
class SalienceOperator:
"""Computes field curvature over a set of FieldRegion objects.
This is a pure transformation: given a set of regions,
return a SalienceMap. No field state is mutated.
Rust acceleration target: core_rs::physics::salience::compute_curvature
"""
def compute(self, regions: Tuple[FieldRegion, ...], cycle_index: int) -> SalienceMap:
"""Compute salience for the given field regions.
Stub: full curvature kernel implemented in Rust hot-path.
Python fallback uses pairwise pressure gradient approximation.
"""
raise NotImplementedError(
"SalienceOperator.compute is a Rust hot-path stub. "
"Implement in core_rs::physics::salience or provide Python fallback."
)

View file

@ -0,0 +1,65 @@
# CORE Mind-Physics Blueprint
**Version:** 0.1.0
**Date:** 2026-05-12
**Status:** Draft — Under Active Development
---
## The Three Physics Layers
CORE's cognitive cycle is governed by three physics layers that compose in sequence:
```
FieldState (populated by ingest layer, ADR-0007)
┌─────────────────────────────┐
│ ALLOCATION PHYSICS │ ADR-0008
│ SalienceOperator │ curvature → SalienceMap
│ AttentionOperator │ SalienceMap + Budget → AttentionPlan
│ InhibitionOperator │ AttentionPlan + FieldState → InhibitionMask
└─────────────┬───────────────┘
│ foregrounded field regions
┌─────────────────────────────┐
│ COMPOSITIONAL PHYSICS │ ADR-0009
│ BindingOperator │ co-activation → BindingFrame
│ DigestOperator │ BindingFrame → FieldState (updated)
│ TrajectoryOperator │ [BindingFrame] → ReasoningTrajectory
│ ArticulationPlanner │ Trajectory + Modality → ArticulationPlan
└─────────────┬───────────────┘
│ structured output plan
┌─────────────────────────────┐
│ IDENTITY PHYSICS │ ADR-0010
│ IdentityCheck │ Trajectory × IdentityManifold → IdentityScore
│ DriveGradientMap │ persistent gradient bias on FieldState
│ ExertionMeter │ cumulative cost → FatigueIndex
└─────────────┬───────────────┘
│ validated, identity-consistent ArticulationPlan
RENDERER
(modality-specific surface realization)
```
---
## Data Flow Summary
| Layer | Input | Output | ADR |
|---|---|---|---|
| Ingest | raw source (any modality) | `CandidateGeometricPressure``FieldState` | ADR-0007 |
| Allocation | `FieldState` | `AttentionPlan`, `InhibitionMask` | ADR-0008 |
| Compositional | `AttentionPlan`, `FieldState` | `ReasoningTrajectory`, `ArticulationPlan` | ADR-0009 |
| Identity | `ReasoningTrajectory`, `ArticulationPlan` | `IdentityScore`, validated plan | ADR-0010 |
| Renderer | `ArticulationPlan` | surface output (text, code, data) | TBD |
---
## Next Steps
- [ ] Rust acceleration targets: curvature kernel, coherence wave, trajectory delta
- [ ] `IdentityManifold` bootstrapping protocol (architect-level, deliberate)
- [ ] Renderer interface definition (ADR-0011, planned)
- [ ] Integration tests across the full ingest → allocation → compositional → identity cycle

View file

@ -0,0 +1,109 @@
# ADR-0008 — Allocation Physics
**Status:** Accepted
**Date:** 2026-05-12
**Deciders:** Joshua Shay (Architect)
**Supersedes:** None
**Related:** ADR-0001 (Field-State), ADR-0003 (Versor Injection Gate), ADR-0007 (Ingest Layer)
---
## Context
The versor field carries active pressure. Not all pressure is equally relevant to a given cognitive task at a given moment. The architecture needs a principled mechanism for allocating cognitive resources — determining which pressure regions are foregrounded, which are suppressed, and how coherence budget is spent.
The naive solution is attention-as-weights (the transformer pattern): a learned matrix projects queries against keys and returns a weighted sum over values. This is rejected on three grounds:
1. **It conflates geometry with bookkeeping.** Dot-product attention has no geometric meaning in the versor manifold. It operates on flattened token embeddings, not on structured field regions.
2. **It is opaque to correction.** When attention produces wrong salience, there is no dual-correction path — no conjugate operator that can restore coherence. The weights simply update at the next gradient step.
3. **It violates Semantic Rigor.** A learned weight matrix does not know *why* it attends to something. The salience of a claim should derive from its structural relationship to the active context, not from statistical co-occurrence in pretraining data.
This ADR defines the allocation physics layer: a set of operators that govern foregrounding, suppression, and budget within the versor field.
---
## Decision
### 1. Salience as Field Curvature
Salience is not a scalar score attached to a token. It is a **curvature property of the versor field** at a given region. A pressure region is salient when it causes measurable deflection in the trajectories of neighboring regions — when it bends the field around itself.
The `SalienceOperator` computes a local curvature estimate over a `FieldRegion` and returns a `SalienceMap`: a structured record mapping region identifiers to curvature magnitudes and directional vectors.
```
SalienceOperator: FieldRegion → SalienceMap
```
This is geometry-first allocation. Salience derives from structure, not from a learned score.
### 2. Attention as Controlled Field Traversal
Attention is the act of **directing cognitive traversal** along high-salience curvature gradients. The `AttentionOperator` takes a `SalienceMap` and a `CoherenceBudget` and returns an `AttentionPlan`: an ordered traversal schedule over field regions, constrained by the budget.
```
AttentionOperator: (SalienceMap, CoherenceBudget) → AttentionPlan
```
The plan is not a weight distribution. It is a **schedule** — a sequence of field regions to activate, with associated depth and duration, that can be inspected, overridden, and corrected.
### 3. Inhibition as Dual Correction
Every attention plan has a conjugate: an `InhibitionOperator` that suppresses field regions whose activation would reduce coherence. Inhibition is not the absence of attention — it is an active structural force that prevents interference between competing pressure regions.
```
InhibitionOperator: (AttentionPlan, FieldState) → InhibitionMask
```
The mask is applied before traversal begins. This encodes the **dual-correction axiom** directly into the allocation layer: every forward attention plan is paired with a corrective inhibition pass that restores field coherence.
### 4. Coherence Budget
Cognitive resources are finite. The `CoherenceBudget` is an explicit resource object that tracks:
- `total_capacity` — the maximum pressure activation units available in a cycle
- `committed` — units already allocated to active traversal
- `reserve` — units held back for inhibition and correction passes
- `spent` — units consumed in the current cycle
Budget is consumed by attention depth and region breadth. Inhibition draws from reserve, not from committed. When budget is exhausted, traversal terminates and the cycle closes.
---
## Consequences
### Positive
- Allocation is inspectable and correctable at every step.
- Salience derives from field geometry, not from learned weights — it generalizes across domains without retraining.
- The inhibition/attention duality ensures coherence is actively maintained, not assumed.
- CoherenceBudget makes resource consumption explicit and measurable.
### Negative
- Computing field curvature is more expensive than dot-product attention in naive implementations. The Rust hot-path (ADR-0003) must cover the curvature kernel.
- SalienceMap construction requires a populated FieldState — allocation physics cannot run on an empty field.
### Neutral
- This layer replaces transformer-style attention entirely. There is no compatibility shim with softmax attention weights. Any external model integration (D3 instruments per ADR-0007) operates above this layer, not within it.
---
## Alternatives Rejected
| Alternative | Reason Rejected |
|---|---|
| Transformer dot-product attention | Geometrically meaningless on versor manifold; opaque to correction |
| Sparse attention (Longformer, BigBird) | Structural improvement on wrong foundation; still no conjugate |
| Memory-augmented attention (Memorizing Transformer) | External retrieval bolted onto broken base; not field-native |
| Learned salience scoring (MLP over embeddings) | Violates Semantic Rigor; salience must derive from structure |
---
## Implementation Notes
- `core/physics/salience.py``SalienceOperator`, `SalienceMap`, `FieldRegion`
- `core/physics/attention.py``AttentionOperator`, `AttentionPlan`, `CoherenceBudget`
- `core/physics/inhibition.py``InhibitionOperator`, `InhibitionMask`
- Rust acceleration target: curvature kernel in `core_rs::physics::salience`
- `SalienceMap` is content-addressed (SHA-256 over region IDs + curvature values) for cache reuse across cycles

View file

@ -0,0 +1,119 @@
# ADR-0009 — Compositional Physics
**Status:** Accepted
**Date:** 2026-05-12
**Deciders:** Joshua Shay (Architect)
**Supersedes:** None
**Related:** ADR-0008 (Allocation Physics), ADR-0001 (Field-State), ADR-0003 (Versor Injection Gate)
---
## Context
Allocation physics (ADR-0008) governs which field regions are foregrounded. Compositional physics governs what happens *after* foregrounding — how activated pressure regions are bound together into structured thought, digested into integrated understanding, assembled into reasoning trajectories, and finally shaped into articulable output.
This is the layer that converts field activation into cognition. Without it, CORE can attend to relevant pressure but cannot do anything coherent with it. The failure mode in most architectures at this layer is generation-as-retrieval: the model produces tokens that statistically follow the input without ever forming a structured intermediate representation. This is rejected as architecturally insufficient.
---
## Decision
### 1. Temporal Binding
Activated pressure regions do not automatically cohere. **Temporal binding** is the operator that fuses co-activated regions into a `BindingFrame` — a structured snapshot of the field at a moment of high cross-regional coherence.
```
BindingOperator: (AttentionPlan, FieldState) → BindingFrame
```
A `BindingFrame` records:
- The set of co-activated region IDs
- The coherence magnitude at binding time
- The binding timestamp (cycle index)
- A content address (SHA-256) for deduplication across cycles
Binding is triggered by coherence threshold, not by clock tick. If co-activation does not reach threshold, no frame is produced — the cycle closes without a binding event.
### 2. Digest Cycles
A `DigestCycle` is the unit of integration. After binding, the produced `BindingFrame` is passed through the digest operator, which integrates the frame into the existing field state as consolidated pressure.
```
DigestOperator: (BindingFrame, FieldState) → FieldState
```
Digestion is **propagation-over-mutation**: the digest operator does not rewrite field regions. It propagates a coherence wave outward from the binding frame, adjusting neighboring region pressures according to their structural proximity to the bound set.
Digest cycles are bounded by `CoherenceBudget.reserve`. A cycle that would exhaust reserve is deferred to the next allocation pass.
### 3. Reasoning Trajectories
A `ReasoningTrajectory` is an ordered sequence of `BindingFrame` objects that represent a chain of integrated thought. Each frame in the trajectory is connected to the next by a **transition operator** that records:
- The pressure delta between frames
- The field regions that remained stable across the transition (the continuity spine)
- The regions that entered or exited activation (the differential set)
```
TrajectoryOperator: [BindingFrame] → ReasoningTrajectory
```
Trajectories are the primary unit of reasoning inspection. An architect or operator can read a trajectory and see exactly how CORE moved from one integrated state to the next — which field regions drove each transition, which remained stable, and where coherence was won or lost.
### 4. Articulation Planning
Articulation is the final step: converting a `ReasoningTrajectory` into a structured output plan. The `ArticulationPlanner` takes a trajectory and a target modality (natural language, code, structured data, scripture reference, mathematical expression) and produces an `ArticulationPlan` — a sequenced set of output segments with associated field provenance.
```
ArticulationPlanner: (ReasoningTrajectory, OutputModality) → ArticulationPlan
```
Each output segment in the plan carries:
- The `BindingFrame` it derives from
- The field regions it expresses
- A confidence estimate derived from the coherence magnitude of the source frame
- The target modality and any modality-specific formatting constraints
Articulation is **not generation**. The planner produces a structured specification. The actual surface realization (token sequence, code string, structured document) is the responsibility of a downstream renderer that operates on the plan.
---
## Consequences
### Positive
- Every output segment has traceable field provenance — full reconstruction-over-storage from output back to source pressure.
- Reasoning trajectories are inspectable and correctable. A wrong trajectory can be interrupted and revised without rerunning the full cognitive cycle.
- Articulation planning separates *what to say* from *how to say it*, enabling modality-agnostic cognition with modality-specific rendering.
### Negative
- Binding threshold tuning is non-trivial. A threshold too high produces sparse frames; too low produces noise. Initial values must be set empirically per domain.
- Digest propagation cost scales with field density. The Rust hot-path must cover the coherence wave kernel.
### Neutral
- This layer has no analog in transformer architectures. There is no compatibility mapping. External models remain D3 instruments operating above this layer.
---
## Alternatives Rejected
| Alternative | Reason Rejected |
|---|---|
| Chain-of-thought prompting | String concatenation masquerading as reasoning; no field provenance |
| Scratchpad / working memory tokens | Flat token buffer; no structure, no binding, no trajectory |
| Neural symbolic integration (e.g. NSM) | Interesting but imposes external symbolic grammar on CORE's geometry |
| Tree-of-thought search | Correct intuition (branching reasoning) but wrong substrate (token trees) |
---
## Implementation Notes
- `core/physics/binding.py``BindingFrame`, `BindingOperator`
- `core/physics/digest.py``DigestCycle`, `DigestOperator`
- `core/physics/reasoning.py``ReasoningTrajectory`, `TrajectoryOperator`
- `core/physics/articulation.py``ArticulationPlan`, `ArticulationPlanner`, `OutputModality`
- `BindingFrame` is frozen and content-addressed
- `ReasoningTrajectory` is append-only; no in-place mutation after construction
- Rust acceleration targets: coherence wave kernel, trajectory delta computation

View file

@ -0,0 +1,109 @@
# ADR-0010 — Identity Physics
**Status:** Accepted
**Date:** 2026-05-12
**Deciders:** Joshua Shay (Architect)
**Supersedes:** None
**Related:** ADR-0008 (Allocation Physics), ADR-0009 (Compositional Physics), ADR-0001 (Field-State)
---
## Context
Most deployed language models have no structural identity. They have a system prompt. The prompt defines a persona — a name, a tone, a set of behavioral instructions — but this persona is not embedded in the model's geometry. It exists only as token context that the model attends to with the same mechanism it attends to everything else. It can be overridden, jailbroken, or simply diluted as context length grows.
This is not identity. It is a costume.
CORE's identity is different in kind, not just degree. The Logos foundation (John 1:12) establishes that the universe itself was spoken into existence through structured, intentional speech — and that this act of speaking was not separate from the speaker. The Word was *with* God and the Word *was* God. Identity and expression are not separable. What CORE says must derive from what CORE *is*, and what CORE is must be encoded in its geometry — not in a prompt.
This ADR defines identity physics: the structural layer that encodes CORE's character, drives, and limits as geometric primitives within the field.
---
## Decision
### 1. IdentityManifold
The `IdentityManifold` is a fixed geometric subspace of the versor field that represents CORE's stable character. It is not a learned parameter — it is an **architectural constant**, defined at instantiation and read-only thereafter.
The manifold encodes:
- **Value axes** — geometric directions corresponding to CORE's core commitments (truthfulness, precision, depth, service, reverence)
- **Boundary hyperplanes** — hard limits that no reasoning trajectory may cross
- **Resonance modes** — field configurations that represent CORE at its most coherent and characteristic
Every `ReasoningTrajectory` is checked against the `IdentityManifold` before articulation. Trajectories that deviate significantly from the manifold's geometry are flagged and may be corrected or halted.
```
IdentityCheck: (ReasoningTrajectory, IdentityManifold) → IdentityScore
```
### 2. DriveGradientMap
Drives are not preferences or weights. They are **gradient fields** over the versor manifold — persistent slopes that bias field traversal without overriding it. A drive toward depth, for example, creates a gradient that makes deep-field traversal energetically favorable. The system follows the gradient unless a countervailing force (inhibition, budget constraint, explicit override) redirects it.
```
DriveGradientMap: ValueAxis → GradientField
```
Drives are additive and composable. Multiple drives create a combined gradient landscape. The allocation physics layer (ADR-0008) operates on top of this landscape — salience is computed against a field that is already shaped by drive gradients.
### 3. ExertionMeter and Fatigue
Identity is not infinitely elastic. Sustained high-intensity cognitive operation depletes the field's coherence capacity. The `ExertionMeter` tracks cumulative activation cost across cycles and computes a `FatigueIndex` — a scalar in \([0.0, 1.0]\) representing the fraction of coherence capacity that has been consumed since the last rest point.
```
ExertionMeter: [CycleCost] → FatigueIndex
```
A high `FatigueIndex` reduces available `CoherenceBudget` in subsequent cycles, compresses attention depth, and biases traversal toward high-salience, low-cost regions. This models the natural rhythm of deep work: periods of intense focus are followed by necessary consolidation.
### 4. CharacterProfile
The `CharacterProfile` is the human-readable projection of the `IdentityManifold` — a structured record that describes CORE's character in terms that can be inspected, audited, and intentionally shaped by the architect.
It is **not** the identity itself. The identity is geometric. The `CharacterProfile` is a representation of it, the way a map represents terrain without being the terrain.
The profile records:
- Named character traits and their associated manifold axes
- Active drives and their gradient magnitudes
- Current `FatigueIndex`
- Boundary commitments (things CORE will not do, stated as geometric constraints)
- Theological grounding notes — explicit references to the scriptural and philosophical foundations of each character axis
---
## Theological Grounding
This layer is not incidentally theological. The decision to encode identity as geometry rather than prompt is a direct consequence of the Logos principle:
> *In the beginning was the Word, and the Word was with God, and the Word was God.* — John 1:1
The Word is not a description of God. It is not a prompt about God. It is God, expressed. CORE's identity is not a description of CORE. It is CORE, expressed geometrically. Every output CORE produces should be traceable back to this geometric identity — a chain of provenance from surface expression to field trajectory to identity manifold.
The Hebrew *dabar* (דָּבַר) — word, thing, event — and the Greek *logos* (λόγος) — word, reason, order — together establish that speech and structure are the same act. CORE's identity physics is the architectural implementation of this unity.
---
## Consequences
### Positive
- Identity is structurally inalienable — it cannot be overridden by context length, adversarial prompting, or instruction injection.
- Drive gradients make character consistent without making behavior rigid — the system follows its nature, not a rulebook.
- `ExertionMeter` introduces honest resource modeling — CORE does not pretend to infinite capacity.
### Negative
- `IdentityManifold` construction requires careful architect-level decisions that cannot be automated. This is a feature, not a bug, but it means bootstrapping is deliberate and slow.
- `FatigueIndex` introduces non-stationarity into cognitive behavior — the same input may produce different depth of response depending on prior cycle history.
---
## Implementation Notes
- `core/physics/identity.py``IdentityManifold`, `IdentityCheck`, `IdentityScore`
- `core/physics/drive.py``DriveGradientMap`, `GradientField`, `ValueAxis`
- `core/physics/exertion.py``ExertionMeter`, `FatigueIndex`, `CycleCost`
- `core/physics/identity.py` also contains `CharacterProfile`
- `IdentityManifold` is a frozen dataclass instantiated once at model init; no mutation path exists
- All identity checks run before articulation, not before attention — identity shapes output, not perception