opencode: remove oh-my-openagent from all profiles
Drops the plugin entry and the agent/* model aliases, sets plain default models, and removes the OMO roster swap from opencode.zsh.
This commit is contained in:
1 parent
3fb10dd4c3
commit
6b9b1697f2
5 files changed
+10
-536
No files matched your search
@@ -3,7 +3,7 @@
|
||||
## LLM / inference stack
|
||||
|
||||
Connor runs a self-hosted inference stack: LiteLLM proxy in front of a local GPU
|
||||
model (llama-swap), OpenAI, Anthropic, and Moonshot/Kimi, with OpenCode + OMO on
|
||||
model (llama-swap), OpenAI, Anthropic, and Moonshot/Kimi, with OpenCode on
|
||||
top. **Before touching anything under `~/config/litellm/`, `~/.config/opencode/`,
|
||||
or the model routing, read `~/guides/llm/robots.md`.** It carries the design
|
||||
decisions, the measured data, and — more importantly — the specific wrong
|
||||
@@ -79,13 +79,11 @@ The five things most likely to waste an hour if you don't know them:
|
||||
VRAM buys prefill, not decode. Don't recommend a bigger GPU without checking
|
||||
which wall you're actually against.
|
||||
|
||||
9. **The OMO agent aliases embed their model family on purpose** —
|
||||
`personal/atlas-kimi-k2.7-code`, not `personal/atlas`. OMO picks its
|
||||
per-model prompt by string-matching the *last path segment* of the model
|
||||
name, so a "tidy-up" rename silently disables every Kimi/GPT-specific prompt
|
||||
and guard with no error. **Never shorten them.** `local/librarian` and
|
||||
`local/explore` are deliberately left un-suffixed — `isGptModel` matches a
|
||||
bare `"gpt"` substring and `gpt-oss-20b` would trip it.
|
||||
9. **OMO (oh-my-openagent) was removed from every OpenCode profile on
|
||||
2026-10-29.** It injected its own skills and prompts into non-OMO agents
|
||||
and used a lot of context. The `agent/*` and `personal/atlas-*` style
|
||||
aliases in LiteLLM were for OMO's roster and are unused by OpenCode now;
|
||||
OMO rewrote them at request time, so they 400 if called directly.
|
||||
|
||||
Cost work: read `model_group`, never `model`, to attribute a request. Cost is
|
||||
driven by cache-read volume and context size far more than by model choice.
|
||||
|
||||
@@ -230,160 +230,6 @@
|
||||
"cache_write": 0.0
|
||||
}
|
||||
},
|
||||
"agent/librarian-glm-5.3-flash": {
|
||||
"name": "librarian -> glm-5.3-flash",
|
||||
"limit": {
|
||||
"context": 128000,
|
||||
"output": 8192
|
||||
},
|
||||
"cost": {
|
||||
"input": 0.0,
|
||||
"output": 0.0,
|
||||
"cache_read": 0.0,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "personal/librarian-glm-5.3-flash"
|
||||
},
|
||||
"agent/explore-gpt-5.6-luna": {
|
||||
"name": "explore -> local/explore",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 0.0,
|
||||
"output": 32000.0,
|
||||
"cache_read": 0.0,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "personal/explore-gpt-5.6-luna"
|
||||
},
|
||||
"agent/sisyphus-glm-5.3": {
|
||||
"name": "sisyphus -> glm-5.3",
|
||||
"limit": {
|
||||
"context": 200000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 0.0,
|
||||
"output": 0.0,
|
||||
"cache_read": 0.0,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "personal/sisyphus-glm-5.3"
|
||||
},
|
||||
"agent/atlas-glm-5.3": {
|
||||
"name": "atlas -> glm-5.3",
|
||||
"limit": {
|
||||
"context": 200000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 0.0,
|
||||
"output": 0.0,
|
||||
"cache_read": 0.0,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "personal/atlas-glm-5.3"
|
||||
},
|
||||
"agent/prometheus-glm-5.3": {
|
||||
"name": "prometheus -> glm-5.3",
|
||||
"limit": {
|
||||
"context": 200000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 0.0,
|
||||
"output": 0.0,
|
||||
"cache_read": 0.0,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "personal/prometheus-glm-5.3"
|
||||
},
|
||||
"agent/metis-glm-5.3": {
|
||||
"name": "metis -> glm-5.3",
|
||||
"limit": {
|
||||
"context": 200000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 0.0,
|
||||
"output": 0.0,
|
||||
"cache_read": 0.0,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "personal/metis-glm-5.3"
|
||||
},
|
||||
"agent/sisyphus-junior-glm-5.3-flash": {
|
||||
"name": "sisyphus-junior -> glm-5.3-flash",
|
||||
"limit": {
|
||||
"context": 150000,
|
||||
"output": 32000
|
||||
},
|
||||
"cost": {
|
||||
"input": 0.0,
|
||||
"output": 0.0,
|
||||
"cache_read": 0.0,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "personal/sisyphus-junior-glm-5.3-flash"
|
||||
},
|
||||
"agent/momus-gpt-5.5": {
|
||||
"name": "momus -> gpt-5.5",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 2.5,
|
||||
"output": 64000.0,
|
||||
"cache_read": 0.25,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "personal/momus-gpt-5.5"
|
||||
},
|
||||
"agent/gpt-5.6-sol-hephaestus": {
|
||||
"name": "hephaestus -> gpt-5.6-sol",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 4.0,
|
||||
"output": 64000.0,
|
||||
"cache_read": 0.4,
|
||||
"cache_write": 5.0
|
||||
},
|
||||
"id": "personal/hephaestus-gpt-5.6-sol"
|
||||
},
|
||||
"agent/oracle-gpt-5.5": {
|
||||
"name": "oracle -> gpt-5.5",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 2.5,
|
||||
"output": 64000.0,
|
||||
"cache_read": 0.25,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "personal/oracle-gpt-5.5"
|
||||
},
|
||||
"agent/looker-gpt-5.5": {
|
||||
"name": "looker -> gpt-5.4 (vision)",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 2.5,
|
||||
"output": 64000.0,
|
||||
"cache_read": 0.25,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "personal/looker-gpt-5.5"
|
||||
},
|
||||
"muse-glimmer-30b-low": {
|
||||
"name": "Muse Glimmer 30B (local, low reasoning)",
|
||||
"limit": {
|
||||
@@ -442,11 +288,8 @@
|
||||
"enabled_providers": [
|
||||
"litellm"
|
||||
],
|
||||
"model": "litellm/agent/atlas-glm-5.3",
|
||||
"model": "litellm/qwen3.8-27b-gsq-s-med",
|
||||
"small_model": "litellm/local/librarian",
|
||||
"plugin": [
|
||||
"oh-my-openagent"
|
||||
],
|
||||
"agent": {
|
||||
"dev": {
|
||||
"model": "litellm/qwen3.8-27b-gsq-s-med"
|
||||
|
||||
@@ -191,160 +191,6 @@
|
||||
"cache_write": 0.0
|
||||
}
|
||||
},
|
||||
"agent/librarian-gpt-5.6-luna": {
|
||||
"name": "librarian -> local/librarian",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 0.0,
|
||||
"output": 32000.0,
|
||||
"cache_read": 0.0,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "work/librarian"
|
||||
},
|
||||
"agent/explore-gpt-5.6-luna": {
|
||||
"name": "explore -> local/explore",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 0.0,
|
||||
"output": 32000.0,
|
||||
"cache_read": 0.0,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "work/explore"
|
||||
},
|
||||
"agent/oracle-gpt-5.5": {
|
||||
"name": "oracle -> work/oracle",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 2.5,
|
||||
"output": 64000.0,
|
||||
"cache_read": 0.25,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "work/oracle"
|
||||
},
|
||||
"agent/looker-gpt-5.5": {
|
||||
"name": "looker -> work/looker",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 2.5,
|
||||
"output": 64000.0,
|
||||
"cache_read": 0.25,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "work/looker"
|
||||
},
|
||||
"agent/momus-gpt-5.5": {
|
||||
"name": "momus -> work/momus",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 2.5,
|
||||
"output": 64000.0,
|
||||
"cache_read": 0.25,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "work/momus"
|
||||
},
|
||||
"agent/sisyphus-junior-gpt-5.6-luna": {
|
||||
"name": "sisyphus-junior -> work/sisyphus-junior",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 2.5,
|
||||
"output": 32000.0,
|
||||
"cache_read": 0.25,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "work/sisyphus-junior"
|
||||
},
|
||||
"agent/gpt-5.6-sol-hephaestus": {
|
||||
"name": "hephaestus -> work/hephaestus",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 1.75,
|
||||
"output": 64000.0,
|
||||
"cache_read": 0.175,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "work/hephaestus"
|
||||
},
|
||||
"agent/atlas-gpt-5.5": {
|
||||
"name": "atlas -> work/atlas (gpt-5.4)",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 2.5,
|
||||
"output": 64000.0,
|
||||
"cache_read": 0.25,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "work/atlas"
|
||||
},
|
||||
"agent/prometheus-gpt-5.6-sol": {
|
||||
"name": "prometheus -> work/prometheus",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 4.0,
|
||||
"output": 64000.0,
|
||||
"cache_read": 0.4,
|
||||
"cache_write": 5.0
|
||||
},
|
||||
"id": "work/prometheus"
|
||||
},
|
||||
"agent/sisyphus-gpt-5.6-sol": {
|
||||
"name": "sisyphus -> work/sisyphus",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 4.0,
|
||||
"output": 64000.0,
|
||||
"cache_read": 0.4,
|
||||
"cache_write": 5.0
|
||||
},
|
||||
"id": "work/sisyphus"
|
||||
},
|
||||
"agent/metis-gpt-5.5": {
|
||||
"name": "metis -> work/metis",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 2.5,
|
||||
"output": 64000.0,
|
||||
"cache_read": 0.25,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "work/metis"
|
||||
},
|
||||
"chatgpt/gpt-5.6-terra-low": {
|
||||
"name": "GPT-5.6 Terra (reasoning_effort=low)",
|
||||
"limit": {
|
||||
@@ -364,11 +210,8 @@
|
||||
"enabled_providers": [
|
||||
"litellm"
|
||||
],
|
||||
"model": "litellm/agent/atlas-gpt-5.5",
|
||||
"model": "litellm/chatgpt/gpt-5.6-terra-low",
|
||||
"small_model": "litellm/local/librarian",
|
||||
"plugin": [
|
||||
"oh-my-openagent"
|
||||
],
|
||||
"permission": {
|
||||
"read": {
|
||||
"*": "ask",
|
||||
|
||||
+1
-158
@@ -204,160 +204,6 @@
|
||||
"cache_write": 0.0
|
||||
}
|
||||
},
|
||||
"agent/librarian-gpt-5.6-luna": {
|
||||
"name": "librarian -> local/librarian",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 0.0,
|
||||
"output": 32000.0,
|
||||
"cache_read": 0.0,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "work/librarian"
|
||||
},
|
||||
"agent/explore-gpt-5.6-luna": {
|
||||
"name": "explore -> local/explore",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 0.0,
|
||||
"output": 32000.0,
|
||||
"cache_read": 0.0,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "work/explore"
|
||||
},
|
||||
"agent/oracle-gpt-5.5": {
|
||||
"name": "oracle -> work/oracle",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 2.5,
|
||||
"output": 64000.0,
|
||||
"cache_read": 0.25,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "work/oracle"
|
||||
},
|
||||
"agent/looker-gpt-5.5": {
|
||||
"name": "looker -> work/looker",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 2.5,
|
||||
"output": 64000.0,
|
||||
"cache_read": 0.25,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "work/looker"
|
||||
},
|
||||
"agent/momus-gpt-5.5": {
|
||||
"name": "momus -> work/momus",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 2.5,
|
||||
"output": 64000.0,
|
||||
"cache_read": 0.25,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "work/momus"
|
||||
},
|
||||
"agent/sisyphus-junior-gpt-5.6-luna": {
|
||||
"name": "sisyphus-junior -> work/sisyphus-junior",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 2.5,
|
||||
"output": 32000.0,
|
||||
"cache_read": 0.25,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "work/sisyphus-junior"
|
||||
},
|
||||
"agent/gpt-5.6-sol-hephaestus": {
|
||||
"name": "hephaestus -> work/hephaestus",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 1.75,
|
||||
"output": 64000.0,
|
||||
"cache_read": 0.175,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "work/hephaestus"
|
||||
},
|
||||
"agent/atlas-gpt-5.5": {
|
||||
"name": "atlas -> work/atlas (gpt-5.4)",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 2.5,
|
||||
"output": 64000.0,
|
||||
"cache_read": 0.25,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "work/atlas"
|
||||
},
|
||||
"agent/prometheus-gpt-5.6-sol": {
|
||||
"name": "prometheus -> work/prometheus",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 4.0,
|
||||
"output": 64000.0,
|
||||
"cache_read": 0.4,
|
||||
"cache_write": 5.0
|
||||
},
|
||||
"id": "work/prometheus"
|
||||
},
|
||||
"agent/sisyphus-gpt-5.6-sol": {
|
||||
"name": "sisyphus -> work/sisyphus",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 4.0,
|
||||
"output": 64000.0,
|
||||
"cache_read": 0.4,
|
||||
"cache_write": 5.0
|
||||
},
|
||||
"id": "work/sisyphus"
|
||||
},
|
||||
"agent/metis-gpt-5.5": {
|
||||
"name": "metis -> work/metis",
|
||||
"limit": {
|
||||
"context": 272000,
|
||||
"output": 128000
|
||||
},
|
||||
"cost": {
|
||||
"input": 2.5,
|
||||
"output": 64000.0,
|
||||
"cache_read": 0.25,
|
||||
"cache_write": 0.0
|
||||
},
|
||||
"id": "work/metis"
|
||||
},
|
||||
"chatgpt/gpt-5.6-terra-low": {
|
||||
"name": "GPT-5.6 Terra (reasoning_effort=low)",
|
||||
"limit": {
|
||||
@@ -377,11 +223,8 @@
|
||||
"enabled_providers": [
|
||||
"litellm"
|
||||
],
|
||||
"model": "litellm/agent/atlas-gpt-5.5",
|
||||
"model": "litellm/chatgpt/gpt-5.6-terra-low",
|
||||
"small_model": "litellm/local/librarian",
|
||||
"plugin": [
|
||||
"oh-my-openagent"
|
||||
],
|
||||
"permission": {
|
||||
"read": {
|
||||
"*": "ask",
|
||||
|
||||
+1
-54
@@ -70,55 +70,6 @@ _oc_launch() {
|
||||
return 1
|
||||
fi
|
||||
|
||||
# ---- install the profile's OMO roster --------------------------------
|
||||
# WHY THIS EXISTS. OMO reads exactly ONE config, resolveHomeDir($HOME) +
|
||||
# "/.omo/omo.jsonc". There is no path override: `profiles`/OMO_PROFILE are in
|
||||
# the new schema but the OLD loader rejects them, and a config the loaders
|
||||
# reject fails SILENTLY (agent model bindings just stop applying). Setting
|
||||
# HOME per profile would relocate opencode's own data and cache dirs too.
|
||||
#
|
||||
# It matters because OMO picks its per-model prompt by string-matching the
|
||||
# LAST PATH SEGMENT of the model name, so the alias has to name the model
|
||||
# family (see guides/llm/robots.md 5.1). Personal runs Kimi on the thinking
|
||||
# and worker roles; work may not (PRC exclusion). One shared alias name
|
||||
# therefore cannot be correct for both -- work was left running Kimi prompts
|
||||
# on GPT models, 6 of 11 agents mismatched.
|
||||
#
|
||||
# The opencode-side fix does NOT work and was tested before this was written:
|
||||
# OMO builds protectedBuiltinAgentNames from its own agent keys and runs
|
||||
# filterProtectedAgentOverrides over opencode's `agent` config, so an
|
||||
# `agent.sisyphus.model` in a profile config is silently DROPPED.
|
||||
#
|
||||
# So the roster is swapped here instead. Only omo.jsonc is touched;
|
||||
# codegraph/, lsp-daemon/ and runtime/ under ~/.omo stay shared.
|
||||
#
|
||||
# RACE: two sessions in different profiles started within the same instant
|
||||
# could read the other's roster. The window is startup-only (OMO reads the
|
||||
# file once), and the failure is BOUNDED AND LOUD -- the LiteLLM virtual key,
|
||||
# not this file, is the policy boundary, so a work session that ends up with
|
||||
# the personal roster gets a 403 on the Kimi models rather than using them.
|
||||
local roster
|
||||
case "$profile" in
|
||||
personal) roster=personal ;;
|
||||
work|work-strict) roster=work ;;
|
||||
local) roster= ;; # local.json loads no OMO plugin
|
||||
esac
|
||||
if [[ -n "$roster" ]]; then
|
||||
local src="$HOME/.omo/profiles/${roster}.jsonc"
|
||||
if [[ ! -r "$src" ]]; then
|
||||
print -u2 "oc: OMO roster '$src' is missing."
|
||||
print -u2 " Refusing to launch -- the wrong roster silently mis-prompts every agent."
|
||||
return 1
|
||||
fi
|
||||
# Atomic: never leave a half-written omo.jsonc if this is interrupted.
|
||||
if ! { cp -- "$src" "$HOME/.omo/.omo.jsonc.$$" &&
|
||||
mv -f -- "$HOME/.omo/.omo.jsonc.$$" "$HOME/.omo/omo.jsonc" }; then
|
||||
rm -f -- "$HOME/.omo/.omo.jsonc.$$"
|
||||
print -u2 "oc: could not install the $roster OMO roster."
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Make the active mode obvious: banner, terminal title, and a prompt marker
|
||||
# that survives for the rest of the shell if the profile is exported.
|
||||
local colour
|
||||
@@ -166,11 +117,7 @@ _oc_launch() {
|
||||
# have received." This is a preference, not a fix -- REMOVE THESE TWO KEYS to
|
||||
# get Plan Mode back.
|
||||
#
|
||||
# Note this is NOT an OMO feature, though it looks like one. OMO's agents
|
||||
# carry only description/model/tools and cannot trigger on prompt text; the
|
||||
# `plan` agent is native to opencode. Disabling OMO would not have stopped it,
|
||||
# and would have broken the default model -- `agent/atlas-glm-5.3` is rewritten
|
||||
# by the OMO plugin at request time and 400s at LiteLLM without it.
|
||||
# The `plan` agent is native to opencode, not part of a plugin.
|
||||
#
|
||||
# Personal is still wrapped under the bare name so `opencode` does the
|
||||
# expected thing and gets a key.
|
||||
|
||||
Reference in new issue
Block a user