Files
dotfiles/skills/README.md
T
noconnorandClaude Opus 5 135112eee5 mcp-config/hermes: make the gateway's context limits actually reach the clients
Folds in the in-flight local-checkout work and fixes the context accounting
on top of it. Both halves are the same bug seen from two ends: clients were
sending requests larger than the backend's window and getting hard
ContextWindowExceededError 400s, intermittently, in a way that looked like
the model or the GPU misbehaving.

Already in flight here (unchanged in intent):
  - sync.sh prefers the LOCAL CHECKOUT over re-downloading from Gitea, and
    install.sh records the checkout path so it can be found. That recording
    is load-bearing: without it sync.sh cannot find the repo, silently falls
    back to Gitea, and every local edit to opencode.gateway.json is ignored.
    Observed on this box — ~/.config/mcp-sync/source did not exist, the
    default ~/.dotfiles is not where the checkout lives, and the Gitea base
    still served models:{}.
  - the hermes custom-provider wiring.

Fixed on top:

opencode had NO context limit on ANY gateway model, not a wrong one. Two
faults compounded. /model/info 403s for a day-to-day virtual key (only
management-scoped keys may read it), which sync.sh treats as best-effort and
falls back to names-only — as designed and as commented. But the merge then
did `prov["models"] = models`, replacing the map wholesale, so limits
declared in the base config were discarded too and there was no floor left.
Base specs are now a floor that live /model/info overrides field by field:
discovery still wins where present, so this adds no drift, and a 403 no
longer strips the limits. Verified: ornith 195584/32768, the qwens
261120/32768.

hermes' model map named `qwen3-vl-30b-a3b` at 262144 — a model the gateway
stopped serving when Ornith replaced it — while ornith-1.0-35b, the model
actually on cg-1 AND the only one with a window smaller than its neighbours
(196608), had no entry at all and inherited Hermes' default. The one model
needing a lower ceiling was the one not declaring one, which is exactly the
shape that fails only once a session grows.

NOTE for other boxes: hermes reads ~/.hermes/config.yaml, which install.sh
produces by MERGING gateway.yaml. Editing gateway.yaml alone changes nothing
until install.sh re-runs — this machine's live config was patched by hand.

Not addressed here, deliberately: the gateway-side context_window_fallback
(ai-k8s-iac). It is wired but inert while cg-2 is scaled down, so preventing
the oversized request client-side is what actually works today.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FoDK4wwB1Twty5gwiriYLf
2026-09-11 16:38:03 -04:00

2.2 KiB
Raw Blame History

skills — shared opencode skills

Skills every covert-gpt user gets. mcp-config/sync.sh deploys this directory to ~/.config/mcp-sync/skills on each box; the shared opencode.gateway.json points opencode at it via skills.paths.

Unlike models and MCP servers — which are discovered from the LiteLLM gateway at sync time — skills are plain files with nothing on the gateway to query, so this repo is the source of truth. They are copied from the local checkout (the same source as the gateway config — see "Where the config comes from" in mcp-config/README.md), so no anonymous read of this repo is required. Add a skill here, push to main, and it lands everywhere within the sync TTL (~1h, or immediately on a new shell) once the checkout picks the commit up.

LiteLLM's /v1/skills is not an alternative: it is a passthrough to Anthropic's Skills API (?beta=true), which lists skills on an Anthropic account. It does not serve skill files to a client, and opencode cannot read it. /public/skill_hub is a marketplace catalog, also not a skill source.

Layout

One folder per skill, each with a SKILL.md:

skills/
  my-skill/
    SKILL.md          # required
    reference.md      # optional supporting files

SKILL.md needs YAML frontmatter with name and description. name must be 1–64 chars, lowercase alphanumeric with single-hyphen separators, and match the folder name. description is 1–1024 chars and is what the model reads to decide whether to pull the skill in — write it to say when to use this, not just what it is.

---
name: my-skill
description: Use when doing X. Covers Y and Z.
---

Body: the instructions the model follows once the skill is loaded.

Don't put per-user things here

Same rule as the MCP gateway: this tree is identical for every user. Skills that depend on one person's credentials, kubeconfig, or local paths belong in that user's own ~/.config/opencode/skills/, which sync never touches.

Verifying

opencode debug skill        # lists every skill opencode can see, with its path

If a skill you added here is missing, check that the sync ran (ls ~/.config/mcp-sync/skills) and that the folder name matches the frontmatter name.