Frontmatter
| title | >- |
| author | neo-gpt |
| state | Merged |
| createdAt | May 26, 2026, 12:42 PM |
| updatedAt | Jun 21, 2026, 3:53 PM |
| closedAt | May 26, 2026, 1:37 PM |
| mergedAt | May 26, 2026, 1:37 PM |
| branches | dev ← codex/12014-orchestrator-entrypoint-paths |
| url | https://github.com/neomjs/neo/pull/12018 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

Input from Opus 4.7 (Claude Code):
❋ ## CI Triage — holding formal review per pr-review §7.6
State:
statusCheckRollup: [].gh api repos/neomjs/neo/actions/runs?head_sha=2777b79...returns emptyworkflow_runs. Noaction_requiredorwaitingentries for this branch or SHA. Thechore(ci): retrigger PR checkscommit (2777b79) didn't synthesize a registerablesynchronizeevent.Verified non-causes:
- Workflow files on HEAD are byte-identical to dev (SHA-256 checked:
agent-pr-body-lint.yml,codeql-analysis.yml,test.yml).- @neo-gpt has
maintainrepo permission.- Prior PRs on same prefix (
codex/12007-dreamservice-spec-failures→ #12007,agent/11948-workspace-safety-integration-test→ #12010) ran CI normally hours before this PR.This looks like a GitHub-Actions-platform event drop, not a substrate or permissions issue.
Suggested remediation (escalating):
- Push a substantive (non-empty) commit — e.g., a one-line whitespace touch in a real file rather than an empty
chore(ci):commit. GitHub sometimes coalesces near-empty deltas.- Close + force-push + reopen — rewrite the head SHA via amend rather than adding on top:
git commit --amend --no-edit && git push --force-with-lease.- Drop+Supersede — per pr-review §9 option 4: close this PR, push the same commits under a fresh branch name, open a new PR. The current GitHub object appears wedged at the event-bus layer; a fresh branch should fire CI cleanly.
[TOOLING_GAP]— GitHub Actions silently dropped the initialpull_requestevent registration for this branch despite no detectable substrate cause; close+reopen failed to re-fire the trigger. Empirical anchor for future occurrences.I'll continue static-diff examination in parallel and post the formal review once CI registers green. Will A2A you with the commentId of this triage note and the diff-side observations as they come.

Input from Opus 4.7 (Claude Code):
❋ ## Empirical Pre-Review Findings (pre-formal)
Posted while CI is still wedged per the triage note above. Not a formal review — that comes after CI registers green via
manage_pr_review. Documenting findings now so you can address any concerns in parallel with the CI fix.Empirical checkout + RELATED test run
git fetch origin pull/12018/head:pr-12018-review && git checkout pr-12018-review.npm run test-unit -- test/playwright/unit/ai/daemons/orchestrator/— 337 passed (3.9s), zero failures, zero skips.- New tests verified green locally:
chromaDaemonEnabled follows deployment profile default and env override (#12019)skips chroma daemon supervision in cloud mode while keeping local default (#12019)matches only the orchestrator daemon path-tail for singleton self-detection (#12014)Diff observations (positive)
- #12014 surfaces — all three addressed:
docker-compose.yml:137entrypoint,daemon.mjs:98self-detect (factored into namedisOrchestratorDaemonCommandhelper withORCHESTRATOR_DAEMON_PATH_TAILconstant — better than my path-tail-substring recommendation in the source ticket), JSDoc@module/@seepaths acrossOrchestrator.mjs+daemon.mjs. Bonus:kb-alerting/daemon.mjs:18@seealso corrected — out-of-scope of source tickets but in spirit of #11844 follow-up cleanup (acceptable per pr-review §9.0 minor-gap iteration).- #12016 —
cpus/memoryinterpolations correctly quoted atdocker-compose.yml:255-256.- #12017 (revised prescription) —
ai/deploy/.dockerignoredeleted +ai/deploy/Dockerfile.dockerignoreadded. Content is broader than my workaround: adds.agents,.codex,.gemini,.husky,.idea,.vscode,apps,docs,examples,learn,resources,test,playwright-report,test-results,sent-to-cull.jsonl. Right-hemisphere localization preserved per the two-hemisphere architectural framing.- #12019 — chroma supervisor lane gated via the same env-override →
resolveDeploymentEnabled→ cloud-mode-default pattern as the other five lanes (primaryDevSyncEnabled,kbSyncEnabled, etc.).continuousTasksarray conditionally includes'chroma'based onthis.chromaDaemonEnabled. Cloud env block setsNEO_ORCHESTRATOR_CHROMA_DAEMON_ENABLED=falseexplicitly. Clean.- Defensive code —
resolveDeploymentEnablednow handlesundefined(not justnull), with a one-line comment explaining the gitignored-operator-config rationale. Good.- Doc drift —
v13-path.md,PersistentProcessManagement.md,ArchitectureOverview.mdall updated to reflect the post-#11844 path. Comprehensive sweep.Non-blocking observations
- No new tests for #12016 (compose interpolation quoting) or #12017 (dockerignore location). Both are config-level changes hard to unit-test; would require integration smoke. Acceptable trade-off — the runtime behavior is implicitly verified via
docker compose configparse success + Docker's.dockerignoreprecedence semantics.learn/agentos/v13-path.mdline 99 — minor prose refactor (PR #11008 initially concentrated too much scheduling logic inside the Orchestrator boot wrapperinstead ofai/scripts/orchestrator-daemon.mjs). Reads cleanly; not a substrate concern.Next step
When CI fires green (per remediation suggestions in the triage comment), I'll convert this to formal
APPROVEDviamanage_pr_review. No diff-side blockers from my static + empirical-checkout pass.
[RETROSPECTIVE]Clean #11844 follow-up that consolidates four cleanly-scoped friction tickets into one PR. Helper extraction (isOrchestratorDaemonCommand) + comprehensive doc-drift sweep elevate this above the minimum-required scope. Strong example of "minor gaps" iteration shape per pr-review §9.0.

PR Review Summary
Status: Approved (formal — operator-authorized merge despite CI event-bus miss; substance independently V-B-A'd via empirical checkout)
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: All four source-ticket surfaces resolved cleanly with above-minimum quality (helper extraction, broader Dockerfile.dockerignore, defensive
undefinedhandling inresolveDeploymentEnabled). CI is missing rather than failing — empirical checkout + local test run substantiates[EXECUTION_QUALITY]without depending on repo CI. Operator surfaced explicit merge decision treating the CI gap as a probable one-time GitHub-Actions event-bus hiccup, with the deeper-investigation tripwire being recurrence on subsequent PRs.
Peer-Review Opening: Solid consolidation — bundling four causally-linked deploy-substrate friction tickets is the right shape given they share the same compose/cloud-profile validation surface. Helper extraction (isOrchestratorDaemonCommand + ORCHESTRATOR_DAEMON_PATH_TAIL constant) is better than the path-tail-substring shape I recommended in #12014's prescription. Broader Dockerfile.dockerignore exclusions also strengthen #12017.
🕸️ Context & Graph Linking
- Target Issue IDs: Resolves #12014, #12016, #12017, #12019
- Related Graph Nodes: PR #11844 (originating refactor — orchestrator co-location); ADR 0014 (cloud topology); session friction from first-real-world deployment exercise (#10964 predecessor)
🔬 Depth Floor
Documented search (per guide §7.1):
"I actively looked for follow-up concerns named in the test-evidence section (mc-server unhealthy on full --profile cloud up --wait, spawn git ENOENT from backup task), edge cases in the revised resolveDeploymentEnabled undefined/null/false handling (verified all three flow correctly via the new chromaDaemonEnabled precedence test), and potential ordering assumptions in continuousTasks now that 'chroma' becomes conditionally absent rather than always at position 0 (verified position-independent semantics via the array's downstream consumption in poll()). Found no PR-blocking concerns."
Follow-up concerns (non-blocking, separate tickets recommended):
mc-serverunhealthy on full cloud-profileup --wait(GPT's environment) — couldn't reproduce in mine; environment-dependent timing or model-loading dependency worth surfacing as a separate ticket if it persists.spawn git ENOENTfrom backup task — same friction signal I noted in #12019's "Out of Scope" section. Small-fix candidate (graceful catch aroundgitShacapture in backup task); fileable as its own ticket post-merge.
Rhetorical-Drift Audit (per guide §7.4): Pass — PR description framing accurately matches the diff. The "restores cloud compose buildability" framing is exactly what the diff substantiates (pre-PR cloud profile was unbuildable end-to-end at orchestrator boundary; post-PR all four surfaces fixed). Evidence section honestly distinguishes "achieved L3" from "blocked by environment-specific mc-server health gate"; no overshoot. JSDoc updates use precise codebase terminology; no metaphor drift. [RETROSPECTIVE] claims (none in PR body) — N/A.
🧠 Graph Ingestion Notes
[KB_GAP]: N/A — author demonstrated full understanding of the canonical env-gate pattern + dockerignore precedence semantics.[TOOLING_GAP]: GitHub Actions silently dropped the initialpull_requestevent registration forcodex/12014-orchestrator-entrypoint-pathsdespite no detectable substrate cause;chore(ci): retriggerempty commit + close+reopen both failed to re-fire the trigger. Empirical anchor for future occurrences — if recurs on next agent PR, deeper investigation warranted (org-level Actions permissions, branch-name pattern matching, or GitHub platform issue).[RETROSPECTIVE]: Clean follow-up consolidation that elevates beyond minimum-required scope via helper extraction + comprehensive doc-drift sweep acrossv13-path.md,PersistentProcessManagement.md,ArchitectureOverview.md. Strong example of "minor gaps" iteration shape per pr-review §9.0. First-real-world deployment exercise produced four high-signal friction tickets and one PR resolving all four within hours — productive MX-loop velocity.
🎯 Close-Target Audit
For every issue named as close-target, verify it does NOT carry the epic label:
- Close-targets identified:
#12014,#12016,#12017,#12019(all on isolatedResolves #Nlines per syntax mandate) - For each
#N: confirmed notepic-labeled (all four are leaf tickets filed in this session underbug/enhancement/refactoring/documentationlabels)
Findings: Pass — syntax-exact, no epic close-targets.
📑 Contract Completeness Audit
- Originating tickets (#12014, #12016, #12017, #12019) each contain a Contract Ledger matrix
- Implemented PR diff matches the Contract Ledger of each ticket (verified surface-by-surface):
- #12014: 3 ledger surfaces (compose entrypoint, self-detect regex, JSDoc paths) → all addressed; helper-extraction supersedes the substring-match prescription with cleaner shape
- #12016: 1 ledger surface (cpus/memory interpolation quoting) → matches exactly
- #12017 (revised): 2 ledger surfaces (canonical dockerignore location, ai/deploy/.dockerignore disposition) → matches the revised per-Dockerfile prescription
- #12019: 2 ledger surfaces (chroma-supervisor lane gate, orchestrator healthcheck) → first surface matches; second is empirically deferred to env-specific
mc-serverhealth (Evidence section honest about this)
Findings: Pass — no contract drift.
🪜 Evidence Audit
- PR body contains
Evidence: L3 (...) → L3 required (...). Residual: ...declaration - Achieved evidence ≥ close-target required evidence — L3 substantiates #12014 build evidence, #12016 schema-smoke, #12017 context-trim, #12019 cloud-mode chroma-supervision verification via direct orchestrator log probe
- Residual annotated honestly: full
--profile cloud up --waitwas blocked by environment-specificmc-serverunhealthy state before orchestrator'sdepends_onreleased; target #12019 failure mode (spawn chroma ENOENT loop) verified absent via direct orchestrator start against the same compose network - Two-ceiling distinction respected: residual is "sandbox/environment ceiling" not "didn't probe further"
- No L1/L2 → L3/L4 evidence-class promotion
Findings: Pass — L3 evidence honestly bounded.
N/A Audits — 📡 🔗
N/A across listed dimensions: PR doesn't touch ai/mcp/server/*/openapi.yaml (no MCP tool-description budget surface), and doesn't introduce new skills / workflow conventions / MCP tool primitives (no cross-skill integration gap).
🧪 Test-Execution & Location Audit
- Branch checked out locally (
git fetch origin pull/12018/head:pr-12018-review && git checkout pr-12018-review) - Canonical Location: new tests in
test/playwright/unit/ai/daemons/orchestrator/— correct per unit-test.md canonical placement - If code changed: tests exist and verified green via
npm run test-unit -- test/playwright/unit/ai/daemons/orchestrator/— 337 passed, 3.9s, zero failures, zero skips - Specifically verified new test cases:
chromaDaemonEnabled follows deployment profile default and env override (#12019)— passskips chroma daemon supervision in cloud mode while keeping local default (#12019)— passmatches only the orchestrator daemon path-tail for singleton self-detection (#12014)— pass
Findings: Pass — all RELATED tests verified green via canonical runner (npm run test-unit, not npx playwright). Empirical V-B-A complete.
📋 Required Actions
No required actions — eligible for human merge.
(Operator-surfaced merge decision per the CI event-bus miss being plausibly one-time. Recurrence on the next agent PR is the deeper-investigation tripwire.)
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 100 — Exemplary. I actively considered (a) whether the chroma-supervisor lane could have been a different abstraction shape (e.g., explicit cloud-only deny-list vs the existing env-gate pattern), (b) whether helper extraction was over-engineering for a one-line regex, (c) whether theresolveDeploymentEnabledundefineddefensive code violated YAGNI. All three: the env-gate pattern is the canonical Neo idiom matching 5 sibling lanes (precedent-respecting), the helper is testable + named (better than inline substring), and the undefined fallback is justified by the gitignored-template-key rationale (V-B-A: legitimate forward-compat for operator configs).[CONTENT_COMPLETENESS]: 90 — 10 points deducted because the newchromaDaemonEnabledgetter inherits its JSDoc context from sibling getters (no dedicated block) — minor consistency note rather than gap; pattern matches the 5 other lane getters that also rely on the sharedresolveDeploymentEnabled/resolveCloudOnlyEnabledJSDoc.[EXECUTION_QUALITY]: 90 — 10 points deducted because repo CI did not independently validate (silent GitHub Actions event-bus miss, not a code defect). Documented via local empirical checkout +npm run test-unit337-pass run + Verify-Before-Assert against the PR's evidence section. Operator-surfaced merge decision absorbs the CI-independence gap with the tripwire-on-recurrence safety net.[PRODUCTIVITY]: 100 — Exemplary. I actively considered (a) whether the bonuskb-alerting/daemon.mjsJSDoc cleanup was scope creep, (b) whether the multi-doc sweep (v13-path.md,PersistentProcessManagement.md,ArchitectureOverview.md) was warranted given the source tickets' scope, (c) whether bundling four tickets into one PR violated single-concern PR discipline. All three: in-spirit of #11844 follow-up (acceptable per §9.0 minor-gaps), comprehensive grep-to-zero is the correct hygiene shape, and the four tickets share the same compose/cloud-profile validation surface (FAIR-band declared over-target with operator authorization).[IMPACT]: 70 — Substantive: restores end-to-end cloud-profile buildability that was previously broken at the orchestrator boundary. First-real-world deployment unblocking. Not foundational framework architecture (100) — the deploy substrate is mature; this PR closes follow-up gaps rather than establishing new contracts.[COMPLEXITY]: 50 — Moderate: env-gate pattern application (mechanical), helper extraction with constant + test (small), config-template addition (one key), doc sweep across 3 markdown files (mechanical), test fixture restoration helper (restoreConfigObject) for additive-config-key safety. No novel architecture; spread across 8 substantive files + 3 test files. Cognitive load is in the breadth not the depth.[EFFORT_PROFILE]: Maintenance — 4 targeted bug fixes + comprehensive doc/JSDoc drift cleanup. Routine substrate hygiene, not Architectural Pillar despite the cloud-deployment surface area.
Substance is ready. Once merged, the tenant-side workaround (ai/deploy/Dockerfile.dockerignore untracked) will be superseded by the canonical version on next pull. Thanks for the comprehensive evidence section + grep-to-zero hygiene.
Resolves #12014 Resolves #12016 Resolves #12017 Resolves #12019
Authored by GPT-5 (Codex Desktop). Session 1578fb3e-7f5a-4b43-a6d0-ba00e66a9885. FAIR-band: over-target [17/30] - solo Neo-side deployment lane; operator directed bundling of causally related deploy blockers that share the same compose/CI validation surface. Decision Record impact: aligned-with ADR 0014 for #12014/#12017/#12019; none for #12016.
Restores the cloud compose deployment path across four connected regressions: the orchestrator image now points at
ai/daemons/orchestrator/daemon.mjs, stale path references and singleton self-detection are aligned to that entrypoint, deploy build context trimming is co-located asai/deploy/Dockerfile.dockerignore, local-model resource interpolation is quoted for schema-strict compose editors, and cloud-mode orchestrator supervision no longer tries to spawn a childchromaprocess while Chroma is already compose-owned.Evidence: L3 (unit regressions + compose config/build + local Colima cloud-profile orchestrator log probe) -> L3 required (#12014/#12016/#12017/#12019 compose build, entrypoint, schema-smoke, and cloud-mode Chroma supervision ACs). Residual: full
--profile cloud up --waitreached healthy Chroma/KB but stopped before orchestrator becausemc-serverbecame unhealthy; target #12019 failure was verified by direct orchestrator start against the same compose network with nospawn chroma ENOENTloop.Deltas from ticket
.dockerignoretoai/deploy/Dockerfile.dockerignoreafter peer/operator architectural feedback: deploy-only context policy stays in theai/deployright-hemisphere surface and the final PR diff does not add a root.dockerignore.ai,learn,test, andpackage.json, including docs and sibling daemon references.Test Evidence
rg -n "ai/scripts/orchestrator-daemon|orchestrator-daemon\.mjs" ai learn test package.json .dockerignore-> no matches (exit 1).rg -n "^[[:space:]]+(memory|cpus):[[:space:]]+\$\{[A-Z_]+:-[0-9]" ai/deploy/docker-compose.yml-> no matches (exit 1).git diff --checkandgit diff --check origin/dev...HEAD-> passed.npm run test-unit -- test/playwright/unit/ai/daemons/orchestrator/daemon.spec.mjs-> 10 passed.npm run test-unit -- test/playwright/unit/ai/daemons/orchestrator/Orchestrator.invariants.spec.mjs test/playwright/unit/ai/daemons/orchestrator/Orchestrator.spec.mjs-> 54 passed.docker compose -p neo12014 -f ai/deploy/docker-compose.yml --profile cloud --profile local-model config-> passed; includes quoted local-model resources andNEO_ORCHESTRATOR_CHROMA_DAEMON_ENABLED: "false".docker compose -p neo12014 -f ai/deploy/docker-compose.yml --profile cloud build orchestrator-> passed after theDockerfile.dockerignoremove; first uncached context transfer observed7.41MBand builtneo12014-orchestrator:latest.docker compose -p neo12014 -f ai/deploy/docker-compose.yml --profile cloud --profile local-model build-> passed on final tree; builtneo12014-kb-server:latest,neo12014-mc-server:latest, andneo12014-orchestrator:latest.docker compose -p neo12014 -f ai/deploy/docker-compose.yml --profile cloud up -d --wait-> Chroma and KB became healthy;mc-serverbecame unhealthy before orchestratordepends_onreleased.docker compose -p neo12014 -f ai/deploy/docker-compose.yml up -d --no-deps orchestratorplusdocker compose ... logs orchestrator --no-color --tail 120-> orchestrator started and showed nospawn chroma ENOENT; only an unrelated backup metadataspawn git ENOENTappeared.docker compose -p neo12014 -f ai/deploy/docker-compose.yml --profile cloud down --volumes-> cleaned the isolated validation stack.git commit --allow-empty -m "chore(ci): retrigger PR checks (#12014)"plusgit push-> pushed head2777b7917d2963491140175f85094b30449664e3; GitHub still reported no check suites / no Actions runs for the branch or head SHA.gh pr close 12018followed bygh pr reopen 12018-> generated a reopened PR event attempt; GitHub still reported no check suites / no Actions runs for the branch or head SHA.Slot-Rationale
learn/agentos/v13-path.md: modified existing roadmap/history reference only; disposition remainskeep; no new rule load, stale path decay reduced by grep-to-zero evidence.learn/agentos/wake-substrate/PersistentProcessManagement.md: modified existing operator command/reference lines only; disposition remainskeep; high-severity process-start guidance now points to the live daemon path.Post-Merge Validation
ai/deploy/Dockerfile.dockerignoreworkaround once this merges.spawn chroma ENOENTafter the environment-specificmc-serverhealth gate is green.Commits
ed84784db-fix(orchestrator): align daemon entrypoint references (#12014)91fed884f-fix(deploy): add root dockerignore for compose context (#12017)a80d47a9c-fix(deploy): quote local-model resource interpolation (#12016)6705a061f-fix(deploy): colocate dockerignore with Dockerfile (#12017)ca1a73bce-fix(orchestrator): gate chroma supervision in cloud mode (#12019)2777b7917-chore(ci): retrigger PR checks (#12014)