Skip to content

M-J.4.4 calibration -- multi-day moral runner + judge-validated guilt half-life - #14

Merged
RobertMalczyk merged 3 commits into
mainfrom
feature/m-j-moral-corpus
Jun 25, 2026
Merged

RobertMalczyk merged 3 commits into
mainfrom
feature/m-j-moral-corpus

Conversation

@RobertMalczyk

Copy link
Copy Markdown
Owner

M-J.4.4 calibration — the multi-day stage (closes the guilt half-life)

Continues the moral calibration onto the MULTI-DAY axis — where the half-lives actually discriminate (the short litmus scenarios cannot tell 12h from 72h over ~48s). No engine change; placeholders documented, one judge-validated.

eval/moral_multiday.py — the multi-day moral runner

Runs a moral arc on the believable day layout (dt≈120s, ~717 ticks/day): one serious wrong, then the on-waking burden over several days/nights. Verified the multi-day dynamics work — serious guilt survives the night (the sleep reset decays fast states, not slow moral ones, per spec §9.2) — and that guilt persistence separates cleanly by half-life (6h forgotten overnight, 72h a deepening burden).

Judge-validated guilt half-life

A blind Sonnet judge ranked three half-life persistence arcs for a serious unconfessed wrong:

  • 72h → 5/5 (best) — "matches how an unconfessed serious wrong burdens a person"
  • 18h → 3/5 — "too tidy for a serious wrong"
  • 6h → 1/5 — "forgotten overnight → denial or sociopathy"

This independently validates the spec serious-guilt anchor (~72h) and confirms the minor(18h)/serious(72h) split. (calibration/moral_multiday_verdict.json.)

Implementation follow-up: the engine has one guilt state/half-life; the minor↔serious split needs the Secret's moral_weight to modulate effective persistence (spec §11). The 18h placeholder is sound for MINOR guilt.

Status

Full suite 396 passed, 4 skipped; goldens byte-identical (no engine/overlay change); ruff format + check clean. The calibration loop is now validated end-to-end: deterministic pre-filter → short judge (3.17→4.83) → multi-day judge (guilt half-life). Remaining: the same cheap multi-day-judge for the other half-lives, and the budgeted full 700+700 corpus.

🤖 Generated with Claude Code

Robakk84 and others added 3 commits June 25, 2026 12:46
…lf-life findings

Starting the full-corpus stage (calibration plan step 3). The short litmus scenarios cannot discriminate the
moral half-lives; the signal only shows over MULTI-DAY arcs at the believable timescale. eval/moral_multiday.py
runs a multi-day moral arc on the believable day layout and reports the lingering trajectory.

VALIDATED findings (docs/moral_calibration_plan.md section 6a):
- multi-day moral dynamics work: serious guilt SURVIVES the night (0.46->0.42 across sleep -- the night reset
  decays fast states, not the slow moral ones, per spec 9.2).
- the half-life signal is REAL and discriminating: with private wrongdoing-reminders (no interrogation -> no
  confession to resolve it), evening guilt separates cleanly by half-life -- 6h ~[0.04,0.05,0.05] (forgotten),
  18h ~[0.15,0.21,0.23], 72h ~[0.23,0.42,0.56] (deepening). That IS the curve_plausibility signal.
- two requirements surfaced for the full judged corpus: (1) keep the wrong UNRESOLVED (probe triggers a
  confession that flattens the signal); (2) a multi-day renderer must surface the lingering burden (long idle
  days build incidental boredom/seek mood that an anger-first demeanor read masks).

The full judged 700+700 corpus is the budgeted scale-up, pending those two pieces. No engine change.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016rWVvvhWijSuLMEhzjiUhu
…ilt half-life

The small judged multi-day batch (calibration plan step i) to settle the guilt half-life cheaply, before any
full 700+700 run. moral_multiday.py now renders a clean half-life persistence arc (one serious wrong, then
the on-waking burden over 4 days) and a blind Sonnet judge ranked three half-lives.

RESULT (calibration/moral_multiday_verdict.json): B=72h 5/5 (best), A=18h 3/5, C=6h 1/5. The judge
independently VALIDATES the spec serious-guilt anchor (~72h): 6h is implausible ("forgotten overnight ->
denial or sociopathy"), 18h reads as too-fast-for-serious ("too tidy"), 72h "matches how an unconfessed
serious wrong burdens a person". This confirms the spec minor(18h)/serious(72h) split.

Implementation note: the engine has ONE guilt state / half-life; the minor-vs-serious split needs the
Secret's moral_weight to modulate effective persistence (spec section 11) -- a follow-up. The 18h placeholder
is sound for MINOR guilt.

render_moral_multiday surfaces GUILT (the calibrated axis), not rumination (accumulates, masks decay) nor
idle-day boredom. No engine change.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016rWVvvhWijSuLMEhzjiUhu
@RobertMalczyk
RobertMalczyk merged commit a3b925b into main Jun 25, 2026
3 checks passed
@RobertMalczyk
RobertMalczyk deleted the feature/m-j-moral-corpus branch June 25, 2026 13:38
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.

2 participants