applyMode: no-new-ai received an AI-dependent request without pre-populated output
The skill rail (`/coherent-chat` via Claude Code) and the API rail (`coherent chat`) share the same `applyRequests` entry point but run with different `applyMode` settings. API rail has an AI provider available and runs in `with-ai` mode — non-pre-populated AI requests are fine, the provider fills in the output mid-dispatch. Skill rail has NO provider and runs in `no-new-ai` mode — every AI-dependent request must arrive with its output already filled in by the upstream skill phase. Pre-v0.12.0 the skill rail silently dropped these requests; since v0.12.0 it throws E007 loudly so the producer-side bug surfaces immediately.
When you see it
Hitting `applyRequests` on the skill rail with a `ModificationRequest` whose type is AI-dependent (`add-page`, `update-page`, `modify-layout-block`, `link-shared`, `promote-and-link`) but the request did NOT carry pre-populated deterministic output (`changes.pageCode` for add/update-page, `changes.layoutBlock` for modify-layout-block).
Why
AI-dependent request types need either a model in the loop OR a producer phase that has already filled in the deterministic output. Skill rail has no model. If a request reaches `applyRequests` without pre-population, the producer phase upstream has a bug — the skill flow expected to fill in the output before emitting the request, and didn't.
Fix options
- 1
Re-run via the API rail
The API rail has the provider available and handles AI-dependent requests directly. This is the fastest workaround when you hit E007 from a skill-rail invocation. File an issue afterward with the skill name + request type so the producer-side bug can be fixed.
$ coherent chat "<your original request>" - 2
You called `applyRequests` directly from custom code
Switch to `applyMode: 'with-ai'` if you have a provider set up, or pre-populate the request's `changes.pageCode` / `changes.layoutBlock` field before calling `applyRequests`.
- 3
The request type is `link-shared` or `promote-and-link`
These cannot be pre-populated — they always require AI to pick the insertion site / extract the JSX. Use the API rail.
$ coherent chat "<your request>"