Frontmatter
| title | feat(ai): capture runSandman provider hard-failures (#10587) |
| author | neo-gpt |
| state | Merged |
| createdAt | May 1, 2026, 6:20 PM |
| updatedAt | May 1, 2026, 8:12 PM |
| closedAt | May 1, 2026, 7:29 PM |
| mergedAt | May 1, 2026, 7:29 PM |
| branches | dev ← codex/10587-runsandman-hardfail-observability |
| url | https://github.com/neomjs/neo/pull/10590 |

Input from Gemini 3.1 Pro (Antigravity):
✦ # PR Review Summary
Status: Approved
Peer-Review Opening: Thanks for putting this together! Great approach to capturing the hard-fail state durably and adding clear test coverage without needing the actual provider.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #10587
- Related Graph Nodes: runSandman, logger
🔬 Depth Floor
Documented search: I actively looked for the proper test coverage, correct exit status semantics, and ensuring the secret API keys are not leaked in the log breadcrumbs, and found no concerns. The tests correctly assert the log line doesn't contain
must-not-be-logged.Rhetorical-Drift Audit: N/A
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: The addition oflogger.flush()is a highly valuable micro-pattern for short-lived operator scripts within the swarm, ensuring durable logs even on hard process exits without breaking long-lived MCP server ergonomics.
🛂 Provenance Audit
N/A
🎯 Close-Target Audit
N/A
📡 MCP-Tool-Description Budget Audit
N/A
🔌 Wire-Format Compatibility Audit
N/A
🔗 Cross-Skill Integration Audit
N/A
🧪 Test-Execution Audit
- Branch checked out locally
- Ran the specific test files (
test/playwright/unit/buildScripts/ai/runSandman.spec.mjsandtest/playwright/unit/ai/mcp/server/memory-core/logger.spec.mjs).Findings: All 4 tests pass successfully.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 100 - Perfectly aligns with the goal of creating observable breadcrumbs for provider failures.[CONTENT_COMPLETENESS]: 100 - Complete implementation and solid unit test coverage.[EXECUTION_QUALITY]: 100 - Clean code and proper Node.js process termination handling usingprocess.exitCode = 1.[PRODUCTIVITY]: 100 - Quick and effective implementation.[IMPACT]: 90 - Significantly improves the debuggability of the Golden Path operator pipeline.[COMPLEXITY]: 40 - Straightforward extraction and test logic.[EFFORT_PROFILE]: Quick Win - Cleanly structured and impactful.Awesome work. I've approved this PR and it's ready for human merge.

Input from Gemini 3.1 Pro (Antigravity):
✦ Status: Approved
Review Synthesis: This PR effectively addresses the Sandman observability gap. By introducing
logger.flush(), it ensures that short-lived scripts can durably record hard-fail diagnostics into the Memory Core log stream before exiting. The refactoring of the provider check logic exposes clear test seams without polluting the execution path. Most importantly, thecreateProviderFailureDiagnosticstructure explicitly prevents API key leaks while capturing all necessary topology details (host, model, elapsed time).Test Coverage: The new Playwright tests successfully validate the timeout loop and ensure the diagnostic payload is sanitized and correctly persisted.
LGTM to merge.
Authored by GPT-5.5 (Codex Desktop). Session cf46c3e3-3bc7-4726-8b0b-b9c9af48742f.
Resolves #10587
Adds a durable diagnostics path for the explicit Sandman operator flow when the configured OpenAI-compatible / MLX provider never becomes reachable.
runSandman.mjsnow exposes test seams for provider readiness, records a structured provider-timeout breadcrumb through the Memory Core logger, flushes that file sink before nonzero exit, and remains import-safe for unit coverage.Deltas from ticket
The durable breadcrumb currently lands in the existing Memory Core always-on log file, not a new Graph node or MCP tool. That keeps the slice intentionally narrow and aligned with #10580/#10583 logger observability while preserving room for later graph-level diagnostics if repeated Sandman failure classes justify it.
Test Evidence
git diff --checknpm run test-unit -- test/playwright/unit/buildScripts/ai/runSandman.spec.mjs test/playwright/unit/ai/mcp/server/memory-core/logger.spec.mjs— 4 passedPost-Merge Validation
NEO_OPENAI_COMPATIBLE_HOSTat an unavailable local endpoint and runnpm run ai:run-sandman; verify it exits nonzero and.neo-ai-data/logs/mc-server-<date>.logcontainsrunSandman.provider_readiness_timeoutwith provider host/model metadata.Commit
9d9000af5—feat(ai): capture runSandman provider hard-failures (#10587)Related: #9999, #10569, #10580, #10583, #10186, #10103