diff --git a/public/app.js b/public/app.js
index 0e14d62..e7c1d92 100644
--- a/public/app.js
+++ b/public/app.js
@@ -254,6 +254,12 @@ function renderFirstScreen(firstScreen = {}) {
Why this wins
${escapeHtml(firstScreen.why || 'It is the best first proof slice.')}
+
+
Pass / stop signals
+
Pass: ${escapeHtml(firstScreen.passSignal || 'A real user can name why this should be first.')}
+
Stop: ${escapeHtml(firstScreen.stopSignal || 'The proof creates no clear action, request, or value signal.')}
+
${escapeHtml(firstScreen.proofCadence || 'Run one tiny proof cycle, then rerank.')}
+
${held.length ? `Hold back${held.map((item) => `- ${escapeHtml(item.title)}${item.lane ? ` — ${escapeHtml(item.lane)}` : ''}
`).join('')}
` : ''}
${firstScreen.sourceQuote ? `${escapeHtml(firstScreen.sourceTitle || 'Source quote')}${escapeHtml(firstScreen.sourceQuote)}
` : ''}
${guardrails.length ? `Guardrails: ${guardrails.map(escapeHtml).join(' · ')}` : ''}
@@ -280,6 +286,11 @@ function renderDecisionReceipt(receipt = {}) {
Evidence question
${escapeHtml(receipt.evidenceQuestion || 'What would make this ranking obviously right or wrong?')}
+
+
Proof gate
+
Pass: ${escapeHtml(receipt.passSignal || 'Evidence makes the active move obviously worth keeping first.')}
+
Stop: ${escapeHtml(receipt.stopSignal || 'Evidence does not create a clear next action.')}
+
${held.length ? `Do not start yet${held.map((item) => `- ${escapeHtml(item)}
`).join('')}
` : ''}
${receipt.sourceAnchor ? `Source anchor: ${escapeHtml(receipt.sourceAnchor)}` : ''}
${escapeHtml(receipt.handoffRule || 'Only the Do first item is active.')}
diff --git a/public/styles.css b/public/styles.css
index 2eeeff4..d216c9b 100644
--- a/public/styles.css
+++ b/public/styles.css
@@ -39,10 +39,10 @@ button,input,textarea{font:inherit} button{cursor:pointer} a{color:inherit;text-
.lane-column .rank-card{box-shadow:none;margin:0;border-width:1.5px}.lane-column .rank-card h3{font-size:clamp(20px,2vw,28px)}.lane-column .metrics{grid-template-columns:1fr}.signal-pills{margin:10px 0}.signal-pills span{background:#f0e8d9;font-size:10px;padding:5px 8px}.action-strip{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin:14px 0}.action-strip>div{border:1.5px solid var(--hair);background:#fff6e6;padding:10px}.action-strip span{color:var(--blue2);font-size:10px}.action-strip p{margin:0;font-size:13px;line-height:1.35}.reflection-room{margin-top:24px}.expert-card{position:relative}.expert-card::before{content:"“";position:absolute;right:14px;top:0;font-size:72px;line-height:1;color:rgba(36,92,255,.16);font-weight:1000}
@media (max-width:1100px){.lane-board{grid-template-columns:repeat(2,minmax(0,1fr))}.quick-glance{grid-template-columns:repeat(2,minmax(0,1fr))}.action-strip{grid-template-columns:1fr}}
@media (max-width:700px){.lane-board,.quick-glance{grid-template-columns:1fr}.memo-head::after{position:static;display:inline-block;margin-top:14px;transform:none}.result-actions .button{width:100%;justify-content:center}.quick-glance{box-shadow:6px 6px 0 var(--ink)}.quick-glance>div{min-height:auto}}
-.decision-receipt{display:grid;grid-template-columns:1.1fr 1fr 1fr 1fr;gap:10px;margin:-6px 0 22px;padding:12px;border:2px solid var(--ink);background:#fffaf1;box-shadow:6px 6px 0 rgba(21,19,15,.18)}.decision-receipt>div{border:1.5px solid var(--hair);background:#fff6e5;padding:12px}.decision-receipt span{display:block;margin-bottom:7px;color:var(--blue2);text-transform:uppercase;letter-spacing:.12em;font-size:10px;font-weight:1000}.decision-receipt strong{display:block;font-size:clamp(20px,2.3vw,30px);line-height:1;letter-spacing:-.05em}.decision-receipt p{margin:0;color:var(--ink2);line-height:1.35}.decision-receipt ul{margin:0;padding-left:18px;color:var(--ink2)}.decision-receipt small{grid-column:1/-1;color:var(--muted);font-weight:850}.source-trace{margin:-4px 0 22px;padding:14px 16px;border:2px dashed var(--ink);background:#fff6e5;color:var(--ink2);box-shadow:5px 5px 0 rgba(21,19,15,.16)}.source-trace span,.handoff-card>span{display:block;margin-bottom:8px;color:var(--blue2);text-transform:uppercase;letter-spacing:.12em;font-size:11px;font-weight:1000}.source-trace b{display:block;margin-bottom:6px;font-size:14px}.source-trace p{margin:0;color:var(--muted);line-height:1.45}.item-source-trace{margin:12px 0;padding:9px 10px;border:1.5px dashed var(--hair);background:#fffaf1;color:var(--ink2)}.item-source-trace summary{cursor:pointer;color:var(--blue2);font-size:11px;font-weight:1000;letter-spacing:.08em;text-transform:uppercase}.item-source-trace p{margin:8px 0 6px;color:var(--muted);font-size:13px;line-height:1.4}.item-source-trace small{display:block;color:var(--muted);font-size:11px;font-weight:800}.handoff-card{border-left:8px solid var(--green)}.handoff-card.status-usable-with-warnings{border-left-color:var(--amber)}.handoff-card.status-needs-source-context,.handoff-card.status-blocked{border-left-color:var(--red)}.handoff-warnings{display:grid;gap:6px;margin-top:12px}.handoff-warnings code{display:block;white-space:normal;border:1px solid var(--hair);background:#f3eee4;padding:7px 9px;font-size:12px;color:var(--ink2)}
+.decision-receipt{display:grid;grid-template-columns:1.1fr 1fr 1fr 1fr 1fr;gap:10px;margin:-6px 0 22px;padding:12px;border:2px solid var(--ink);background:#fffaf1;box-shadow:6px 6px 0 rgba(21,19,15,.18)}.decision-receipt>div{border:1.5px solid var(--hair);background:#fff6e5;padding:12px}.decision-receipt span{display:block;margin-bottom:7px;color:var(--blue2);text-transform:uppercase;letter-spacing:.12em;font-size:10px;font-weight:1000}.decision-receipt strong{display:block;font-size:clamp(20px,2.3vw,30px);line-height:1;letter-spacing:-.05em}.decision-receipt p{margin:0;color:var(--ink2);line-height:1.35}.decision-receipt ul{margin:0;padding-left:18px;color:var(--ink2)}.decision-receipt small{grid-column:1/-1;color:var(--muted);font-weight:850}.source-trace{margin:-4px 0 22px;padding:14px 16px;border:2px dashed var(--ink);background:#fff6e5;color:var(--ink2);box-shadow:5px 5px 0 rgba(21,19,15,.16)}.source-trace span,.handoff-card>span{display:block;margin-bottom:8px;color:var(--blue2);text-transform:uppercase;letter-spacing:.12em;font-size:11px;font-weight:1000}.source-trace b{display:block;margin-bottom:6px;font-size:14px}.source-trace p{margin:0;color:var(--muted);line-height:1.45}.item-source-trace{margin:12px 0;padding:9px 10px;border:1.5px dashed var(--hair);background:#fffaf1;color:var(--ink2)}.item-source-trace summary{cursor:pointer;color:var(--blue2);font-size:11px;font-weight:1000;letter-spacing:.08em;text-transform:uppercase}.item-source-trace p{margin:8px 0 6px;color:var(--muted);font-size:13px;line-height:1.4}.item-source-trace small{display:block;color:var(--muted);font-size:11px;font-weight:800}.handoff-card{border-left:8px solid var(--green)}.handoff-card.status-usable-with-warnings{border-left-color:var(--amber)}.handoff-card.status-needs-source-context,.handoff-card.status-blocked{border-left-color:var(--red)}.handoff-warnings{display:grid;gap:6px;margin-top:12px}.handoff-warnings code{display:block;white-space:normal;border:1px solid var(--hair);background:#f3eee4;padding:7px 9px;font-size:12px;color:var(--ink2)}
@media (max-width:1100px){.decision-receipt{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:700px){.decision-receipt{grid-template-columns:1fr;box-shadow:5px 5px 0 rgba(21,19,15,.18)}}
-.active-slice-strip{display:grid;grid-template-columns:1.25fr 1fr 1fr 1fr;gap:10px;margin:-6px 0 22px;padding:12px;border:3px solid var(--ink);background:#15130f;color:#fff;box-shadow:8px 8px 0 var(--blue)}
+.active-slice-strip{display:grid;grid-template-columns:1.25fr 1fr 1fr 1fr 1fr;gap:10px;margin:-6px 0 22px;padding:12px;border:3px solid var(--ink);background:#15130f;color:#fff;box-shadow:8px 8px 0 var(--blue)}
.handoff-strip{display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px;margin:22px 0 -6px;padding:12px;border:3px solid var(--ink);background:#fffaf1;box-shadow:7px 7px 0 rgba(21,19,15,.20)}.handoff-strip.status-ready{box-shadow:7px 7px 0 var(--green)}.handoff-strip.status-warn{box-shadow:7px 7px 0 var(--amber)}.handoff-strip.status-blocked{box-shadow:7px 7px 0 var(--red)}.handoff-strip>div{border:1.5px solid var(--hair);background:#fff6e5;padding:13px}.handoff-strip span{display:block;margin-bottom:7px;color:var(--blue2);text-transform:uppercase;letter-spacing:.12em;font-size:10px;font-weight:1000}.handoff-strip strong{display:block;margin-bottom:7px;font-size:clamp(18px,2vw,26px);line-height:1;letter-spacing:-.04em}.handoff-strip p{margin:0;color:var(--ink2);line-height:1.35}.handoff-strip small{grid-column:1/-1;color:var(--muted);font-weight:850}
.active-slice-strip>div{border:1.5px solid rgba(255,255,255,.32);background:linear-gradient(145deg,rgba(255,255,255,.10),rgba(255,255,255,.03));padding:13px}
.active-slice-strip span{display:block;margin-bottom:7px;color:#bfcaff;text-transform:uppercase;letter-spacing:.12em;font-size:10px;font-weight:1000}.active-slice-strip h3{margin:0 0 8px;font-size:clamp(24px,3vw,42px);line-height:.9;letter-spacing:-.06em}.active-slice-strip p{margin:0;color:#f7efe1;line-height:1.38}.active-slice-strip ul{margin:0;padding-left:18px;color:#f7efe1}.active-slice-strip small{grid-column:1/-1;color:#d9ddff;font-weight:850}.active-source-quote{grid-column:1/-1;margin:0;padding:12px 14px;border:1.5px dashed rgba(255,255,255,.42);background:rgba(255,255,255,.06);color:#f7efe1;line-height:1.42}.active-source-quote span{color:#d9ddff}.active-slice-main{background:linear-gradient(145deg,rgba(36,92,255,.28),rgba(255,255,255,.04))!important}
diff --git a/scripts/check-rank-feedback.mjs b/scripts/check-rank-feedback.mjs
index d482e46..57fe17b 100644
--- a/scripts/check-rank-feedback.mjs
+++ b/scripts/check-rank-feedback.mjs
@@ -87,6 +87,11 @@ try {
assert.equal(data.brief.firstScreen.proofScript, data.brief.decisionReceipt.proofScript);
assert.match(data.brief.firstScreen.proofScript, /I have a Scattermind build-order recommendation/);
assert.match(data.brief.firstScreen.proofScript, /Snapshot to Ranker feature-set contract/);
+ assert.equal(data.brief.firstScreen.passSignal, data.handoff.activeSlice.proof.successSignal);
+ assert.equal(data.brief.firstScreen.stopSignal, data.handoff.activeSlice.proof.killSignal);
+ assert.equal(data.brief.decisionReceipt.passSignal, data.handoff.activeSlice.proof.successSignal);
+ assert.equal(data.brief.decisionReceipt.stopSignal, data.handoff.activeSlice.proof.killSignal);
+ assert.match(data.brief.decisionReceipt.proofCadence, /rerank before adding surface area/);
assert.deepEqual(data.brief.firstScreen.guardrails, ['Avoid accounts, workspaces, and team voting']);
assert.ok(data.brief.firstScreen.holdBack.some(item => item.title === 'Subscription billing layer'));
assert.match(data.brief.firstScreen.rule, /One active move/);
diff --git a/server.js b/server.js
index 340cf78..8403c43 100644
--- a/server.js
+++ b/server.js
@@ -1885,6 +1885,9 @@ function createDecisionBrief({ idea, context, mode, ranked, provenance, decision
sourceAnchor: activeSourceAnchor,
sourceTitle: activeSourceTitle,
sourceQuote: activeSourceQuote,
+ passSignal: successSignalFor(top),
+ stopSignal: killSignalFor(top),
+ proofCadence: 'Run one tiny proof cycle, then rerank before adding surface area.',
holdBack: deferred.slice(0, 3).map(item => ({ title: item.title, lane: item.lane?.label || 'Not now', reason: reasonFor(item) })),
guardrails: (decisionContext?.nonGoals || []).slice(0, 3),
rule: 'One active move. Everything else waits until this proof produces evidence.',
@@ -1895,6 +1898,9 @@ function createDecisionBrief({ idea, context, mode, ranked, provenance, decision
firstProofStep: nextStepFor(top),
evidenceQuestion: evidenceQuestionFor(top),
proofScript: activeProofScript,
+ passSignal: successSignalFor(top),
+ stopSignal: killSignalFor(top),
+ proofCadence: 'Run one tiny proof cycle, then rerank before adding surface area.',
doNotStartYet: deferred.slice(0, 3).map(item => item.title),
sourceAnchor: activeSourceAnchor,
sourceTitle: activeSourceTitle,