Build
Code stays on the code lane.
A change request is typed as a patch and routed to code-1. If the same message also asks for an explanation, that part splits off and does not ride inside the diff.
Code lane
Code stays on the code lane.
A change request is typed as a patch. code-1 receives Route<ChangeRequest, Diff>. If the same message also asks why, that part is an explanation and leaves on reason-1. A status note with no diff is prose. Pinning code-1 refuses it.
src/routes.ts · code-1
14 export async function handler(req) {
15+ await limit(req, { max: 100 });
16 const session = await getSession(req);
17 return schema.parse(session);
18 }
Route<ChangeRequest, Diff> · code-1
The hop
The caller receives a diff.
code-1 is the lane for a change to a repository. The caller stores a diff, reviews a diff, or applies a diff. A paragraph that mentions a change is a different type. Separator does not invent a second API for source control.
src/routes.ts
export async function handler(req) {
+ await limit(req, { max: 100 });
return schema.parse(session);
}
Split
The explanation does not ride inside the file.
Ask for the limit and also ask why it exists. The patch stays on code-1. reason-1 answers the question. A note to the team would be write-1. Those parts are listed beside the diff. They are not pasted into it.
src/routes.ts · code-1
await limit(req, { max: 100 });
The limit is checked before the handler runs.
reason-1
The limit is checked before the handler runs.
Pin
Pinning does not widen the lane.
Send model code-1 when the caller already knows the body is a patch. If the body does not fit Route<ChangeRequest, Diff>, the hop is refused. A status update has no file change. It is not forced onto a code model.
Shipped the limit. No file change.
code-1 shut
The note does not fit Route<ChangeRequest, Diff>. The lane stays shut.
Separator
Put a typed route in front of the models you already call.
Decision
explanation
reason-1
4.2 ms