# Apprenticeship Manual Cycle Write Path - ELI16

The apprenticeship program already had a database table for cycle records. A cycle is the evidence that one role did real work and another role reviewed it: what the mentee produced, what the mentor or overseer noticed, what coaching came out of it, and what infrastructure follow-up was created. The automated mentor tick was already able to write those rows. The missing practical part was making the manual or overseer path obvious and strict enough to use safely.

On the current main branch, the basic `POST /apprenticeship/cycles` route already existed. This change keeps that route and finishes the surrounding infrastructure instead of adding a duplicate. The route now checks that the HTTP body is an object and that any provided `channel` is one of the four known channels: `telegram-playwright`, `threadline-backup`, `direct-shortcut`, or `unknown`. If a caller sends a typo like `email`, the route returns a clear 400 error instead of silently converting it to `unknown`. The lower-level store still keeps its old fallback behavior for older records and non-HTTP callers, so this is a stricter manual entry point without breaking legacy data.

The change also makes the route discoverable. `/capabilities` now lists the cycle endpoints alongside the apprenticeship instance endpoints, including the manual write route, list route, overdue-SLA view, fetch route, and close route. The `CLAUDE.md` scaffold text now tells agents when and how to record a manual cycle, including the `kind` values and channel values. The post-update migrator gets the same awareness text for existing installs that do not already have an Apprenticeship Program section.

The main safety rule is that this route only records evidence; it does not change apprenticeship lifecycle status and it does not decide quality. Lifecycle transitions still go through the existing instance transition gates. Role coverage still uses the existing store rules, including the rule that a `direct-shortcut` mentor-mentee differential is recorded honestly but does not count as the dogfooded keystone channel. The new integration test records an overseer manual cycle through HTTP, confirms the channel is preserved, confirms the row can be fetched, and confirms role coverage reflects the overseer axis without accidentally firing the mentor-mentee axis.
