feat(adr-0246): §3.4/§3.5 lawful-only identity-path ledger (pure, off-serving)
Second Ring-1 unit per the brief. Stacked on feat/adr-0246-induced-action-primitives.
core/physics/identity_action.py:
+ PathBudget two-level budget (epsilon_turn, epsilon_session) (§3.4)
+ IdentityChainScope pack/geometry/policy/session/biography scope key (§3.5)
+ IdentityPathLedger immutable path snapshot; full-SHA-256 chain_id +
ledger_digest (LE f64 bytes, no default=str) (§4.2/§4.3)
+ advance_identity_path fold one turn: lawful iff d_stab<=epsilon_turn;
only lawful turns compose; refused turns are break
markers (path_break), never soft-projected I;
scope change = hard break onto a fresh chain
+ raw_path_product forensic-only (proves lawful product != raw product)
Enforces the §3.4 doctrine: lawful-only composition; no soft-projection of an
unlawful action onto I (non-goal #11); raw and lawful kept separate. Hard breaks
on every scope dimension (§3.5). Pure numpy+identity_manifold; off-serving; no
gate/threshold/axis/H_id/flag change (identity_wave_gate stays default-off).
Gate admit-surface wiring + eval matrix are subsequent units (brief §0a).
[Verification]: uv run core test --suite smoke -q => 176 passed;
tests/test_adr_0246_path_ledger.py 16 passed (RED-first, incl. small-rotation
session-accumulation, hard-break on each scope dim, raw!=lawful forensic pin,
immutability); identity surfaces (induced_action, mismatch-diagnostic,
identity_manifold, identity_gate_wave) 85 passed together.