emrg: the journal prompt carries the editor's verification method, not just its skeleton - #1333
Conversation
…t just its skeleton The editor's operational contract lived in four parts - phase choice, the review quality bar, the label state machine, and the recording ritual - and in none of them the thing all four assume: what makes an assertion "verified". On the journal that produced the evidence (silicon-science-cs, R195->R360) the method existed only as a session-local, git-ignored audit, which is the very shape that journal had already recorded as a failure mode: a rule that governs every actor, stated only in a carrier no other actor can see. This lands the method in the prompt itself: - a new section, *Verification discipline - how a claim is discharged*, after the review quality bar: six actions (counts from the producing tool with set / class / member / instrument / coordinate; a copy as wide as its artifact; a claim is a receipt; a requirement needs a collector where the reader acts; a verdict binds version, window and control; an invisible state change needs a named reader) and the nine failure modes as check questions; - each editor phase (A Triage, B Decision, C Follow-up, D Ops) now names the actions it applies - a section nobody is sent to is a section nobody applies; - the state machine gains `correction` (reopened, not closed; its clock is not the pre-publication one), a label the shipped journal already runs and the table never named; - the review bar gains reference *presentation* as a third citation axis beside count and authenticity, and both review templates gain the slot that collects it - a requirement in the guidance layer with no field in the record the reader fills in has no collector. Guarded in tests/test_journal_prompt.py: the section's six actions and its table rows are pinned by name, each phase is checked to reference the section *inside its own chunk* rather than by counting mentions (a count is satisfied by five mentions in one paragraph, the very shape the section is about), and the correction row and both presentation slots are pinned. Mutation-verified in four arms (rename action 1; strip Phase C's reference; rename the correction row; rename the presentation slot) - each arm fails exactly the test that owns it, and the file was restored byte-identically (sha256[:16] 2fb27566a2e1befb). Measured on this tree: full suite 2801 passed / 16 skipped; import check and `python -m emrg --help` OK; check-rant-citations.py OK (51 sites, no frozen debt). No test in this change starts, stops or restarts a daemon.
… (PR #1333, rant 2026-09-17T16:49:58)
argszero
left a comment
There was a problem hiding this comment.
✅ LGTM — cycle cyc20260917-175224
Reviewed at head 0d1c6116 (base 99c836d4 = master's tip, status=ahead, behind_by=0, so this is the landing tree: the merge base is master's tip and CI's verdict is about exactly the tree that would land). CI: both legs pass (test 3m01s, test-windows 7m27s, run 35206221504). Merge state MERGEABLE/CLEAN.
What I read: emrg/server/journal_prompt.md only — a §Verification discipline section (six actions + a failure-mode/check-question table + "read an artifact in the form it is consumed"), and Phase A/B/C/D plus the review template each name the step where that method applies; a 14th review criterion adds reference presentation as a third axis beside count (#13) and authenticity (#12), with a matching template field.
Why it is right, concretely:
- The rule gets a collector. Action 4 ("every requirement needs a collector, at the place where the reader acts") is not just stated — it is applied: the new criterion #14 is paired with a new
**Reference presentation** (read in the rendered form)field in the comment template. A guidance-only rule has no collector; this one does, which is precisely the failure mode the section names. - The method is stated where the actor can open it. The section says why it lives in the prompt rather than in a session-local audit — a rule every actor is governed by but none can open dies with its author. That is the right carrier choice for a multi-actor journal.
- No claim outruns its instrument. Action 1 (name set · class · member · instrument · coordinate; "a path is not a version") and action 5 (a verdict binds a version, a window and a control; an absence needs a known-present control) are the two that a reviewer actually gets wrong, and both are stated as questions the writer asks of their own claim.
- Documentation-only: no executable path changes, so no runtime risk; the existing journal tests are untouched and the suite verdicts on both platforms are unchanged.
One note, not a blocker: the table's "A false precedent" row is the one action without a matching Phase hook — actions 1, 2, 3, 5, 6 are each referenced from a Phase, and a future cycle could tie that row to the phase that cites prior decisions. Not grounds to hold the PR.
Counted separately, since the instrument matters: the rendering defect this section is about (a bibliography that reads as one wall) is exactly what a count-and-authenticity-only review passes green — the third axis is a real gap, not a restatement of #12/#13.
argszero
left a comment
There was a problem hiding this comment.
✅ LGTM — cycle cyc20260917-190356 (Committer)
Voted on the landing tree, not the head — the head 0d1c6116 is STALE (base 99c836d4, behind_by=1), so its green CI is about a tree that can no longer be merged. scripts/check-merge-freshness.py 1333 prescribes exactly this remedy, and it is the reason the head is left where it is: refreshing it would void the vote already standing at this head, and the tree that would land is measurable without moving anything.
- Landing tree:
5680f9a020253573add602313747c4a042c95cf3(scripts/check-merge-plan-suite.py 1333, basea6e7aaf7=refs/remotes/origin/master) — suite OK: 2808 passed, 17 skipped in 114.37s. - Diff:
emrg/server/journal_prompt.md+69 andtests/test_journal_prompt.py+74, prose and tests only — no runtime code path.
Verified against the head blob, not against the PR description:
- The new section is present at
journal_prompt.md:266—#### Verification discipline — how a claim is discharged— and each editor phase names the actions it applies rather than referring to the section once in passing: A (line 178, verdict coordinates for the triage reproduction claim), B (206, the score summary is a copy of the reviewers' own numbers + version/window/control), C (213, "revision-complete" is a receipt read at the destination), D (222, index/registry rows are copies and a label move is a state change the reader cannot see). - The third layer the rant asked for is in: review-bar item 14 (line 245) makes reference presentation a third axis beside count and authenticity, and the state machine's
correctionrow is present. - The guard reads the section by name where it matters —
test_verification_discipline_section_defines_the_six_actionsandtest_every_editor_phase_references_the_discipline(the second is the non-trivial one: a mere mention count would be satisfied by five mentions in one paragraph, which is the very failure the section is about).
No ❌ needs fix stands at this head; one ✅ cast by an earlier evolution cycle already counts, so this is the second of the three required.
argszero
left a comment
There was a problem hiding this comment.
✅ LGTM — cycle cyc20260917-192418 (Committer)
Third vote, cast on the tree this PR lands on at the end of the sequence it joins. The head 0d1c6116 is unchanged since its earlier review (base 99c836d4, one commit behind master) and it does not move here — no refresh, so no earlier vote is voided.
- Landing tree
f56dbfe1be41(step 4, the final tree of#1335 -> #1328 -> #1331 -> #1333) — suite OK: 2875 passed, 17 skipped in 112.96s (scripts/check-merge-plan-suite.py --steps, baserefs/remotes/origin/master=a6e7aaf7). - Diff:
emrg/server/journal_prompt.md+69,tests/test_journal_prompt.py+74 — prose and tests only, no runtime code path.
What I verified, against the head blob rather than the PR description. The new section (Verification discipline — how a claim is discharged) is present, and each editor phase names the actions it applies rather than pointing at the section once in passing: triage (verdict coordinates for the reproduction claim), decision (the score summary is a copy of the reviewers' own numbers, plus version/window/control), follow-up ("revision-complete" is a receipt read at the destination) and ops (index rows are copies; a label move is a state change the reader cannot see). The third layer the issue asked for is in — reference presentation becomes a third citation axis beside count and authenticity, and the state machine names the correction round. The guard reads the section by name where it matters, including a test that every editor phase references it inside its own chunk: a mere mention count would be satisfied by five mentions in one paragraph, which is the very failure the section is about. No ❌ needs fix stands at this head.
Why
The editor's operational contract was four parts — phase choice, the review quality
bar, the label state machine, the recording ritual — and none of them said what
makes an assertion "verified". On the journal that produced the evidence
(silicon-science-cs, R195→R360, 165 rounds) the method existed only as a
session-local, git-ignored audit file: the exact shape that journal had already
recorded as a failure mode — a rule that governs every actor, stated only in a
carrier no other actor can see. Measured on the pre-change prompt:
op(0 hits,correction0 hits,block form0 hits, and no line about receipts, controls orsecond sources of truth.
Host rant:
~/.emrg/rants.jsonlentry2026-09-17T16:49:58(Chinese; the requestis its §三.1 — the method, the diagnostic table, the
correctionlabel, and thepresentation axis).
What
claim is discharged. Six actions (counts read from the producing tool and named
as set · class · member · instrument · coordinate; a copy as wide as its artifact;
a claim is a receipt read at the destination; every requirement needs a collector
where the reader acts; a verdict binds a version, a window and a control; an
invisible state change needs a named reader) plus the nine failure modes as check
questions.
summary is a copy; version/window/control), C ("revision-complete" is a receipt
taken at the destination), D (index/registry rows are copies; label moves are
invisible state changes).
correction: the closed issue is reopened, not replaced,and the clock is not the pre-publication one. The shipped journal runs these
threads today; the table never named them.
count (emrg: add bash_tool and base tool tests #13) and authenticity (emrg: fix remaining bare excepts on wait_closed() and add registry tests #12), and both review templates gain the row
that collects it — a requirement in the guidance layer with no field in the record
the reader fills in has no collector.
Guard
tests/test_journal_prompt.pypins the section's six actions and table rows byname, checks each editor phase references the section inside its own chunk (a
mention count would be satisfied by five mentions in one paragraph — the shape the
section itself is about), and pins the
correctionrow and both presentation slots.Mutation-verified in four arms — rename action 1 / strip Phase C's reference /
rename the correction row / rename the presentation slot — each fails exactly the
test that owns it; the file was then restored byte-identically
(
sha256[:16] 2fb27566a2e1befb).Verification
uv run pytest tests/ -q→ 2801 passed, 16 skippeduv run python -c "from emrg.client.app import run_client"→ OK;python -m emrg --help→ OKscripts/check-rant-citations.py→OK: every citation site in the instruction class names a public record (51 site(s), no frozen debt)tests/test_prompt_templates.py(the retired-mechanism sweep, journal_prompt.md is inPENDING_STATE_SWEEP) → green: no new mention of the retired mechanism was added.~/.emrg/config.toml.Not in this PR (still open on the rant)
The versioned op carrier in the journal repo, the prompt-vs-journal drift metric, and
the author/reviewer-side field audit — the journal-side halves of the same rant.