- snapshots: checksummed JSON archive of every mind-scoped state table plus identity/personality/config and the event position; stored, downloadable - fork: restore into a new mind with all ids remapped; event references are kept so history before the fork is shared by reference - export/import: same archive; import is hostile-input validated (size, allow-listed tables, row caps, column names, checksum, forced mind_id) - compare: deterministic counts, belief diffs by proposition, personality and config diffs, event mix - replay: Runtime.Step for synchronous drivers; sandbox fork driven one stimulus at a time under a forbidden capability context; recorded model responses via a replaying router; steps labelled exact / approximate / diverged with recorded-vs-replayed digests - experiments: definition (overrides, stimuli, expectations, seed, duration), background run in a disabled subject mind, stored and exportable results - migration 0015, API, UI (Snapshots and Replay tabs, Experiments section, compare page), noemactl snapshots/compare/replay/experiments, docs
14 lines
2.8 KiB
HTML
14 lines
2.8 KiB
HTML
{{define "content"}}
|
|
{{$a := .Data.Mind}}{{$b := .Data.Other}}{{$c := .Data.C}}
|
|
<div class="pagehead"><h1>{{$a.DisplayName}} <span class="muted">vs</span> {{$b.DisplayName}}</h1><p class="muted">Deterministic comparison of two minds. {{range $c.Notes}}{{.}} {{end}}</p><p class="small"><a href="/minds/{{$a.Slug}}">{{$a.Slug}}</a> · <a href="/minds/{{$b.Slug}}">{{$b.Slug}}</a> · <a href="/minds/{{$b.Slug}}/compare?with={{$a.Slug}}">swap</a></p></div>
|
|
<section class="grid cols-2">
|
|
<div class="card"><h2>State</h2><table class="table compact"><thead><tr><th></th><th class="num">{{$a.Slug}}</th><th class="num">{{$b.Slug}}</th></tr></thead><tbody>{{range $c.Stats}}<tr><td>{{.Name}}</td><td class="num">{{.A}}</td><td class="num {{if ne .A .B}}strong{{end}}">{{.B}}</td></tr>{{end}}</tbody></table></div>
|
|
<div class="card"><h2>Configuration & personality</h2>
|
|
{{if $c.Config}}<table class="table compact"><thead><tr><th>Field</th><th>{{$a.Slug}}</th><th>{{$b.Slug}}</th></tr></thead><tbody>{{range $c.Config}}<tr><td class="mono small">{{.Field}}</td><td class="small">{{.A}}</td><td class="small">{{.B}}</td></tr>{{end}}</tbody></table>{{else}}<p class="muted small">Same configuration.</p>{{end}}
|
|
{{if $c.Personality}}<table class="table compact"><thead><tr><th>Personality</th><th>{{$a.Slug}}</th><th>{{$b.Slug}}</th></tr></thead><tbody>{{range $c.Personality}}<tr><td class="mono small">{{.Path}}</td><td class="small">{{.Old}}</td><td class="small">{{.New}}</td></tr>{{end}}</tbody></table>{{else}}<p class="muted small">Same personality.</p>{{end}}</div>
|
|
</section>
|
|
<div class="card"><h2>Beliefs <span class="muted small">{{index $c.Summary "beliefs_same"}} same · {{index $c.Summary "beliefs_changed"}} changed · {{index $c.Summary "beliefs_only_a"}} only in {{$a.Slug}} · {{index $c.Summary "beliefs_only_b"}} only in {{$b.Slug}}</span></h2>
|
|
{{if $c.Beliefs}}<table class="table compact"><thead><tr><th>Proposition</th><th class="num">{{$a.Slug}}</th><th class="num">{{$b.Slug}}</th><th class="num">Δ</th></tr></thead><tbody>{{range $c.Beliefs}}<tr><td>{{.Proposition}}</td><td class="num">{{if .InA}}{{conf .ConfA}} <span class="small muted">{{.StatusA}}</span>{{else}}<span class="muted">—</span>{{end}}</td><td class="num">{{if .InB}}{{conf .ConfB}} <span class="small muted">{{.StatusB}}</span>{{else}}<span class="muted">—</span>{{end}}</td><td class="num">{{if and .InA .InB}}{{printf "%+.2f" .Delta}}{{end}}</td></tr>{{end}}</tbody></table>{{else}}<p class="muted">Belief sets are identical.</p>{{end}}</div>
|
|
{{if $c.Events}}<div class="card"><h2>Event mix</h2><table class="table compact"><thead><tr><th>Type</th><th class="num">{{$a.Slug}}</th><th class="num">{{$b.Slug}}</th></tr></thead><tbody>{{range $c.Events}}<tr><td class="mono small">{{.Name}}</td><td class="num">{{.A}}</td><td class="num">{{.B}}</td></tr>{{end}}</tbody></table></div>{{end}}
|
|
{{end}}
|