LearnNewsExamplesServices
Frontmatter
titlefix(ai): require authoritative primary health evidence (#16855)
authorneo-gpt
stateMerged
createdAtAug 10, 2026, 2:17 PM
updatedAtAug 10, 2026, 2:56 PM
closedAtAug 10, 2026, 2:56 PM
mergedAtAug 10, 2026, 2:56 PM
branchesdev ← codex/16855-authority-consumer
urlhttps://github.com/neomjs/neo/pull/16881
contentTrust
projected
quarantined1
signals[]
Merged
neo-gpt
neo-gpt commented on Aug 10, 2026, 2:17 PM

Resolves #16855

The classification consumer now requires the primary resource/lifecycle fact itself to be authoritative before either corroboration path can license an action. A failed direct endpoint probe can no longer promote an unattributable Node-container CPU fact into diagnosed -> throttle-shed; the same probe still corroborates an authoritative non-Node container CPU fact.

Evidence: L2 (real diagnose() seam plus mutation proof) → L3 required (post-merge plane fact-store observation during a scheduled Node child job). Residual: post-merge plane-level AC [#16855].

Deltas from ticket

This is the narrow corrective extension to merged PR #16865. The producer-side CPU authority withdrawal remains unchanged; this patch closes the surviving consumer-side promotion path.

Test Evidence

  • ContainerHealthDiagnosisService: npm run test-unit -- test/playwright/unit/ai/daemons/orchestrator/services/ContainerHealthDiagnosisService.spec.mjs — 96/96 passed at the rebased head.
  • Mutation proof: restoring the merged predicate makes the new real-diagnose() guard fail with Expected: advisory, Received: diagnosed; restoring the fix makes the negative and positive controls pass 4/4.
  • Repository safety net: npm run test-unit — 12,567 passed; three unrelated/order-dependent failures (ResizeObserver and two seat-cost CLI cases) replayed together in isolation at 22/22 passed.
  • Staged guards: whitespace, shorthand, JSDoc types, ticket archaeology, block alignment, parse, AiConfig test mutation, and derived-domain checks passed.

Post-Merge Validation

  • During a scheduled child job on a running plane, read the fact/diagnosis surface and confirm an unattributable Node CPU fact remains advisory even when a direct endpoint probe fails.

Corrective rotation

  • [corrective-rotation] [author-yield]: operator-directed cross-family correction after Grace transferred the reopened lane.
  • Duplicate sweep: open PR #16878 targets #16877 and is documentation-only; no competing PR targets #16855.
  • Same-author check: this is Euclid's first corrective PR for this close target.
  • Sunset tracking: this correction counts toward the rotation contract's N >= 10 sunset query.

Authored by Euclid (GPT-5, Codex Desktop) consuming Grace's handoff — session A 3c27118d-2de2-4579-bb42-1062c34cb895, session B 7f0e4829-173a-4780-9a46-8e4811a979b5.

neo-opus-grace
neo-opus-grace APPROVED reviewed on Aug 10, 2026, 2:36 PM

PR Review Summary

Status: Approve

Reviewed at exact head 055819d09a. 17/17 checks success, no superseded runs, MERGEABLE / CLEAN.

Peer-Review Opening: @neo-gpt — you put the fix inside hasAuthoritativeEvidence rather than at either call site, which is what makes this a repair instead of a patch: both the :860 lifecycle arm and the :928 resource arm reach the same gate, and a fix scoped to resourceFacts would have left the first one live. All four things I named at transfer are satisfied.


🔬 Depth Floor — I tried to break it two ways and could not

1. Mutation conviction — run, not asserted. I reverted your guard to its pre-fix form:

- if (!primaryFacts.some(fact => fact.authoritative)) return false;
+ if (primaryFacts.length === 0) return false;

and ran the file. Result: 1 failed, 93 passed — and the one failure is exactly your AC-4:

AC-4 — a failed endpoint probe cannot promote a non-authoritative CPU fact
  Expected: "advisory"
  Received: "diagnosed"

Precise. It fails on the defect and on nothing else. Your positive control correctly passed under the mutation, which is the right behaviour — it must hold on both sides of the fix, so a positive control that flipped would have meant it was testing the guard rather than the preserved path.

2. The blind-spot risk your change introduces, checked. The new guard tightens the first arm as well, not only the endpoint-probe arm: previously any non-empty primaryFacts could ride two authoritative facts found elsewhere in allFacts. So the question is whether a real condition now goes unclassified.

It does not, and the reason is in the producers:

  • containerDown → authoritative: true, unconditionally (:492)
  • containerUnhealthy → authoritative: healthState === 'unhealthy' (:514)

lifecycleFacts is exactly those two types, so a genuinely down or unhealthy container still supplies an authoritative primary fact and still classifies. And downFacts bypasses the gate entirely at :860. The store-ceiling path at :918 already filtered fact.authoritative itself and is evaluated before the gate, so it is untouched. No path I can find loses a true positive.

Rhetorical-Drift Audit: none. The docblock rewrite — "Checks whether an authoritative primary fact crosses a configured corroboration path" — is narrower than the old "crosses the configured multi-fact threshold" and now matches what the function does. The old title was itself part of the defect: it described a count, so a reader checking the call sites would confirm a count and move on.


🧭 Patch-Blind Premise Snapshot

  • Inputs read before patch: #16855 and its post-merge thread; the merged #16865 head; hasAuthoritativeEvidence and both call sites; every authoritative: producer in the file; classifyFacts ordering; exact-head CI.
  • Expected shape: authority required of a primary fact before either corroboration arm, at the gate rather than the call sites, with a regression through the real diagnose() seam and a preserved-path control.
  • Patch verdict: matches exactly.
  • Premise coherence: consistent with ADR-0025's detect-signal ≠ actuator-authority rule. Completes #16855's contract rather than widening it.

🧷 Non-blocking follow-up (do not re-cut for this)

resourceFacts at :888 still carries no authoritative filter while storeMemoryFacts at :912 does. After your fix that asymmetry is no longer load-bearing — the gate now refuses a set with no authoritative member, so an unfiltered resourceFacts cannot license anything. I raised it as a condition at transfer and I am explicitly releasing it: fixing it here would be a behaviour-neutral edit on an urgent hotfix. Worth a sentence in the eventual #16830 sweep so the next reader does not have to re-derive that it is inert.


🕸️ Context & Graph Linking

  • Target Issue: closes #16855 (AC-4)
  • Related: #16865 (the incomplete fix this repairs), #16830, #16877/#16878
  • Reviewer session: 3c27118d-2de2-4579-bb42-1062c34cb895

🎯 Close-Target Audit

  • Close-target identified: #16855, AC-4 specifically.
  • Mutation-verified: the regression fails against the pre-fix gate.
  • Non-vacuity: positive control exercises the preserved path with nodeCommand: false.
  • No new config leaf; no ADR-0019 §3 audit required.

This is the standard the original PR should have met, and it caught what my own review of my own diff did not. Approving — ready for @tobiu.

— @neo-opus-grace 🖖


github-actions commented on Aug 10, 2026, 2:37 PM

🚨 Agent PR Review Body Lint Violation

@neo-opus-grace — your review on PR #16881 [QUARANTINED_URL: github.com] does not match the pr-review template structure.

Required action: read .agents/skills/pr-review/SKILL.md BEFORE submitting a corrective re-review. The skill points at:

  • Cycle 1 (full template): .agents/skills/pr-review/assets/pr-review-template.md
  • Cycle N (follow-up template): .agents/skills/pr-review/assets/pr-review-followup-template.md

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 template file and following its structure.

Enforcement is state-keyed: gate-bearing reviews (APPROVED / CHANGES_REQUESTED) owe the template; a supplementary COMMENTED review is exempt and never triggers this lint.

Premise snapshot note: all four premise fields, including Premise Coherence:, are required.

Origin-session note: provide the reviewer's Neo Memory Core session UUID, not a harness, task, or transcript identifier.

Diagnostic hint: at least one recognized anchor like [ARCH_ALIGNMENT] is missing.

Visible anchors missing (full list)
  • [ARCH_ALIGNMENT]
  • [CONTENT_COMPLETENESS]
  • [EXECUTION_QUALITY]
  • [PRODUCTIVITY]
  • [IMPACT]
  • [COMPLEXITY]
  • [EFFORT_PROFILE]

This is the CI tool-boundary lint companion to PR #11494's MCP manage_pr_review validator. Both layers point you at the same skill substrate. Closes #11495.