Skip to content

fix(mcp): keep startup diagnostics out of JSON-RPC stdout - #130

Merged
ifuri-validator-agent[bot] merged 1 commit into
mainfrom
ticket-094--mcp-stdout
Sep 6, 2026
Merged

fix(mcp): keep startup diagnostics out of JSON-RPC stdout#130
ifuri-validator-agent[bot] merged 1 commit into
mainfrom
ticket-094--mcp-stdout

Conversation

@tom-sapletta-com

Copy link
Copy Markdown
Contributor

Ticket: ticket-094
Correlation ID: koru-ticket-094-mcp-stdout

Starting the real MCP server emitted a human-readable activity banner on stdout, causing a JSON-RPC parse error in the client. The MCP entry point now selects the existing stderr activity format explicitly. Tool schemas and protocol responses remain unchanged.

Validation: real subprocess regression fails before the fix and passes after it; 14 focused MCP and quality tests pass (16 deselected by repository configuration), along with Ruff, managed governance and Docker Compose.

@ifuri-validator-agent ifuri-validator-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deterministic Validator approval for exact head 3d49b3cfff2e547d4b35ea2444104b3385024406.

Ticket: ticket-094
Correlation ID: koru-pr-130-ticket-094
Model: zai/glm-5.3
Reviewed diff chunks: 1
Advisory LLM verdict: APPROVE
Advisory summary: Reviewed all 1 diff chunk(s). Single-line fix routes the MCP startup activity diagnostic to the stderr format option so stdout remains pure JSON-RPC. A real-subprocess regression test parses every stdout line as JSON-RPC and asserts the banner lands on stderr. Scope matches intent. allowed paths; no interface, dependency, or workflow changes.
Advisory findings: none
The LLM output above is advisory and was not used as the approval trust root.

Actual PR impact radar

Exact range: 262b28fc7adf54f286d145e1e548ae3a60b27001...3d49b3cfff2e547d4b35ea2444104b3385024406
Change digest: 46c866dd2d2f951c01a50707ce0d4f065776143b2f4b83f388af95416b3bca82
Score: 52/100 (L), estimated 63 min, split recommended: true
Affected services/components: repository-wide/unclassified

Machine-readable radar JSONL and SVG
{"actual_change":{"additions":120,"base_sha":"262b28fc7adf54f286d145e1e548ae3a60b27001","binary_files":0,"categories":{"code":2,"configuration":1,"docs":4,"tests":1},"change_digest":"46c866dd2d2f951c01a50707ce0d4f065776143b2f4b83f388af95416b3bca82","comparison":"262b28fc7adf54f286d145e1e548ae3a60b27001...3d49b3cfff2e547d4b35ea2444104b3385024406","deletions":1,"file_count":8,"files":["project/ticket-094/README.md","project/ticket-094/ai-codex-logs.txt","project/ticket-094/ai-codex.md","project/ticket-094/changelog.md","project/ticket-094/intent.json","project/ticket-094/preprompt.md","src/koruapi/mcp.py","tests/test_mcp_stdio_startup.py"],"head_sha":"3d49b3cfff2e547d4b35ea2444104b3385024406","service_count":0,"services":[]},"assessment_mode":"observed-pr","axes":{"coupling":3,"delivery":2,"scope":3,"uncertainty":3,"validation":2},"complexity":"L","confidence":0.9,"diagnostics":["RADAR-ACCEPTANCE-MISSING","RADAR-BUDGET-EXCEEDED"],"estimate":{"budget_minutes":30,"minutes":63,"within_budget":false},"impact":{"components":["project","src/koruapi","tests"],"files":["project/ticket-094/README.md","project/ticket-094/ai-codex-logs.txt","project/ticket-094/ai-codex.md","project/ticket-094/changelog.md","project/ticket-094/intent.json","project/ticket-094/preprompt.md","src/koruapi/mcp.py","tests/test_mcp_stdio_startup.py"],"public_interfaces":["src/koruapi/mcp.py"],"runtime_dependencies":0},"schema":"subactor.ticket-radar/v1","score":52,"split":{"parts":[{"estimated_minutes":20,"name":"Define contract and acceptance boundary","scope":["src/koruapi/mcp.py"]},{"estimated_minutes":11,"name":"Implement project","scope":["project"]},{"estimated_minutes":11,"name":"Implement src/koruapi","scope":["src/koruapi"]},{"estimated_minutes":11,"name":"Implement tests","scope":["tests"]},{"estimated_minutes":15,"name":"Validate and project to trackers","scope":["tests","planfile","github/gitlab/jira projections"]}],"reason":"estimated_minutes_exceed_budget","recommended":true},"standards":[{"id":"wellmanifest/dsl","revision":"6c60fc4e0dd1f1bb74f46a7745e28019908d1203","version":"0.1.0-dev"},{"id":"wellmanifest/ticket-lifecycle","revision":"5bf581907a87b46a13a73e6c033d3abe4d9a306f","version":"0.1.0-dev"},{"id":"wellmanifest/git-lifecycle","revision":"7d77d4b7af57e69bc75c3a0290b3a4805c5c4438","version":"0.2.0-dev"},{"id":"wellmanifest/logs","revision":"48c284ef7a069055c0bcb6b900147ce5e65f8b43","version":"0.3.0"}],"ticket_ref":"ticket-094"}
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128" role="img"><title>ticket-094: fix(mcp): keep startup diagnostics out of JSON-RPC stdout</title><rect width="128" height="128" rx="12" fill="#f8fafc"/><g stroke-width="1"><polygon points="64,55 72,61 69,71 59,71 56,61" fill="none" stroke="#d7dde5"/><polygon points="64,47 80,59 74,78 54,78 48,59" fill="none" stroke="#d7dde5"/><polygon points="64,38 89,56 79,85 49,85 39,56" fill="none" stroke="#d7dde5"/><polygon points="64,30 97,53 84,92 44,92 31,53" fill="none" stroke="#d7dde5"/><polygon points="64,21 105,51 89,99 39,99 23,51" fill="none" stroke="#d7dde5"/><line x1="64" y1="64" x2="64" y2="21" stroke="#aab4c0"/><line x1="64" y1="64" x2="105" y2="51" stroke="#aab4c0"/><line x1="64" y1="64" x2="89" y2="99" stroke="#aab4c0"/><line x1="64" y1="64" x2="39" y2="99" stroke="#aab4c0"/><line x1="64" y1="64" x2="23" y2="51" stroke="#aab4c0"/></g><polygon points="64,38 89,56 79,85 54,78 48,59" fill="#fb923c" fill-opacity="0.45" stroke="#c2410c" stroke-width="2"/><circle cx="64" cy="64" r="3" fill="#c2410c"/><g font-family="sans-serif" font-size="7" fill="#334155"><text x="64" y="11" text-anchor="middle">SCO</text><text x="114" y="48" text-anchor="middle">COU</text><text x="95" y="107" text-anchor="middle">UNC</text><text x="33" y="107" text-anchor="middle">VAL</text><text x="14" y="48" text-anchor="middle">DEL</text></g><text x="64" y="124" text-anchor="middle" font-family="sans-serif" font-size="8" fill="#0f172a">L · 63m</text></svg>
Merge will be attempted after this approval when explicitly authorized. ## Decision record (recomputable)
DECISION D-094-9745
TICKET ticket-094
HEAD_SHA 3d49b3cfff2e547d4b35ea2444104b3385024406
CORRELATION_ID koru-pr-130-ticket-094
ACTOR agent:ifuri-validator-agent[bot]
APPLIED_RULE P-CORE-015
INPUT author_login = "tom-sapletta-com"
INPUT observed_checks = ["governance / enforce=PASS","governance / remote lifecycle=PASS","standard packs / conformance=PASS","onedev/local-verify=PASS"]
INPUT required_checks = ["onedev/local-verify","standard packs / conformance"]
INPUT required_checks_source = "protected registry + GitHub applied rules (env/request)"
INPUT reviewer_login = "ifuri-validator-agent[bot]"
INPUT superseded_checks = ["smoke"]
INPUT ticket_radar_receipt = {"schema":"subactor.ticket-radar/v1","base_sha":"262b28fc7adf54f286d145e1e548ae3a60b27001","head_sha":"3d49b3cfff2e547d4b35ea2444104b3385024406","change_digest":"46c866dd2d2f951c01a50707ce0d4f065776143b2f4b83f388af95416b3bca82","score":52,"complexity":"L","estimated_minutes":63,"split_recommended":true,"services":[],"authority":"ADVISORY","promotion":"FORBIDDEN"}
VERDICT APPROVE AUTHORITY DETERMINISTIC
REJECTED REQUEST_CHANGES BECAUSE NO_UNSAFE_CHANGE_REASON_FOUND
ADVISORY llm_verdict = "APPROVE" MODEL "zai/glm-5.3"
ASSERT VERDICT_AUTHORITY != "ADVISORY"

@ifuri-validator-agent
ifuri-validator-agent Bot merged commit ab9dba9 into main Sep 6, 2026
5 checks passed
@ifuri-validator-agent
ifuri-validator-agent Bot deleted the ticket-094--mcp-stdout branch September 6, 2026 16:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant