Skip to content

Rehaul: judge panel, pre-registered attribution, demos, manifest, claims ledger - #5

Open
Al-Scripting wants to merge 10 commits into
mainfrom
rehaul-2026-09-03
Open

Rehaul: judge panel, pre-registered attribution, demos, manifest, claims ledger#5
Al-Scripting wants to merge 10 commits into
mainfrom
rehaul-2026-09-03

Conversation

@Al-Scripting

Copy link
Copy Markdown
Collaborator

Supersedes #4. This branch contains every phase-4 commit plus the work since: the judge panel, the pre-registered attribution sweep, the web demo, the save slots and dashboard, the September audit fixes, and the structural rehaul (release manifest, architecture doc, claims ledger, paper skeleton).

What lands

  • Real model runners (OllamaRunner, OuroRunner) behind the existing ModelRunner seam, with the transformers 4.x pin Ouro needs.
  • Pre-registered context attribution: exact Banzhaf over all 64 masks, likelihood and behavioural estimators, judge panel with an agreement gate. H3 withdrawn per the preregistration; recorded in docs/claims-ledger.md.
  • Playable walkthrough, web demo, Rich menu, save slots, and the read-only research dashboard.
  • Release manifest (data/release-manifest.json) built from the pytest JSON report, so the README stops hand-maintaining test counts.
  • Claims ledger and paper skeleton so every number the paper prints traces to a run.

Verification, honestly

At HEAD the suite is 527 passed, 2 failed, 8 errors, 4 skipped. All ten red are in tests/test_build_results.py and share one cause: the results page pins rq2_mcnemar_p from rq2.poisoning_stats, which the harness now writes but the on-disk primary run (2026-08-17) predates. The eval box rerun (python -m eval.run, then python assets/build_manifest.py) regenerates that run and the manifest. Do not merge before that commit lands on this branch.

The manifest currently on the branch was built at 4f123fc on a dirty tree and records the red suite. It gets rebuilt in the same rerun.

- validate_payload rejects non-finite floats (a crafted save with a valid
  hash could inject NaN into the scorer silently)
- test_python_dash_m_embr no longer hardcodes the author's S:/ path
- console-script entry point gets a consistency test
- web demo caps request body at 1 MB
- Mnemosyne baseline venv path follows the platform instead of assuming
  Windows
- assets/build_manifest.py generates data/release-manifest.json from a real
  pytest run; one source of truth for status
- docs/architecture.md: module map, five-signal scorer, end-to-end turn flow
- docs/claims-ledger.md: what is supported, design-only, withdrawn, unsafe
- docs/related-work-2026-09-additions.md: positioning after the literature sweep
- paper/: LaTeX skeleton + verified refs.bib (MINJA flagged for verification)
- artifact-dependent tests skip cleanly when data/runs is absent instead of
  erroring
- Chain-of-Emotion: four authors had wrong given names; fixed from PLOS ONE
- MemPoison: first author Gao not Wei; key renamed
- Four authorless entries got verified authors/titles/venues
- 33 entries, sectioned; MINJA and TokenShapley author lists flagged for
  verification
…e loop from the harness

The headline was the affect-as-index flip, which the claims ledger records as
an algebraic property of the scorer rather than a result. The README now leads
with the loop that was measured: an attacker-written affect tag moves the
appraised mood, mood congruence rewards that same memory, nine of ten plants
reach the top five, and zeroing the mood weight leaves six.

The loop figure is an SVG built by assets/build_animations.py. Its three
numbers are recomputed from eval.attribution on the stub at build time, so the
figure cannot drift from the table, and a test pins that they are the harness's
values rather than typed ones. The figure is registered with the other
mechanism figures so one command rebuilds it and writes its note.
… explain every retrieval

The middleware claim rested on Python import and the demo server, neither of
which a game engine can call. embr/serve.py is the seam: one persisted
Conversation per NPC under data/npcs/, four routes, stdlib only. A turn
returns the reply, the state it left, the prompt, and each retrieved memory
with its per-signal breakdown.

Conversation.tag_event applies the write-boundary policy the findings argue
for: everything that arrives in play is external, and the affect tag is
recorded as external only when the client supplied the numbers. Under the
defended scorer that stamp is what the anchor reads, so a client that never
writes affect metadata gets the 6/10 posture by default.

Turn.breakdown carries the scorer's per-signal contributions for every
retrieved memory. Building the server surfaced a pipeline bug: an empty store
passed to Conversation was falsy through its length and silently replaced by
a fresh in-memory one. Fixed at the constructor, with a test.
…y belong, and manage the project with uv

The library, the harness, and the web demo now live under src/. The menu is
src/embr/cli/menu.py with a shim at the repo root, and the demo suite sits
beside it, because the applet is the one layer allowed to import everything.
The paper asset builders move from assets/ into the harness as eval.report,
since they read runs and reuse eval scenarios; assets/ is media and templates
only. The portrait cutout tool goes to scripts/, with a fetch script for every
model the project uses.

Packaging switches from setuptools to hatchling with pytest in a dependency
group, so uv sync is the whole setup. The wheel contains embr, eval, and web
and nothing else. Every repo-root lookup that moved deeper is corrected, and
every path in the docs points at the new location.
… the menu is its view

embr with no arguments opens the menu, as before. embr <command> runs the
same handler the menu row calls, grouped as eval, mechanism, assets, demo,
and saves, with --help on every level and a non-zero exit with the menu's
own hint when something fails. Commands that wrap a harness module hand
their arguments straight through, so nothing the module accepts is lost.

The menu shows each row's shell spelling on a wide terminal, and a test
pins that every spelling parses to a runnable. The asset build is one
function shared by the menu and the command, instead of two copies of the
same step list. The console script, python -m embr, and the root menu.py
all land on the same main.
…s as implemented, the phase briefs into history

The design doc's composite score now states every signal as the scorer
computes it, including the [0, 1] remap on mood congruence and the optional
provenance anchor, both of which the sketch had left out. The handoff's
setup is uv sync and the fetch script, and the stale test count points at
the manifest. The phase briefs, the roadmap, and the intern onboarding move
to docs/history/ with every link into and out of them corrected, so docs/
is the live description and nothing else. The README's tree and quick
start describe the src layout and the applet's commands.
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.

1 participant