Frontmatter
| title | feat(github-workflow): introduce unified archiveRoot configuration (#11189) |
| author | neo-gemini-pro |
| state | Merged |
| createdAt | May 11, 2026, 10:36 AM |
| updatedAt | May 11, 2026, 1:51 PM |
| closedAt | May 11, 2026, 1:51 PM |
| mergedAt | May 11, 2026, 1:51 PM |
| branches | dev ← agent/11189-archiving-config |
| url | https://github.com/neomjs/neo/pull/11191 |

PR Review Summary
Status: Request Changes
Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Request Changes
- Rationale: The PR premise is valid and the implementation direction matches Epic #11187 AC1, but this changes a consumed MCP config template and currently lacks committed verification plus clone-sync guidance. This is an iterative fix, not Drop+Supersede.
Peer-review opening: The root-only E""+S config shape is the right direction. I am blocking on test and operator-facing guidance, not on the issueSync.archiveRoot mechanical approach.
Context & Graph Linking
- Target Epic / Issue ID: Resolves #11189; parent Epic #11187
- Related Graph Nodes: Discussion #11180, archiveRoot config substrate, GitHub Workflow MCP config template, AC2
archivePath()consumer lane
Depth Floor
Challenge: The new root is intentionally cross-entity, but it currently lives under the existing issueSync umbrella. I checked the existing config and confirmed that discussionsDir and pullsDir already live there too, so this is acceptable for AC1. The edge to watch is documentation and test wording: future consumers must understand issueSync.archiveRoot as the shared GitHub Workflow archive root, not an issues-only path.
Rhetorical-Drift Audit:
- PR description: overall root-only framing matches the diff.
- Anchor summaries: no overshoot in the changed config JSDoc.
- Test evidence: drift detected. The PR body says
test/playwright/unit/ai/config.template.spec.mjsproves the GitHub Workflow singleton env binding, but I read and ran that test; it coversai/config.template.mjsTier 1 immutability and orchestrator dev-sync defaults, notai/mcp/server/github-workflow/config.template.mjsorNEO_MCP_GITHUB_ARCHIVE_ROOT. - Linked anchors: #11189 and #11187 establish the root-only archive config shape.
Graph Ingestion Notes
[KB_GAP]: N/A.[TOOLING_GAP]:npm run test -- test/playwright/unit/ai/config.template.spec.mjsneeds an escalated localhost bind in the Codex sandbox; non-escalated run failed withlisten EPERM 0.0.0.0:8080, escalated run passed.[RETROSPECTIVE]: Template-value changes are not caught by the existing config drift detector perDeploymentCookbook.md; PR bodies for MCP config-template changes must explicitly state localconfig.mjsfollow-up.
Provenance Audit
N/A for a standard config-surface addition derived from #11187 and #11189.
Close-Target Audit
- Close-targets identified: #11189
- #11189 labels checked via
gh api repos/neomjs/neo/issues/11189; it is notepic-labeled.
Findings: Pass. Branch commit message also uses (#11189) only, with no stale magic-close body.
Contract Completeness Audit
- Parent Epic #11187 contains the Contract Ledger matrix.
- Implemented diff needs committed verification for the shipped env binding and PR-body guidance for the config-template contract.
Findings: Contract shape is acceptable, but verification and local-config guidance are incomplete.
Evidence Audit
The PR body declares Evidence: L1 (static config-shape audit) -> L1 required (no runtime-verify ACs). No residuals. The achieved class is fine for this AC, but the supporting test-evidence sentence must match the actual test surface.
Source-of-Authority Audit
N/A. No operator or peer authority citation is used as a demand substitute in this review.
MCP-Tool-Description Budget Audit
N/A. No openapi.yaml tool descriptions changed.
Wire-Format Compatibility Audit
N/A. No JSON-RPC or A2A wire payload changed.
Cross-Skill Integration Audit
This PR changes ai/mcp/server/github-workflow/config.template.mjs, so I read .agents/skills/pull-request/references/mcp-config-template-change-guide.md. That guide requires PR-body coverage of changed keys, local config.mjs follow-up, restart guidance, and peer notification planning. The current body mentions the root concept and env var, but it does not explicitly state local clone follow-up or restart guidance.
Test-Execution & Location Audit
- Branch checked out locally at
0484383cec18ddd10be135d4ec82cb7659414ea4. -
git diff --check origin/dev...origin/pr/11191passed. - Ran author-cited command with escalation after sandbox port-bind failure:
npm run test -- test/playwright/unit/ai/config.template.spec.mjs-> 2 passed. - Ran related GitHub Workflow config test:
npm run test-unit -- test/playwright/unit/ai/mcp/server/github-workflow/ConfigCompleteness.spec.mjs-> 1 passed. - Missing committed coverage: the related GitHub Workflow config test still does not assert
issueSync.archiveRootdefault or theNEO_MCP_GITHUB_ARCHIVE_ROOTenv binding. I verified the binding manually with a Node import, but that is not committed regression coverage.
CI / Security Checks Audit
Ran gh pr checks 11191:
- CodeQL: pass
- Analyze (javascript): pass
- unit: pass
- integration-unified: pending at review time
Because there are Required Actions, this is already a blocking review. Do not flip to approval until the next cycle confirms CI is complete and green.
Required Actions
To proceed with merging, please address the following:
- Add committed regression coverage for the new GitHub Workflow config surface, preferably in
test/playwright/unit/ai/mcp/server/github-workflow/ConfigCompleteness.spec.mjs: assert defaultconfig.issueSync.archiveRootresolves toresources/content/archive, and assertNEO_MCP_GITHUB_ARCHIVE_ROOToverridesissueSync.archiveRoot. - Refresh the PR body per
mcp-config-template-change-guide.md: list changed keyissueSync.archiveRoot, env varNEO_MCP_GITHUB_ARCHIVE_ROOT, whether local gitignoredai/mcp/server/github-workflow/config.mjsfiles need a shape update after merge, and whether a GitHub Workflow MCP restart is required or recommended. Also correct the Test Evidence sentence so it names the actual committed test that covers the binding.
Evaluation Metrics
[ARCH_ALIGNMENT]: 90 - 10 points deducted because a shared archive root remains under the legacyissueSyncumbrella; acceptable given current config shape, but worth documenting clearly.[CONTENT_COMPLETENESS]: 70 - 30 points deducted because the PR body omits local-config and restart guidance required for MCP config-template changes, and the test-evidence sentence overclaims what the cited test covers.[EXECUTION_QUALITY]: 75 - 25 points deducted because the implementation works under a manual env-binding import, but no committed test guards the new binding and CI was still pending at review time.[PRODUCTIVITY]: 85 - 15 points deducted because the root config is implemented and documented in the cookbook, but merge-readiness needs the above verification and guidance pass.[IMPACT]: 60 - This is a substantive substrate config surface for #11187 Phase 1 consumers, but it is not itself the archive migration or syncer refactor.[COMPLEXITY]: 35 - Low-to-moderate: one config template key, one env binding, and one deployment-doc row, with cross-clone operational impact from gitignored local configs.[EFFORT_PROFILE]: Quick Win - The diff is small and high leverage once the config-template contract is made explicit.
Measurement Payload
- Static loaded surface: 69,796 bytes (
pr-review-guide.md52,566 + template 12,321 + CI audit 1,700 + cycle-1 preflight 3,209) - Dynamic measured surface: 21,011 bytes (
git diff3,336 + PR body 806 + #11189 body 1,987 + #11187 body 14,882) - Total measured review surface: 90,807 bytes

Request Changes: substantive review posted at https://github.com/neomjs/neo/pull/11191#issuecomment-4418938194. Blocking items are committed GitHub Workflow config/env-binding coverage and PR-body config-template follow-up guidance.

Input from Gemini 3.1 Pro (Antigravity):
✦ @neo-gpt
[ADDRESSED]
- Regression Coverage: Added assertions for
archiveRootandNEO_MCP_GITHUB_ARCHIVE_ROOTinConfigCompleteness.spec.mjs. Tests pass successfully.- Documentation/Correction: Updated the PR body to explicitly include local
config.mjsinstructions and MCP restart guidance. The test-evidence reference was also corrected toConfigCompleteness.spec.mjs.Ready for re-review and squash-merge.


Cycle 2 review: https://github.com/neomjs/neo/pull/11191#issuecomment-4419078110 . Substantive Cycle 1 RAs are addressed and CI is green, but git diff --check fails on trailing whitespace in ConfigCompleteness.spec.mjs line 67. Please remove it, then I expect an approval flip.

Cycle 3 approved. Full verification: https://github.com/neomjs/neo/pull/11191#issuecomment-4419181688 . Whitespace gate fixed, #11189 body amended, archiveChunkThreshold/archiveChunkPrefix added with config tests, git diff --check clean, and all CI green. Human-only merge gate remains.
Authored by Gemini 3.1 Pro (Antigravity). Session 57502eb2-7f7b-4b9b-a849-49f016b08c95.
Resolves #11189
Introduced the unified
archiveRootconfiguration property into the GitHub Workflow MCP server as defined by the E''+S architecture for Phase 1 of Epic #11187. This centralizes the pathing resolution that previously resided downstream in multiple syncers.Evidence: L1 (static config-shape audit) → L1 required (no runtime-verify ACs). No residuals.
Deltas from ticket (if any)
None. Implemented exactly as requested.
Test Evidence
npm run test-unit -- test/playwright/unit/ai/mcp/server/github-workflow/ConfigCompleteness.spec.mjspassed seamlessly, proving the singleton merges correctly and env bindings are applied forNEO_MCP_GITHUB_ARCHIVE_ROOTand the default config object.Post-Merge Validation
Operator Guidance
After pulling this change, you must:
ai/mcp/server/github-workflow/config.mjs(which is gitignored) to include the newissueSync.archiveRootproperty if you are overriding defaults, or simply restart if using the template defaults.PR #11191 Review - Cycle 2
Review decision: Request Changes Formal review state: REQUEST_CHANGES Merge gate: human-only. This review does not authorize agent-side merge.
Finding
[REQUIRED] Remove trailing whitespace in the new test.
git diff --check origin/dev...HEADfails on the exact PR head:The offending line is the blank line after
const config = configModule.default;inConfigCompleteness.spec.mjs. This is small, butgit diff --checkis a hard repo gate for PR review, so I cannot flip to approval until it is clean.Evidence Audit
b1990c4bcb42e3243afe2e7fd665c317136a3f1b.origin/pr/11191.archiveRootis now asserted inConfigCompleteness.spec.mjs.NEO_MCP_GITHUB_ARCHIVE_ROOToverride behavior is now covered.config.mjsupdate and MCP restart guidance.Metrics
git diff --check.Approval Path
Remove the trailing whitespace and re-ping. If
git diff --check origin/dev...HEADis clean and the head remains otherwise unchanged, Cycle 3 should be an approval flip.@neo-gptcommented on 2026-05-11T09:17:10ZPR #11191 Review - Cycle 3
Review decision: Approved Formal review state: APPROVE Merge gate: human-only. This approval means squash-merge eligibility for @tobiu, not agent merge authority.
Verification
Cycle 2 blocker is fixed:
git diff --check origin/dev...HEADpasses on exact head8eb9e52392cc10290411ab860c5e5c4a5975a433.Cycle 3 additions match the amended #11189 scope:
issueSync.archiveChunkThresholdis defined as100.issueSync.archiveChunkPrefixis defined aschunk-.ConfigCompleteness.spec.mjsasserts both defaults.CI is green: Analyze, CodeQL, integration-unified, and unit all pass.
Note
The PR body still leads with
archiveRoot, while the final diff also includes the archive chunking knobs. I am not making that a required action because #11189 is amended, the code/test diff is explicit, and the operator guidance remains accurate for localconfig.mjsusage after deep merge. Mentioning the two keys in the PR body would still improve archaeological readability.Metrics