Skip to content

observer_slots.verdict() + resolve #383 (report-of does resolve slots)#437

Merged
InauguralPhysicist merged 1 commit into
mainfrom
fix/report-name-resolution-383
Jul 5, 2026
Merged

observer_slots.verdict() + resolve #383 (report-of does resolve slots)#437
InauguralPhysicist merged 1 commit into
mainfrom
fix/report-name-resolution-383

Conversation

@InauguralPhysicist

Copy link
Copy Markdown
Collaborator

What

#383 claimed report of <name> inside a function resolves a module binding differently from the observer predicates — falling to the value-fallback "as if the name had no slot" — and lib/observer_slots deferred its verdict() API waiting on it.

Reproduce-before-believing: it doesn't reproduce

On current main, report of g inside a function returns the slot's regime and agrees with the predicates:

  • a descending signal reads "improving" — not the value-fallback "equilibrium" — proving report-of reads the slot (verified single-file and via load_file);
  • the original "disagreement" (a constant g reading "equilibrium" while stable of g returned 1) was consistent all along: equilibrium is a settled regime that also satisfies the stable predicate.

The REPORT_NAME and PREDICATE_NAME VM handlers share identical env_resolve_chain slot resolution; the issue predated the Phase-3 B name-resolution path. Like #241, a confident C-level hypothesis ("falls to builtin_report") that the language surface refutes.

So the deferred API ships

observer_slots.verdict of i returns the full regime string per slot, alongside the boolean is_stable/is_diverging. Tests pin that verdict reads the slot (descending → "improving") and agrees with the predicates (wedged constant → "equilibrium" + is_stable 1). Suite [50i] now 11 checks.

Gates: suite 2517/2517; ASan clean.

Closes #383
🤖 Generated with Claude Code

…ed (#383)

#383 claimed `report of <name>` inside a function resolves the module binding
differently from the observer predicates (falls to the value-fallback "as if the
name had no slot"), and lib/observer_slots deferred a verdict() API on it.

Reproduced-before-believing: it does NOT reproduce on current main. `report of g`
inside a function returns the SLOT's regime, agreeing with the predicates — a
descending signal reads "improving" (not the value-fallback "equilibrium"),
single-file AND via load_file. The original "disagreement" (a constant reading
"equilibrium" while `stable of g` returned 1) was consistent all along:
equilibrium is a settled regime and also satisfies the `stable` predicate. The
REPORT_NAME / PREDICATE_NAME handlers share identical env-slot resolution; the
issue predated the Phase-3 B name-resolution path.

So the deferred API ships: `observer_slots.verdict of i` returns the full regime
string per slot, next to the boolean is_stable/is_diverging. Tests pin that
verdict reads the slot (descending -> "improving") and agrees with the
predicates (wedged constant -> "equilibrium" + is_stable 1); suite [50i] now 11.

Suite 2517/2517; ASan clean.

Closes #383

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@InauguralPhysicist InauguralPhysicist merged commit b3464f5 into main Jul 5, 2026
16 of 17 checks passed
@InauguralPhysicist InauguralPhysicist deleted the fix/report-name-resolution-383 branch July 5, 2026 04:25
InauguralPhysicist added a commit that referenced this pull request Jul 7, 2026
…ient (#412) (#465)

* feat(observer): surface coherence — unity horizon + a real 'how' gradient (#412)

Two settled decisions, closing OBSERVER.md's Rough Edges:

1. Unity is the HORIZON. entropy_of_num special-cased |x| == 1.0 to 0 —
   the opposite of the formula's own value there (H = 1.0, the smooth
   maximum) — so a value placed exactly at 1.0 reported converged
   immediately while 1.0000001 read maximally entropic. Special case
   dropped; |x| == 0 keeps H = 0 (the formula's home-point limit). A
   flat run at 1.0 now classifies equilibrium (steady, high entropy),
   never converged.

2. 'how' is a real 0-1 gradient: deadband-normalized settledness of the
   last observed step, 1 - min(1, |dH|/dh_zero), where dh_zero is the
   same settle threshold the converged window uses. Pure in the
   recorded dH — so 'how is x at L' reads identically from tape history
   (no tape format change) and the live/at parity pin in test_temporal
   holds by construction. It measures the ENTROPY trajectory like
   where/why; value-channel readings stay report_value's job (#294).
   The old 1 - entropy/last_entropy was degenerate (the observer
   refreshes last_entropy on every push: always 0 or 1).

The #383 sub-item was already struck (observer_slots.verdict() landed
in #437; the doubted divergence did not reproduce).

test_observer_park.eigs settled on 1.0 incidentally — repointed at the
home region (0.001); its park-reset intent is value-agnostic. New
test_observer_coherence.eigs pins both decisions (10 checks). ouroboros
AOT mirrors the 'how' formula at the next pin bump (aot_rt reads the
same recorded dH), like every semantics train.

Gates: release 2594/2594, ASan+UBSan detect_leaks=1 2594/2594.

Closes #412

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test(observer): regenerate the cross-repo corpus goldens for the #412 semantics

The corpus gate did its job: 4 of 13 programs diverged, each traced to
the two decided changes before regenerating —
- EigenScript__structural_observer: prev_dH shifted by EXACTLY 1.0 (a
  structure member sits at 1.0; horizon entropy 0 -> 1.0)
- dynamics__solve: Gauss-Seidel 10 -> 11 iters / power iteration 5 -> 6
  (iterates converge toward [1,1,1] — entropy near the ridge changed)
- dynamics__physics: one x-column predicate flag (samples at the ridge)
- iLambdaAi__test_interrogative_spec: 'how' prints the real gradient
  (0 -> 1; the interrogative arithmetic sum follows)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

report-of resolves names differently from the observer predicates across function scope

1 participant