Problem
The ## What section of change summaries — and the PR descriptions derived from them — repeatedly ships over-detailed, mechanism-laden ledes despite a mature lede-voice doctrine that forbids exactly this. The recurrence persists across many rounds of doctrine tightening, which signals the lever is not wording.
Pipeline today: /create-pr → summarize-change (delegates the ## What) → changelog-writer (reads lede-voice, composes, returns text used verbatim). The failure mode:
- The orchestrator can launder mechanism into the
outcome: field it hands the subagent. The subagent renders that substance faithfully because its own mandate tells it to — "your job is voice, not substance" — so supplied cruft survives intact.
- The subagent self-audits its own draft; author-grades-own-work is a weak gate, but it is weakest precisely because the mandate above tells it to preserve the laundered substance rather than cut it.
- The
verbatim rule forbids the orchestrator from pruning the returned text, removing the one backstop positioned to cut cruft it can see.
Context
The diagnosis that prior fixes "tightened doctrine without curing it" points at the wrong layer. Every tightening pass edited lede-voice.md — the rules doc. The actual structural cause is the changelog-writer mandate that instructs the agent to treat everything in outcome as substance to preserve. That mandate has never been the target of a fix. So strengthening it is a first attempt at the real cause, not another round of the same.
The failure is semantic on both axes: distinguishing mechanism prose from outcome (Rule 1) and a banned identifier from an allowed one (Rule 2) both require knowing the referent, not the token — so no cheap deterministic gate is viable. Enforcement is either a doctrine-reading agent grading itself or one grading another; there is no middle.
The concrete regression is this repo's PR #703: an earlier over-detailed draft that only a human glancing at the PR caught and cut. The committed lede is clean; nothing automated stopped the bad draft.
Proposed solution
Reassign authority across the pipeline boundary rather than add doctrine prose, splitting cutting mechanism (routing detail to the right channel — already what the doctrine demands) from authoring outcome facts (what the change delivers):
- Rework the
changelog-writer mandate so cutting mechanism, internal naming, and output-format detail is the writer's obligation — explicitly including detail that arrives inside outcome — while inventing or altering the outcome itself remains the caller's responsibility.
- Tighten the
outcome: field contract so it must carry the mechanism-free reader-facing delta, not a draft, closing the laundering channel at the source.
- Reconcile the
verbatim constraint so the orchestrator may prune cruft it identifies directly, while still reserving voice and register changes for redispatch. This makes the orchestrator a non-self backstop reader — the lean substitute for an every-PR independent gate.
Deferred (tripwire). An independent audit dispatch on every finished lede — the original heavyweight fix — is intentionally not built now. The mandate cause has never been addressed, so it earns a clean attempt first. If a mechanism lede later slips the strengthened self-audit plus orchestrator backstop, wiring in the existing changelog-writer audit mode is the documented next step.
Acceptance criteria
Must have
Should have
Nice to have
Problem
The
## Whatsection of change summaries — and the PR descriptions derived from them — repeatedly ships over-detailed, mechanism-laden ledes despite a maturelede-voicedoctrine that forbids exactly this. The recurrence persists across many rounds of doctrine tightening, which signals the lever is not wording.Pipeline today:
/create-pr→summarize-change(delegates the## What) →changelog-writer(readslede-voice, composes, returns text used verbatim). The failure mode:outcome:field it hands the subagent. The subagent renders that substance faithfully because its own mandate tells it to — "your job is voice, not substance" — so supplied cruft survives intact.verbatimrule forbids the orchestrator from pruning the returned text, removing the one backstop positioned to cut cruft it can see.Context
The diagnosis that prior fixes "tightened doctrine without curing it" points at the wrong layer. Every tightening pass edited
lede-voice.md— the rules doc. The actual structural cause is thechangelog-writermandate that instructs the agent to treat everything inoutcomeas substance to preserve. That mandate has never been the target of a fix. So strengthening it is a first attempt at the real cause, not another round of the same.The failure is semantic on both axes: distinguishing mechanism prose from outcome (Rule 1) and a banned identifier from an allowed one (Rule 2) both require knowing the referent, not the token — so no cheap deterministic gate is viable. Enforcement is either a doctrine-reading agent grading itself or one grading another; there is no middle.
The concrete regression is this repo's PR #703: an earlier over-detailed draft that only a human glancing at the PR caught and cut. The committed lede is clean; nothing automated stopped the bad draft.
Proposed solution
Reassign authority across the pipeline boundary rather than add doctrine prose, splitting cutting mechanism (routing detail to the right channel — already what the doctrine demands) from authoring outcome facts (what the change delivers):
changelog-writermandate so cutting mechanism, internal naming, and output-format detail is the writer's obligation — explicitly including detail that arrives insideoutcome— while inventing or altering the outcome itself remains the caller's responsibility.outcome:field contract so it must carry the mechanism-free reader-facing delta, not a draft, closing the laundering channel at the source.verbatimconstraint so the orchestrator may prune cruft it identifies directly, while still reserving voice and register changes for redispatch. This makes the orchestrator a non-self backstop reader — the lean substitute for an every-PR independent gate.Deferred (tripwire). An independent
auditdispatch on every finished lede — the original heavyweight fix — is intentionally not built now. The mandate cause has never been addressed, so it earns a clean attempt first. If a mechanism lede later slips the strengthened self-audit plus orchestrator backstop, wiring in the existingchangelog-writerauditmode is the documented next step.Acceptance criteria
Must have
changelog-writermandate explicitly requires (not merely permits) cutting mechanism/cruft from the lede, including detail supplied through the upstreamoutcome:input, and distinguishes that obligation from inventing or altering outcome facts.verbatimconstraint insummarize-changepermits the orchestrator to prune cruft it identifies directly, while still routing voice/register changes through redispatch.outcomeis confirmed to return cut clean from the strengthened pipeline.Should have
outcome:field contract states the field must itself be mechanism-free — the reader-facing delta, not a draft — so detail cannot be laundered through it.Nice to have