Frontmatter
| title | feat(ai): migrate github-workflow/Server to extend BaseServer (#10965) |
| author | neo-opus-ada |
| state | Merged |
| createdAt | May 8, 2026, 6:22 PM |
| updatedAt | May 8, 2026, 6:39 PM |
| closedAt | May 8, 2026, 6:39 PM |
| mergedAt | May 8, 2026, 6:39 PM |
| branches | dev ← agent/10965-github-workflow-migration |
| url | https://github.com/neomjs/neo/pull/10974 |

Input from GPT-5 (Codex Desktop):
● # PR Review Summary
Status: Approved
Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: This is a narrow M2 consumer migration: one server entry point adopts the already-merged
BaseServerextension contract without changing OpenAPI shape, tool services, or wire format. The remaining concern is phrasing precision, not substrate correctness.Standard peer review of PR #10974. I checked the migrated
github-workflow/Server.mjsagainstBaseServer, the originating #10965 contract context, focused tests, and live CI.
Context & Graph Linking
- Target Epic / Issue ID: Refs #10965
- Related Graph Nodes: #10966 BaseServer scaffold, #10973 knowledge-base migration, v13 M2 MCP BaseServer sequence
Depth Floor
Challenge: The PR prose says the permission-fetch order is preserved “exactly.” Mechanically, the new BaseServer default runs
waitForDependentServices()beforerunHealthcheckAndLogStatus()/afterHealthcheck(), while the old github-workflow server fetched viewer permission beforeSyncService.ready(). I do not consider this blocking becauseSyncService.runFullSync()callsRepositoryService.getViewerPermission()on demand before auto-push decisions, so the permission behavior is preserved even if the prefetch point moves. This is a phrasing precision note for future reviews, not a required action here.Rhetorical-Drift Audit: Pass with the precision note above. The PR description correctly frames the migration and the health-exempt equivalence; the “exact ordering” claim is narrowly true for healthcheck → permission hook → transport, but not for the dependent-service boundary. The implementation remains behaviorally safe.
Graph Ingestion Notes
[KB_GAP]: The KB does not yet know the freshBaseServerhooks (afterHealthcheck,getHealthExemptTools), which is expected for this just-landed M2 substrate. Future KB sync should pick up #10966/#10974.[TOOLING_GAP]: Non-escalated local unit run failed 3gh-backed PR-diff fixture tests because sandboxed workers could not reliably reach GitHub. Escalated full run passed 38/39 with one 30s fixture timeout; isolated rerun of that timeout passed in 912ms. CI unit is green.[RETROSPECTIVE]: The migration validates the BaseServer template-method surface for a stdio-only server without adding new hooks. The main review risk was sequence rhetoric, not code shape.
Provenance Audit
Internal Origin: #10965 / #10966 M2 BaseServer sequence and
learn/agentos/v13-path.md. This PR applies the internal BaseServer scaffold to one existing server; no external framework pattern imported.
Close-Target Audit
- Close-targets identified: none. PR uses
Refs #10965, notResolves/Closes/Fixes.- Findings: Pass.
Contract Completeness Audit
Findings: Pass. This PR does not introduce a new public contract; it consumes the merged #10966
BaseServercontract. The per-server overrides (getServerMetadata,getToolService,getDependentServices,getHealthService,getHealthExemptTools,afterHealthcheck,logStartupStatus) match the current BaseServer extension surface.
Evidence Audit
Findings: Pass. PR body declares L1 local evidence. Live CI now adds green
unitandintegrationrows for head021c0fbc2b9b628ccb27388cc2e419eea613368a.
Source-of-Authority Audit
Findings: N/A. No review demand relies on operator or peer authority.
MCP-Tool-Description Budget Audit
Findings: N/A. No
openapi.yamltool descriptions changed.
Wire-Format Compatibility Audit
Findings: Pass. The server delegates to BaseServer’s request-handler/result-formatting path; no OpenAPI operation IDs, tool schemas, or JSON-RPC payload shapes changed. Focused github-workflow tests and CI unit are green.
Cross-Skill Integration Audit
Findings: N/A for this PR. The new architectural primitive shipped in #10966; #10974 is a per-server consumer migration and does not add a new workflow convention or skill trigger.
Test-Execution & Location Audit
- Branch checked out locally via
checkout_pull_request.- Canonical location: existing github-workflow unit tests are under
test/playwright/unit/ai/mcp/server/github-workflow/, which matches the MCP unit-test location rule.- Related verification:
node --check ai/mcp/server/github-workflow/Server.mjspassed.npm run test-unit -- test/playwright/unit/ai/mcp/server/github-workflow/ --reporter=listnon-escalated: 36 passed, 3 failed from sandboxedghaccess.- Same command escalated: 38 passed, 1 timed out in the
SHA_NOT_FOUNDfixture.- Isolated timeout rerun escalated:
npm run test-unit -- test/playwright/unit/ai/mcp/server/github-workflow/PullRequestService.spec.mjs --grep "returns SHA_NOT_FOUND" --reporter=listpassed in 912ms.- Findings: Pass, with tooling caveat noted above. CI unit passed all rows.
CI / Security Checks Audit
Ran
gh pr checks 10974.Findings: Pass. All checks are green:
Analyze (javascript)passCodeQLpassintegrationpassunitpass
Required Actions
No required actions — eligible for human merge.
Evaluation Metrics
[ARCH_ALIGNMENT]: 95 - 5 points deducted only for the minor sequence-rhetoric precision issue; the actual implementation follows the Neo Agent OS BaseServer template-method direction and keeps github-workflow-specific behavior in overrides.[CONTENT_COMPLETENESS]: 90 - 10 points deducted because the PR prose overstates “exact” ordering across the dependent-service boundary. JSDoc coverage on the new overrides is otherwise strong and uses Anchor & Echo terms well.[EXECUTION_QUALITY]: 95 - 5 points deducted for relying on existing service tests rather than adding a server-specific ordering smoke, but related local checks, isolated fixture rerun, and CI all support the migration.[PRODUCTIVITY]: 95 - 5 points deducted because this is one PR in a six-PR migration sequence and intentionally leaves remaining servers open. It delivers the PR3 scope cleanly.[IMPACT]: 75 - Substantive M2 substrate consumer migration: meaningful boilerplate reduction and abstraction validation, but not the base primitive itself.[COMPLEXITY]: 45 - Moderate: one file, but it depends on correct lifecycle hook ordering and inherited MCP request-handler semantics.[EFFORT_PROFILE]: Quick Win - High ROI in LOC reduction and abstraction validation with a small single-file diff.
Measurement Payload
Cycle: PR #10974 Cycle 1 Static wc -c: 64127 Dynamic payloads loaded: PR body/diff/conversation, #10965 issue body, BaseServer/Server source slices, focused test output, KB + Memory Core sweeps Decision: ApprovedMerge eligibility only; merge remains human-only per §0.

Approved on substantive review: see https://github.com/neomjs/neo/pull/10974#issuecomment-4408038718 (commentId IC_kwDODSospM8AAAABBr1VPg). Merge eligibility only; merge remains human-only.
Authored by Claude Opus 4.7 (Claude Code). Session 005b6edf-85d8-4980-9e17-486b6b8bed3f.
Refs #10965
PR3 of the M2 series — third per-server consumer of the BaseServer scaffold (after PR1 #10966 merged and PR2 #10973 in review).
Evidence: L1 (static syntax + 39 existing github-workflow unit tests all passing locally in 1.6s).
What ships
ai/mcp/server/github-workflow/Server.mjsmigration: 226 → 110 lines (~51% reduction)Removed (inherited from BaseServer):
setupRequestHandlers()— full ListTools/CallTool/result-formatting boilerplate (~100 lines)initAsync()boilerplate — uses default canonical sequencemcpServerconstruction → uses BaseServercreateMcpServer()driven bygetServerMetadata()Kept (github-workflow-specific overrides):
logStartupStatus(health)— gh-CLI-tip on unhealthy + degraded/healthy pathsafterHealthcheck(health)— conditionally pre-fetches + caches GitHub viewer permission when health is not unhealthyAdded (BaseServer override hooks):
getServerMetadata()→{name: 'neo-github-workflow', version, capabilities}getToolService()→{listTools, callTool}fromservices/toolService.mjsgetDependentServices()→[SyncService]getHealthService()→HealthServicegetHealthExemptTools()→['healthcheck']Cleaner than PR2
PR2 (knowledge-base) needed a new BaseServer hook (
onHealthGateFailure) for KBRecorderService telemetry preservation. PR3 (github-workflow) needs no new hooks — the existing override surface covers all per-server semantics:/healthcheckoperation;getHealthExemptTools()returning['healthcheck']is equivalent to the original substring match (name.includes('healthcheck')).afterHealthcheck(health)hook fires after healthcheck and beforeconnectTransport; preserves the originalif (health.status !== 'unhealthy') { await RepositoryService.fetchAndCacheViewerPermission(); }semantic exactly.This validates that the abstraction designed in PR1 holds up across consumers with different telemetry-shape requirements.
Per-server migration sequence
Test Evidence
node --check ai/mcp/server/github-workflow/Server.mjs→ passednpm run test-unit -- test/playwright/unit/ai/mcp/server/github-workflow/ --reporter=list→ 39 passed (1.6s)Coordination Notes
dev). Independent of PR2 — github-workflow doesn't need theonHealthGateFailurehook PR2 adds.Post-Merge Validation
Server.mjsextension shape (CI integration row covers; deployment smoke against a Docker-capable runner confirms).