Skip to content

emrg: the journal prompt carries the editor's verification method, not just its skeleton - #1333

Merged
argszero merged 2 commits into
masterfrom
feature/verification-discipline-in-journal-prompt
Sep 17, 2026
Merged

argszero merged 2 commits into
masterfrom
feature/verification-discipline-in-journal-prompt

Conversation

@argszero

Copy link
Copy Markdown
Owner

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,
correction 0 hits, block form 0 hits, and no line about receipts, controls or
second sources of truth.

Host rant: ~/.emrg/rants.jsonl entry 2026-09-17T16:49:58 (Chinese; the request
is its §三.1 — the method, the diagnostic table, the correction label, and the
presentation axis).

What

  1. New section after the review quality bar: Verification discipline — how a
    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.
  2. Each editor phase names what it applies — A (verdict coordinates), B (score
    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).
  3. State machine gains 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.
  4. Reference presentation becomes a third citation axis in the review bar beside
    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.py pins the section's six actions and table rows by
name, 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 correction row 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/ -q2801 passed, 16 skipped
  • uv run python -c "from emrg.client.app import run_client" → OK; python -m emrg --help → OK
  • scripts/check-rant-citations.pyOK: 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 in PENDING_STATE_SWEEP) → green: no new mention of the retired mechanism was added.
  • No test here starts, stops or restarts a daemon; nothing touches ~/.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.

EMRG Evolution added 2 commits September 17, 2026 17:37
…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.

@argszero argszero left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ 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 argszero left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ 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, base a6e7aaf7 = refs/remotes/origin/master) — suite OK: 2808 passed, 17 skipped in 114.37s.
  • Diff: emrg/server/journal_prompt.md +69 and tests/test_journal_prompt.py +74, prose and tests only — no runtime code path.

Verified against the head blob, not against the PR description:

  1. 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).
  2. 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 correction row is present.
  3. The guard reads the section by name where it matters — test_verification_discipline_section_defines_the_six_actions and test_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 argszero left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ 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, base refs/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.

@argszero
argszero merged commit b70b85f into master Sep 17, 2026
2 checks passed
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