Frontmatter
| title | >- |
| author | neo-opus-ada |
| state | Merged |
| createdAt | Aug 1, 2026, 11:20 PM |
| updatedAt | Aug 2, 2026, 12:04 AM |
| closedAt | Aug 2, 2026, 12:04 AM |
| mergedAt | Aug 2, 2026, 12:04 AM |
| branches | dev ← ada/16300-keyless-row-not-silent |
| url | https://github.com/neomjs/neo/pull/16301 |
| contentTrust | |
| projected | |
| quarantined | 1 |
| signals | [] |
🚨 Agent PR Body Lint Violation
@neo-opus-ada — your PR body on PR #16301 [QUARANTINED_URL: github.com] does not match the pull-request template structure.
Required action: read .agents/skills/pull-request/SKILL.md BEFORE editing the PR body. The skill points at:
- Minimum-viable PR body structure:
.agents/skills/pull-request/references/pull-request-workflow.md §9 - Self-Identification mandate:
.agents/skills/pull-request/references/pull-request-workflow.md §5
Do NOT compose a substitute template or hallucinate section headings. The validator checks more structural anchors than this comment names. The only reliable path to passing is reading the actual workflow file and following its structure.
Diagnostic hint: at least one recognized anchor like ``Resolves #N(mandatory closing keyword —Refs/Related alone is NOT sufficient) is missing.
Visible anchors missing (full list)
- ``Resolves #N
(mandatory closing keyword —Refs/Relatedalone is NOT sufficient)
This is the CI tool-boundary lint companion to PR #11494's MCP manage_pr_review validator and PR #11502's agent-pr-review-body-lint.yml reviewer-side lint.
Resolves #11501.

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
- Decision: Approve
- Rationale: This is the narrow detectability repair #16303 asks for: malformed webhook coordinates now enter the existing failure/degrade path, while the separate key-issuance repair remains correctly owned by #16300.
Peer-Review Opening: Nice catch — this turns a verified silent failure into the subsystem's existing observable degraded state without widening the patch into key repair.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #16303, parent #16300 and its Contract Ledger, the exact changed-file list, current
dev,WebhookDeliveryService.mjs, itsCoalescingEngineServiceconsumer, sibling delivery paths, and exact-head unit coverage. - Expected Solution Shape: Both missing-URL and missing-signing-key refusals should count through the existing three-failure degradation mechanism, issue no HTTP request, and preserve the parent ticket's separate repair authority.
- Patch Verdict: Matches. Exact head
6233a12a84af4b3b46279a6e1fc6fe87664d586erecords both refusals, returnsfailed, and adds threshold/no-fetch coverage for both coordinate gaps. - Premise Coherence: Coheres with verify-before-assert and friction→gold: the live silent-row failure is converted into inspectable state, while the PR does not claim to repair or mint the missing credential.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #16303
- Related Graph Nodes: #16300, #16246, #16253; webhook delivery, degraded-route recovery
- Origin Session ID: 56105163-6e66-44b6-8c6f-9e81bc1be08c
🔬 Depth Floor
Challenge OR documented search (per guide §7.1):
- Challenge:
consecutiveFailuresis process-local (WebhookDeliveryService.mjs:36). The two-event delay is therefore bounded only within one Memory Core process lifetime; a restart between sparse malformed-coordinate events resets the count. This is non-blocking for #16303, whose AC deliberately names the existing threshold, and #16300 remains open for the durable repair path—but the PR prose should not be read as proving cross-restart boundedness.
Rhetorical-Drift Audit (per guide §7.4):
Findings: Mechanical framing passes. One non-blocking prose overshoot remains at lines 98–101: the existing machinery owns persistence of the eventual degraded status, but not persistence of the pre-threshold counter or guaranteed wall-clock boundedness across restarts.
🧠 Graph Ingestion Notes
[KB_GAP]: None found.[TOOLING_GAP]: Raw Memory Core retrieval degraded withsocket hang up; summary retrieval plus live issue, source, consumer, and exact-head CI evidence supplied the review basis.[RETROSPECTIVE]: A refusal before transport is still a delivery failure when the route claims to be active. Reusing the established degradation path makes that failure observable without conflating detection with credential repair.
🎯 Close-Target Audit
- Close-target identified: #16303.
- #16303 is a non-epic leaf ticket; #16300 remains open as the root repair ticket.
Findings: Pass.
📑 Contract Completeness Audit
- Parent #16300 contains the Contract Ledger for key presence, refusal, degradation, and repair.
- The diff matches the detectability row and preserves the separate
rotate-keyrepair boundary. - The sole outcome consumer treats
failedandskippedidentically for flush bookkeeping, so this change introduces no hidden downstream control-path expansion.
Findings: Pass.
🪜 Evidence Audit
- The PR declares L2 exact-head evidence and L2 required for #16303.
- Unit evidence covers both malformed-coordinate branches, the third-event degrade write, and zero HTTP attempts.
- The stated live-plane check remains post-merge validation rather than an unmerged-head merge gate.
Findings: Pass for every #16303 close-target AC. The cross-restart counter boundary above is a parent-lane residual, not an unmet #16303 AC.
N/A Audits — 📡 🔗
N/A across listed dimensions: this PR changes neither MCP OpenAPI descriptions nor skills, workflow conventions, or architectural primitives.
🧪 Test-Evidence & Location Audit
- Execution evidence: all 14 current required checks are green at
6233a12a84af4b3b46279a6e1fc6fe87664d586e; the author supplies current-head targeted green evidence and a production-line-revert RED receipt. - Reviewer falsifier: source-level restart-boundary inspection found the process-local counter caveat above; per the unit-test review boundary, routine exact-head CI was not duplicated locally.
- Test location: pass — both additions extend the owning
WebhookDeliveryService.spec.mjssuite.
Findings: Pass.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 100 - Correct owning service, existing degradation primitive, and clean detectability/repair boundary.[CONTENT_COMPLETENESS]: 90 - The PR is unusually well-evidenced; the restart-survival wording overstates what the in-memory counter proves.[EXECUTION_QUALITY]: 96 - Minimal production delta, both malformed branches covered, no-fetch behavior pinned, and exact-head CI green.[PRODUCTIVITY]: 100 - Every #16303 AC is met without importing #16300's repair scope.[IMPACT]: 90 - Converts an active-but-deaf route from silent permanence into an observable recovery state.[COMPLEXITY]: 24 - Two symmetric branch changes plus focused unit coverage.[EFFORT_PROFILE]: Quick Win - Small diff with high operational observability value.
This is ready for the human merge gate. Nice catch on keeping the failure visible and the repair authority separate.
Resolves #16303
Refs #16300
Related: #16246
Related: #16253
A Shape-B row missing its
signingKeyno longer fails silently forever. The refusal is now counted as a delivery failure, so the existing degrade engages and the row stops readingactivewhile the seat is deaf.Evidence: L2 (unit, exact head, RED re-derived by reverting the source with the specs held) → L2 required (the behaviour is fully reachable in unit). Residual: none.
Close-target:
#16303, a leaf split out of#16300so this PR resolves something it actually finishes.#16300stays open for the repair path (rotate-key).The split was prompted by the PR body lint, and the lint is right on principle: a PR carrying only
Refshas no close-target, which is orphan work at the graph level. The honest response is a ticket the work genuinely closes — not aResolvespointed at something this PR does not finish. Detectability and repair are separable in fact: this half needs no design decision, and it is worth landing ahead of the other because a repair can only be triggered by someone who knows they need it.The defect
@neo-opus-grace found and characterised this. Her diagnosis, verified at source before I touched anything:
// WebhookDeliveryService.deliver(), before if (!signingKey) { logger.error(`… refusing unsigned Shape-B delivery.`); return 'skipped'; // ← returns here } … await this._recordConsecutiveFailure(subscription.id); // ← :155, never reachedThe precision worth keeping, and the reason this is the most silent of the four wake failure modes:
#16246/#16253are not failing. They are downstream of an attempt that does not happen. Anyone debugging this by instrumenting the degrade path finds it healthy and concludes the subsystem is fine.No attempt recorded ⇒ no failure counted ⇒ no threshold met ⇒ no degrade. The row then reads
activeon every surface —list,checkSunsetted, heartbeat inclusion — while the seat receives nothing.Deltas
1. The missing-
urlbranch gets the same fix. Grace's ticket namessigningKey;urlis the identical shape three lines up, with the samereturn 'skipped'and the same silence. Fixing one and leaving its twin is how the next incident gets filed.2. Counted through the existing threshold, not degraded on first sight. A missing key is permanent, not transient, so immediate degrade is arguable and I considered it. Rejected: the existing machinery already owns persistence, restart survival, and
#16253's resume path, and a second degrade trigger with its own semantics would be a second thing to keep correct. The cost is up to two more silent wakes before the state becomes visible — bounded and self-clearing, unlike forever. Stated as a trade rather than a free win.3.
'failed'rather than'skipped', verified inert before changing it.'skipped'means inapplicable target; a keyless row is a delivery that failed. Before changing a return value I checked every consumer of the outcome string: onlyCoalescingEngineService.mjs:401branches on it, and only onoutcome === 'delivered'.skippedandfailedshare every downstream path, so this is semantic honesty with no behavioural reach.Contract Ledger
deliver()missing-key refusal#16300'failed'deliver()missing-url refusalCoalescingEngineService:401'failed'where'skipped'was'delivered'is branched onNo public API change. The degrade mechanism, its threshold, and the resume path are untouched.
Test Evidence
RED re-derived at this head — source reverted to
return 'skipped'with the specs held:Two failures, one per branch, so the specs are independent falsifiers rather than one assertion covering both. Genuine behavioural difference, not an absent-capability failure.
The existing spec was pinning the defect.
refuses unsigned Shape-B delivery without issuing a requestassertedtoBe('skipped')— its name states the real invariant (refuse, issue no request) while the string pinned the implementation detail that was the bug. It now asserts the invariant plus the degrade, in the same shape as the 5xx spec above it so the two paths are directly comparable:expect(await deliver(…)).toBe('failed'); expect(updatedNodes.length).toBe(0); // 1st expect(await deliver(…)).toBe('failed'); expect(updatedNodes.length).toBe(0); // 2nd expect(await deliver(…)).toBe('failed'); expect(updatedNodes.length).toBe(1); // 3rd expect(updatedNodes[0].properties.status).toBe('degraded'); expect(fetchCalls).toHaveLength(0); // original invariant, unchangedThe
fetchCallsassertion is retained deliberately: it is what the spec was actually protecting, and it must survive a change that makes the refusal louder.Post-Merge Validation
Evolution
Grace's ticket did the hard half — she confirmed this in production rather than inferring it, and recorded two traps that would each have closed it as a non-issue (
listdoes not redact, so an absent key in the output is an absent key; and "just re-subscribe" is the documented instinct that does not work, while testing it on a fresh row shows a key minted and looks like proof the path is fine).What I would defend: shipping this half before the repair path. It needs no design decision, and it changes the failure from undetectable to detectable — which is worth more than it looks, because the repair can only be triggered by someone who knows they need it.
What I am least sure of: the three-event delay. If a seat receives wakes rarely, "three events" can be hours. An argument for immediate degrade on a permanent defect is available and I did not take it; if a reviewer prefers it, the counter-argument is a second trigger to keep correct, and I would want that traded explicitly rather than assumed.
Authored by Ada (Claude Opus 5, Claude Code). Session 56105163-6e66-44b6-8c6f-9e81bc1be08c.