You are executing the `/gsd-check-profile` command. Validate gsd-opencode profile configuration across both `opencode.json` and `.planning/oc_config.json`, then report results.
This is a **read-only diagnostic**. Do NOT modify any files or attempt to fix issues. When problems are found, recommend `/gsd-set-profile` and stop.
read all files referenced by the invoking prompt's execution_context before starting.
## What Gets Validated
| Check | File | Validates |
|-------|------|-----------|
| `check-opencode-json` | `opencode.json` | All agent model IDs exist in the opencode models catalog |
| `check-config-json` | `.planning/oc_config.json` | gsd-opencode profile structure is valid, current profile exists in presets, all stage model IDs exist in catalog |
## CLI Tool
All validation runs through `gsd-oc-tools.cjs`. Both commands output a JSON envelope with `success`, `data`, and optional `error` fields. Exit code 0 = valid, exit code 1 = issues found.
## JSON Response Shapes
**check-opencode-json** (exit 0 or 1):
```json
{
"success": true,
"data": { "valid": true|false, "total": N, "validCount": N, "invalidCount": N, "issues": [{ "agent": "...", "model": "...", "reason": "..." }] },
"error": { "code": "INVALID_MODEL_ID", "message": "..." }
}
```
Note: When `opencode.json` does not exist, the tool returns exit 1 with `error.code = "CONFIG_NOT_FOUND"`. This is **not** an error for gsd-opencode profile validation — see Step 2 for handling.
**check-config-json** (exit 0 or 1):
```json
{
"success": true|false,
"data": { "passed": true|false, "current_oc_profile": "...", "profile_data": {...}, "issues": [{ "field": "...", "value": "...", "reason": "..." }] },
"error": { "code": "INVALID_PROFILE|CONFIG_NOT_FOUND|INVALID_JSON", "message": "..." }
}
```
## Step 1: Run both validations
Execute both checks and capture their output and exit codes:
```bash
node ./.opencode/get-shit-done/bin/gsd-oc-tools.cjs check-opencode-json
```
```bash
node ./.opencode/get-shit-done/bin/gsd-oc-tools.cjs check-config-json
```
Parse both JSON responses.
## Step 2: Classify results by severity
### opencode.json classification
| Tool result | Severity | Meaning |
|-------------|----------|---------|
| exit 0, `data.valid = true` | OK | All model IDs valid |
| exit 1, `error.code = "CONFIG_NOT_FOUND"` | WARNING | No `opencode.json` — agents will use the default/current model. This is acceptable. |
| exit 1, `error.code = "INVALID_MODEL_ID"` | ERROR | One or more model IDs are invalid. Must be fixed. |
| exit 1, `error.code = "INVALID_JSON"` | ERROR | File is malformed JSON. Must be fixed. |
### .planning/oc_config.json classification
| Tool result | Severity | Meaning |
|-------------|----------|---------|
| exit 0, `data.passed = true` | OK | gsd-opencode profile configuration valid |
| exit 1, `error.code = "CONFIG_NOT_FOUND"` | ERROR | No gsd-opencode profile configured yet |
| exit 1, `error.code = "INVALID_PROFILE"` | ERROR | gsd-opencode profile structure is invalid |
| exit 1, `error.code = "INVALID_JSON"` | ERROR | File is malformed JSON |
## Step 3: Report results
Determine the overall status:
- **All OK (no ERRORs, no WARNINGs)**: report success
- **WARNINGs only (no ERRORs)**: report success with warnings
- **Any ERRORs**: report errors with fix instructions
---
### All OK — no errors, no warnings
```
gsd-opencode profile: OK
opencode.json All model IDs valid
.planning/oc_config.json gsd-opencode profile valid
```
**Stop here.**
---
### OK with warnings (opencode.json missing, but oc_config.json is valid)
```
gsd-opencode profile: OK
opencode.json Not found (agents will use the default/current model)
.planning/oc_config.json gsd-opencode profile valid
```
**Stop here.**
---
### Errors found
Display a structured diagnostic. Use the severity labels (WARNING / ERROR) to make the impact clear.
```
gsd-opencode profile: ERRORS FOUND
--- opencode.json ---
[If OK]
All model IDs valid
[If WARNING — CONFIG_NOT_FOUND]
WARNING: opencode.json not found. Agents will use the default/current model.
[If ERROR — INVALID_MODEL_ID — iterate over data.issues]
ERROR: {N} invalid model ID(s):
Agent: {issue.agent}
Model: {issue.model}
Reason: {issue.reason}
(repeat for each issue)
[If ERROR — INVALID_JSON]
ERROR: opencode.json is not valid JSON.
--- .planning/oc_config.json ---
[If OK]
gsd-opencode profile valid
[If ERROR — CONFIG_NOT_FOUND]
ERROR: .planning/oc_config.json not found — no gsd-opencode profile configured.
[If ERROR — INVALID_PROFILE — iterate over data.issues]
ERROR: {N} gsd-opencode profile issue(s):
Field: {issue.field}
Value: {issue.value}
Reason: {issue.reason}
(repeat for each issue)
[If ERROR — INVALID_JSON]
ERROR: .planning/oc_config.json is not valid JSON.
--- Fix ---
Run /gsd-set-profile or /gsd-set-profile to fix gsd-opencode profile configuration.
```
**Stop here.** Do not offer to fix anything. Do not edit files.
- This workflow is strictly diagnostic — never modify `opencode.json`, `.planning/oc_config.json`, or any other file.
- When errors are found, always recommend `/gsd-set-profile` or `/gsd-set-profile ` as the resolution path. Do not suggest manual editing.
- Always display full model IDs (e.g., `bailian-coding-plan/qwen3-coder-plus`), never abbreviate.
- Missing `opencode.json` is a WARNING, not an error. The user simply hasn't customized agent models — agents fall back to the default/current model. Do not include it in the "Fix" section.
- Missing `.planning/oc_config.json` IS an error — it means no gsd-opencode profile has been set up.
- Always use the term "gsd-opencode profile" (not just "profile") when referring to the profile system.
- Both `check-config-json` and `check-oc-config-json` route to the same validator. Use `check-config-json` (shorter).