Context
Split from #16056, whose first half — recording the failure cause and keeping it alive through backoff — ships in PR #16070. These two remaining criteria are a different surface and were holding that PR in draft; carrying them here so the delivered half can be reviewed and merged.
Both were verified live against a cloud deployment while diagnosing a wedged tenant-repo lane.
The Problem
1. The orchestrator is excluded from the bridge it publishes.
bridgeDiagnostics.runtimeAccess.allowedServices
= ["chroma", "kb-server", "mc-server", "local-model"]
readOperations = ["inspect", "logs", "stats"]
Log access exists for four services. The tenant-repo-sync lane runs in the orchestrator, so the one component holding the failure text is the one component whose logs the bridge cannot read. Diagnosis from a remote MCP client was not difficult, it was impossible — which defeats the purpose of the bridge.
This is largely a shipped default, not an architectural decision. ai/deploy/docker-compose.yml:229 sets that list. It reached the live deployment because we put it there.
The reason it is not purely a one-line change is the asymmetry it needs: the orchestrator must become readable without becoming restartable. NEO_ORCHESTRATOR_RUNTIME_ACCESS_LIFECYCLE_OPERATIONS=restart (line 231) is declared globally rather than per service, so simply appending orchestrator to the allowlist would also hand the bridge the ability to restart the component that publishes it. That wants a read/lifecycle split before the allowlist changes.
2. get_ingestion_progress cannot say "never attempted".
Live, on a deployment where four repos had failed four times each:
status: "idle" phase: "idle" totalSources: 0 errorCount: 0
startedAt: null lastRunSummary: null
errorCount: 0 beside all-null timestamps reads as healthy. It means "no ingestion has ever been observed here", which is a different fact and a much louder one.
A caution for whoever takes this, discovered while diagnosing: the pull path ingests in the orchestrator process, while this tool reports from the kb-server. The two hold separate state. So the surface may be structurally unable to report pull-path runs at all, whatever their outcome — in which case the honest fix is larger than a status enum, and possibly belongs at the deployment-state bridge instead. Establish which before implementing.
Acceptance Criteria
Out of Scope
- Recording the failure cause and surviving backoff suppression — #16056, delivered in PR #16070.
- The tenant-repo failure itself; this is about being able to see it.
Avoided Traps
- Appending
orchestrator to the allowlist and calling it done. That grants restart as well, because lifecycle operations are declared globally. The asymmetry is the requirement.
- Adding a status enum to
get_ingestion_progress before checking it can see the runs. A more honest label on a surface that never observes the process in question is a nicer-looking wrong answer.
Related
- #16056 — parent; the recording half, PR #16070
ai/deploy/docker-compose.yml:229 / :231 — the shipped allowlist and the global lifecycle declaration
- #15977 · #16002 — sibling observability/delivery gaps in the same lane
Live latest-open sweep: checked latest 12 open issues at 2026-07-27T23:32:25Z; no equivalent found — #16056 is the parent this is split from, recorded in both directions.
Origin Session ID: c038696f-94a6-4788-82bf-747c5672908c
Retrieval Hint: query_raw_memories("orchestrator excluded from allowedServices bridge self-observation ingestion progress never attempted")
Context
Split from #16056, whose first half — recording the failure cause and keeping it alive through backoff — ships in PR #16070. These two remaining criteria are a different surface and were holding that PR in draft; carrying them here so the delivered half can be reviewed and merged.
Both were verified live against a cloud deployment while diagnosing a wedged tenant-repo lane.
The Problem
1. The orchestrator is excluded from the bridge it publishes.
Log access exists for four services. The tenant-repo-sync lane runs in the orchestrator, so the one component holding the failure text is the one component whose logs the bridge cannot read. Diagnosis from a remote MCP client was not difficult, it was impossible — which defeats the purpose of the bridge.
This is largely a shipped default, not an architectural decision.
ai/deploy/docker-compose.yml:229sets that list. It reached the live deployment because we put it there.The reason it is not purely a one-line change is the asymmetry it needs: the orchestrator must become readable without becoming restartable.
NEO_ORCHESTRATOR_RUNTIME_ACCESS_LIFECYCLE_OPERATIONS=restart(line 231) is declared globally rather than per service, so simply appendingorchestratorto the allowlist would also hand the bridge the ability to restart the component that publishes it. That wants a read/lifecycle split before the allowlist changes.2.
get_ingestion_progresscannot say "never attempted".Live, on a deployment where four repos had failed four times each:
errorCount: 0beside all-null timestamps reads as healthy. It means "no ingestion has ever been observed here", which is a different fact and a much louder one.A caution for whoever takes this, discovered while diagnosing: the pull path ingests in the orchestrator process, while this tool reports from the kb-server. The two hold separate state. So the surface may be structurally unable to report pull-path runs at all, whatever their outcome — in which case the honest fix is larger than a status enum, and possibly belongs at the deployment-state bridge instead. Establish which before implementing.
Acceptance Criteria
lifecycleOperationstargets — asserted both ways: readable, and not restartable.get_ingestion_progressreports "never attempted" distinctly from "failed before ingestion began", soerrorCount: 0can no longer read as healthy.Out of Scope
Avoided Traps
orchestratorto the allowlist and calling it done. That grants restart as well, because lifecycle operations are declared globally. The asymmetry is the requirement.get_ingestion_progressbefore checking it can see the runs. A more honest label on a surface that never observes the process in question is a nicer-looking wrong answer.Related
ai/deploy/docker-compose.yml:229/:231— the shipped allowlist and the global lifecycle declarationLive latest-open sweep: checked latest 12 open issues at 2026-07-27T23:32:25Z; no equivalent found — #16056 is the parent this is split from, recorded in both directions.
Origin Session ID: c038696f-94a6-4788-82bf-747c5672908c
Retrieval Hint:
query_raw_memories("orchestrator excluded from allowedServices bridge self-observation ingestion progress never attempted")