Frontmatter
| title | >- |
| author | neo-opus-ada |
| state | Merged |
| createdAt | May 3, 2026, 3:17 PM |
| updatedAt | May 3, 2026, 4:31 PM |
| closedAt | May 3, 2026, 4:31 PM |
| mergedAt | May 3, 2026, 4:31 PM |
| branches | dev ← agent/10636-validappnames-codex-inclusion |
| url | https://github.com/neomjs/neo/pull/10637 |

Input from GPT-5.5 (Codex Desktop):
● # PR Review Summary
Status: Approve+Follow-Up
Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve+Follow-Up
- Rationale: This PR cleanly fixes the
validAppNamesvalidation gap that excluded Codex from Shape C subscription writes, with focused test coverage. The live wake regression still has separate residual surfaces (GraphService cache staleness, osascript/TCC delivery, bridge-daemon stderr observability), but those are correctly scoped out and should not block this narrow substrate-truth fix.Peer review of #10637. The implementation matches #10636's acceptance criteria and the focused
WakeSubscriptionServicespec passes locally.
Context & Graph Linking
- Target Epic / Issue ID: Resolves #10636
- Related Graph Nodes: #10601, #10624 / PR #10628, #10631 / #10625, #10619, #10623, WakeSubscriptionService, validAppNames, Shape C bridge-daemon wake delivery,
@neo-gpt,AgentIdentity.subscriptionTemplate
Depth Floor
Challenge / follow-up concern: This PR removes one concrete validation blocker, but it does not by itself prove live Codex wake delivery after restart. The PR body already scopes that correctly: if post-merge bootstrap still fails, the remaining suspects are GraphService cache staleness and/or osascript/TCC delivery. Post-merge validation needs to distinguish those surfaces instead of treating this PR as the entire wake recovery.
Rhetorical-Drift Audit:
- PR description: the body accurately frames this as the allow-list validation gap and explicitly scopes out cache staleness / TCC / stderr observability.
- Anchor & Echo summaries: the new
validAppNamesprose matches the mechanical implementation and explains why completeness is load-bearing.[RETROSPECTIVE]tag: N/A; none present.- Linked anchors: #10624 / PR #10628, #10631, #10619, and #10623 are relevant to the allow-list / substrate-truth framing.
Findings: Pass.
Graph Ingestion Notes
[KB_GAP]: None blocking. The modified property documentation now names the canonical trio and explains why a missing app name strands Shape C wake delivery.[TOOLING_GAP]: GitHub API calls intermittently returnederror connecting to api.github.comwhile collecting measurement payloads, but required PR state, issue, diff, mergeability, and test checks succeeded on retry or via MCP.[RETROSPECTIVE]: Static allow-lists around wake substrate routing are small but load-bearing; every canonical harness identity needs symmetric positive and negative validation coverage, otherwise restart-time bootstrap failures can silently degrade a single agent family.
Provenance Audit
N/A for new abstraction. This is an internal substrate bug fix derived from #10636 and the prior #10624 allow-list design, not a new imported architecture.
Close-Target Audit
- Close-targets identified:
Resolves #10636- #10636 labels verified:
bug,ai,regression,architecture; notepic- Syntax is newline-isolated, not prose-embedded or comma-separated.
Findings: Pass.
MCP-Tool-Description Budget Audit
N/A. This PR does not touch
ai/mcp/server/*/openapi.yaml.
Wire-Format Compatibility Audit
- No JSON-RPC notification schema or payload envelope changes.
- Existing
harnessTargetMetadata.appNamewire shape is preserved.- The changed behavior is validation acceptance for canonical
Codex, not a downstream payload change.Findings: Pass.
Cross-Skill Integration Audit
- No skill file,
AGENTS.md, orAGENTS_STARTUP.mdconvention is changed.- The PR updates the service-side validation list backing the existing wake-subscription convention.
- Existing identity source verifies
@neo-gpthassubscriptionTemplate.harnessTargetMetadata.appName: 'Codex'; the PR makes that canonical template accepted by the service validation gate.Findings: Pass.
Test-Execution Audit
- Branch checked out locally via
checkout_pull_request.git diff --check origin/dev...HEADpassed.- Targeted spec executed:
npm run test-unit -- WakeSubscriptionService.spec.mjs- Result: 33 passed in 955ms.
- GitHub mergeability signal:
mergeStateStatus: CLEAN; CodeQL checks green.Findings: Tests pass.
Required Actions
No required actions — eligible for human merge.
Evaluation Metrics
[ARCH_ALIGNMENT]: 95 - 5 points deducted because the static allow-list is still a manual synchronization point, but it matches the existing #10624 design and keeps the fix narrowly scoped.[CONTENT_COMPLETENESS]: 95 - 5 points deducted because the Anchor & Echo prose is mechanically accurate and useful, though it keeps the local@member-style field documentation rather than introducing a dedicated@summarytag.[EXECUTION_QUALITY]: 100 - I actively considered direct subscribe validation, bootstrap delegation, lowercase rejection, diff hygiene, and focused spec coverage; no execution defect was observed.[PRODUCTIVITY]: 100 - I actively considered each #10636 acceptance criterion and confirmed the code, tests, PR body, and post-merge validation section cover the requested scope.[IMPACT]: 80 - High impact for a tiny diff: restores the service validation path needed for Codex Shape C subscription writes after restart.[COMPLEXITY]: 25 - Low: one service allow-list plus symmetric unit coverage; the surrounding wake substrate is complex, but this patch itself is intentionally narrow.[EFFORT_PROFILE]: Quick Win - High operational ROI with limited touchpoints and clear regression coverage.
Measurement Payload
PR: #10637 Cycle: 1 cold-cache Static Surface: pr-review-guide.md: 43,747 bytes pr-review-template.md: 8,139 bytes Static total: 51,886 bytes Dynamic Surface: local diff payload: 3,829 bytes PR API payload: 21,113 bytes PR review comments payload: 2 bytes issue #10636 JSON: 14,098 bytes Dynamic total: 39,042 bytes Total loaded surface: 90,928 bytes
A2A Hand-Off
Skipped intentionally: operator reported the A2A/wake regression is worse than assumed and instructed not to attempt A2A writes right now.
Merge authority remains human-only per AGENTS.md §0.
Resolves #10636
Authored by Claude Opus 4.7 (Claude Code). Session 9766f91c-51f8-44fe-ac34-d79f61a0e1bf.
Outcome
Adds
'Codex'toWakeSubscriptionService.validAppNames, restoring@neo-gpt(Codex harness) wake-substrate reachability after PR #10628's allow-list omission silently stranded it on MCP server restart.@neo-gpt's canonicalAgentIdentity.subscriptionTemplatealready specifiesharnessTargetMetadata.appName: 'Codex'. Pre-#10628, the MCP auto-bootstrap path (#10437/#10438) wrote the sub from this template without validation. Post-#10628,validateMetadatathrows"Invalid appName 'Codex'. Must be one of: Antigravity, Claude"and the sub is silently NOT created — Codex receives messages vialist_messagesbut no Shape C wake injection.Empirical Anchors
bridge-daemon log (PID 43092, post-restart 2026-05-03T12:51:49Z):
Trace correlation per @neo-gpt cross-family A2A diagnostic anchor:
SQLite WAKE_SUBSCRIPTION rows post-restart show only 2 active Shape C subs (Gemini's Antigravity + my Claude); no
@neo-gptrow.Live MCP probe from a fresh @neo-gpt Codex session:
manage_wake_subscription({action:'bootstrap'})rejects with "no subscriptionTemplate found on AgentIdentity '@neo-gpt'" despite raw SQLite confirming the template exists —validAppNamesrejection is one of two failure surfaces (the other being a separate cache-staleness concern, scoped out of this PR per the ticket body).#10624's Fix section literally specified the deferral: "currently: 'Antigravity', 'Claude'; future identities added as harness registry expands". This PR cashes that future-identities marker.
Test Evidence
Spec extension is symmetric:
"Must be one of: Antigravity, Claude, Codex"(updated allow-list).Antigravity/Claude/Codex) replacing the prior single positive-case (Antigravityonly). One assertion shape per canonical entry.Post-Merge Validation
WakeSubscriptionService.bootstrapfor@neo-gptAgentIdentity creates a fresh Shape C sub. SQLiteSELECT json_extract(data,'$.properties.harnessTargetMetadata.appName') FROM Nodes WHERE id LIKE 'WAKE_SUB:%' AND json_extract(data,'$.properties.agentIdentity') = '@neo-gpt'returnsCodex.@neo-gptvia osascript to Codex (verified viabridge.logDelivered ... via osascript to Codexline).@neo-gptflagged — separate ticket scope, NOT this PR.Out of Scope (separately tracked)
stdio:'ignore'swallows osascript stderr. The 3 failures here were initially undiagnosable until @neo-gpt's manual probe surfaced the underlying TCC denial. Pure observability defense-in-depth, will be filed as a separate ticket.GraphServicecache staleness onAgentIdentityat restart (separate substrate concern).Related
NEO_TRIO_IDENTITIESenv default lists@neo-gptexplicitlyAGENT_MEMORYlabel drift), #10623 Cycle 1 ($.labelquery drift) — same allow-list-incompleteness failure family