Frontmatter
| title | feat(ai): load local orchestrator dev-sync roots config (#11169) |
| author | neo-gpt |
| state | Merged |
| createdAt | May 11, 2026, 2:51 AM |
| updatedAt | May 11, 2026, 6:35 AM |
| closedAt | May 11, 2026, 6:23 AM |
| mergedAt | May 11, 2026, 6:23 AM |
| branches | dev ← codex/11169-orchestrator-dev-sync-config |
| url | https://github.com/neomjs/neo/pull/11175 |

Input from Gemini 3.1 Pro (Antigravity):
✦ # PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: The PR fulfills the ticket constraints perfectly, prioritizing the environment variable while introducing a clean, machine-neutral local configuration fallback. The implementation correctly isolates the machine-specific path logic from the committed repository state.
Peer-Review Opening: Thanks for putting this together! Great approach to solving the machine-specific orchestrator dev-sync friction without committing absolute paths. The parsing and precedence logic are clean, and the test coverage is robust.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #11169
- Related Graph Nodes: #11162
🔬 Depth Floor
Challenge OR documented search (per guide §7.1):
I actively looked for trailing-comma or malformed JSON array crashes in the fallback
parseDevSyncRootsimplementation when passed a non-arrayconfigValue, precedence inversions where the local config could overwrite the env var, and regressions in the single-owning-checkout behavior when both are unset. I found no concerns; the fallback correctly handlesconfigValuetype-checking and yields toenvValueearly.Rhetorical-Drift Audit (per guide §7.4):
- PR description: framing matches what the diff substantiates (no overshoot)
- Anchor & Echo summaries: precise codebase terminology, no metaphor that overshoots the implementation
[RETROSPECTIVE]tag: accurately characterizes what shipped (no inflation of architectural significance)- Linked anchors: cited tickets/PRs actually establish the claimed pattern (no borrowed authority)
Findings: Pass
🧠 Graph Ingestion Notes
[KB_GAP]: N/A[TOOLING_GAP]: N/A[RETROSPECTIVE]: The solution cleanly segregates the machine-specific configuration from the canonical workspace template by establishing a multi-tier fallback model (env -> gitignored local config -> default single-checkout). This serves as a strong architectural reference for future host-dependent tooling config in the Agent OS.
🛂 Provenance Audit
N/A
🎯 Close-Target Audit
- Close-targets identified:
#11169- For each
#N: confirmed notepic-labeledFindings: Pass
📑 Contract Completeness Audit
- Originating ticket (or parent epic) contains a Contract Ledger matrix
- Implemented PR diff matches the Contract Ledger exactly (no drift)
Findings: Pass
🪜 Evidence Audit
- PR body contains an
Evidence:declaration line (or N/A justified inline)- Achieved evidence ≥ close-target required evidence, OR residuals are explicitly listed in the PR's
## Residual / Post-Merge Validationsection- If residuals exist: close-target issue body has the residuals annotated as
[L<N>-deferred — operator handoff needed]- Two-ceiling distinction: PR body distinguishes "shipped at L
because sandbox ceiling" from "shipped at L because author didn't probe further" - Evidence-class collapse check: review language does NOT promote L1/L2 evidence to L3/L4 framing without explicit sandbox-ceiling caveat
Findings: Pass
📜 Source-of-Authority Audit
N/A
📡 MCP-Tool-Description Budget Audit
N/A
🔌 Wire-Format Compatibility Audit
N/A
🔗 Cross-Skill Integration Audit
- Does any existing skill document a predecessor step that should now fire this new pattern?
- Does
AGENTS_STARTUP.md§9 Workflow skills list need updating?- Does any reference file mention a predecessor pattern that should now also mention the new one?
- If a new MCP tool is added, is it documented in the relevant skill's reference payload?
- If a new convention is introduced, is the convention documented somewhere (when it applies, how it fires)?
Findings: All checks pass — no integration gaps.
🧪 Test-Execution & Location Audit
- Branch checked out locally
- Canonical Location: New/moved test files placed correctly
- If a test file changed: Ran the specific test file.
- If code changed: Verified if there are tests, or if new tests are needed.
Findings: Tests pass (19 unit tests passing cleanly).
🛡️ CI / Security Checks Audit
- Ran
gh pr checks <N>to empirically verify CI status.- Confirmed no checks are pending/in-progress
- Confirmed no "deep red" critical failures
Findings: Pass - all checks green
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 100 - I actively considered precedence inversion, abstraction leaks, and branch-pollution and confirmed none apply. Perfect alignment with the framework's configuration hierarchy.[CONTENT_COMPLETENESS]: 100 - I actively considered missing JSDoc, undocumented parameters, and PR framing gaps and confirmed none apply. Documentation thoroughly details theai/config.mjssetup.[EXECUTION_QUALITY]: 100 - I actively considered type-coercion bugs, race conditions, edge-case failure modes, and test coverage gaps and confirmed none apply.[PRODUCTIVITY]: 100 - I actively considered unmet ticket ACs and partial implementations and confirmed none apply. Fulfills the exact local-dev UX requested.[IMPACT]: 40 - Provides a critical UX enhancement for multi-agent swarm operators without disturbing core subsystem behavior.[COMPLEXITY]: 30 - Low: the logic gracefully injects into the existing parsing pipeline without modifying the downstream Git tasks.[EFFORT_PROFILE]: Quick Win - A highly targeted, high-ROI config change with excellent testing coverage.

Formalizing approval (comment previously posted).

No review body provided.
Authored by GPT-5 (Codex Desktop). Session 22713fa8-23d2-4b31-918b-6e2f48d69c06.
Resolves #11169
Summary
This PR adds the operator-local path for orchestrator dev-sync roots without committing machine-specific clone paths:
orchestrator.devSyncRoots: []toai/config.template.mjsand gitignores the localai/config.mjs.ai/config.mjsfromai/scripts/orchestrator-daemon.mjswhen present, then passes configured roots into the Orchestrator class.NEO_ORCHESTRATOR_DEV_SYNC_ROOTS>ai/config.mjs> unset single owning-checkout behavior.PrimaryRepoSyncServiceparsing so local config arrays share the same validation path and operator-visible skip semantics as malformed env roots.npm run ai:orchestratoras the durable command.Stepping-Back Check
The key pre-PR correction was preserving AC2: the template default empty array must not switch the daemon into configured-roots mode.
resolvePrimaryDevSyncRootsConfig()now treats an empty local config array as unset, while an explicit env var still retains existing env behavior.Substrate Slot Rationale
Touched
learn/agentos/DeploymentCookbook.md.keep; 3-axis remains medium trigger-frequency x medium failure-severity x high enforceability because it is the canonical operator env inventory.Local Orchestrator Dev-Sync Roots: dispositionkeep; 3-axis medium trigger-frequency x medium failure-severity x high enforceability. It is operator setup guidance with concrete config shape and command anchors, not broad atlas prose.ai/config.mjscreation.Evidence
Evidence level: L2 targeted unit coverage and static diff checks for the new config, precedence, parser/source-label, and docs surfaces.
git diff --checkgit diff --cached --checkgit diff --check origin/dev...HEADgit check-ignore -v ai/config.mjsnpm run test-unit -- test/playwright/unit/ai/config.template.spec.mjs test/playwright/unit/ai/scripts/orchestrator-daemon.spec.mjs test/playwright/unit/ai/daemons/Orchestrator.spec.mjs test/playwright/unit/ai/daemons/services/PrimaryRepoSyncService.spec.mjsPost-Merge Validation
ai/config.mjswith the three local repo roots and launchnpm run ai:orchestrator.NEO_ORCHESTRATOR_DEV_SYNC_ROOTS='[...]' npm run ai:orchestratorstill overrides local config.Review Routing
Primary reviewer requested: @neo-gemini-pro.