U07 is the capstone in the public Academy course. Start at your Academy fork and clone on main with
an empty git status --short. Keep a native terminal at the clone root and one codeArbiter harness
opened at the same repository.
This capstone uses the real codeArbiter feature lane. Its terminal offers a real hosted pull request.
Academy can inspect local Git state, but it cannot authenticate a harness invocation, browser event,
hosted review, CI run, or merge.
You will repair the prepared behavior: a ticket resolution must reject newline, tab, and DEL control
characters. This bounded two-file change uses the small lane of the real feature workflow, so it leaves its
classification in .codearbiter/triage.log, a live focused regression, and executable service
behavior on the prepared branch. It does not manufacture full-lane specification or plan files.
You will also choose Open a PR at the real feature terminal and retain its browser URL. That URL is
evidence of the hosted pull request for you and its reviewers. It is not an Academy receipt.
After completing U06, use a native terminal at the Academy clone root to return to main and confirm the checkout is clean before preparing U07. This preserves the completed U06 attempt branch.
Why this matters: U07 Prepare creates its own numbered branch from main; it must not start from a previous lesson attempt.
Windows
git switch main
git status --short
macOS
git switch main
git status --short
Linux
git switch main
git status --short
Expected result
HEAD is on main and git status --short prints nothing; the completed U06 attempt branch remains intact.
Evidence
The branch name and clean status establish the base-branch precondition for the U07 attempt.
If that does not happen
If switching branches would overwrite or hide work, stop and preserve that work on its existing branch. Do not force-switch, reset, rebase, delete, or alter the earlier attempt. Next safe step: return only after the checkout is clean.
2
You
Prepare the bounded feature attempt
From a clean main branch at the Academy clone root, run Prepare in a native terminal. Academy creates the numbered attempt branch and seeds one known control-character defect. Stay on that branch for the capstone.
Why this matters: The fixture makes the implementation boundary inspectable without replacing codeArbiter's feature workflow.
Academy prints academy/U07-capstone/ATTEMPT_NUMBER. The branch is clean and tests/test_service.py contains a passing case that shows the existing resolution behavior accepts a control character. The feature lane will add the missing resolution regression.
Evidence
Keep the printed attempt branch and verify that git status --short is empty before entering the feature lane.
If that does not happen
If Prepare names a dirty-worktree, branch, or remote problem, preserve the message and repair only that condition. Do not force-reset main or borrow another lesson's history.
ATTEMPT_NUMBER is the number Academy prints, such as 1. It is not text to type. Do not switch to
another branch before the real feature terminal finishes.
In the selected codeArbiter harness at that clone, invoke the copied feature command. Review the proposed mini-spec and criteria before confirmation. They must keep the work to ticket-resolution control characters, tests/test_service.py, and workshop_queue/service.py. Add the missing resolution regression through this real feature lane.
Why this matters: The real feature lane owns specification, planning, test-first execution, its commit gate, and the terminal decision.
Any OS · Claude Code
/ca:feature "Reject control characters in ticket resolutions"
Any OS · Codex
$ca-feature "Reject control characters in ticket resolutions"
Any OS · Pi
/ca-feature "Reject control characters in ticket resolutions"
Any OS · Pi
/skill:ca-feature "Reject control characters in ticket resolutions"
Expected result
For this bounded two-file change, codeArbiter uses its small lane and appends the classification to .codearbiter/triage.log, then changes the focused regression and service behavior, completes its own commit gate, and presents its feature-branch terminal. It does not invent full-lane spec or plan files.
Evidence
The committed .codearbiter/triage.log small-lane entry, focused test, implementation, and clean worktree are local evidence that Academy Check can inspect.
If that does not happen
If the proposed scope expands or the feature lane reports a stop, do not hand-write substitute artifacts. Preserve the branch and resolve the named real gate, or use Reset for a new attempt.
Read the proposed mini-spec and criteria before you confirm them. Reject a draft that adds unrelated workflow,
dependencies, data migration, or an unrelated public API. If codeArbiter stops for a real decision,
answer that decision in the harness. Do not imitate the feature lane by creating an Academy-only spec,
plan, review marker, or pull-request record.
When the feature lane reaches its terminal, use the browser action.
4
YouBrowser
Choose Open a PR at the real terminal
When codeArbiter presents the feature terminal, choose Open a PR. Do not merge or discard. In your fork's browser view, confirm that the feature branch has an open pull request to its default target.
Why this matters: A feature ends through a real hosted PR. Academy must not imitate that event with a local file.
Expected result
Your fork shows an open PR from the prepared feature branch. Leave it open for the normal hosted review and merge process.
Evidence
Preserve the browser URL of the real open PR. Academy Check does not authenticate that browser event.
If that does not happen
If no PR opens, keep the clean branch and use the real feature terminal's recovery. Do not write a local PR receipt or claim a review that did not happen.
The local branch is clean. It contains the small-lane classification in .codearbiter/triage.log,
a focused service test that rejects all three control characters, and the narrow service validation
that makes it pass. Your fork’s browser shows the feature branch as an open hosted pull request.
Leave that hosted pull request open. Its review and merge are part of the normal feature lifecycle,
not a local Academy simulation.
After the feature branch is clean, run Academy Check in a native terminal at the clone root. It inspects the prepared baseline, committed small-lane triage record, bounded behavior, remotes, and worktree state.
Why this matters: Check independently verifies durable repository facts without claiming that a harness command, review, PR, CI run, or merge occurred.
Check prints checkpoint U07-capstone: passed only when the prepared defect, feature documents, executable regression and repair, fork-safe remote, and clean worktree match the capstone boundary.
Evidence
A passing Check records U07 progress. It is separate from the browser URL you retained for the actual hosted PR.
If that does not happen
Read the failed predicate and correct the real branch boundary it identifies. Do not create a PR, review, CI, or approval receipt to influence Check.
A passing Check validates the prepared baseline, the local small-lane record, the committed test and
service behavior, safe remotes, and a clean worktree. It does not prove that the feature command ran,
that you approved its spec, that a hosted pull request exists, that CI passed, or that anyone reviewed
or merged it.
If Check fails, retain the branch and read the failed predicate. Repair the local boundary it names
through the real feature workflow. Do not amend history to make it resemble a template and do not add
a fake review or PR artifact.
If the branch is beyond repair, use the preserved retry action.
6
You
Preserve the branch before a retry
Use Reset only if this attempt cannot be repaired. Run it from the matching clean Academy attempt branch. Academy archives the current branch before creating a new numbered attempt.
Why this matters: A preserved retry leaves the failed feature evidence inspectable and avoids rewriting history or deleting a real hosted branch.
Academy preserves the old attempt on an academy/archive/U07-capstone timestamped branch and prints a clean next attempt branch.
Evidence
The archive branch and the new numbered branch remain reachable for separate inspection.
If that does not happen
If Reset refuses, preserve its output and current branch. Resolve only the stated repository condition. Never force-reset, rebase, delete the old attempt, or close a real PR to make the retry easier.
Hint 1. Read the prepared test before approving the feature scope. It shows the existing resolution behavior accepts a control character. Add the missing resolution regression through the real feature lane.
Hint 2. A clean local branch and a browser-visible pull request are separate facts. Keep evidence for both, but do not turn either into a fabricated receipt.
Hint 3. If Check rejects the attempt, repair the named committed path and rerun it. Reset is for a new baseline, not a way to hide a failed branch.
After a pass, continue the actual hosted pull request through its normal review and merge process.
There is no next Academy lab in this course.
The feature lane owns the conversational gates and its terminal choice. The prepared attempt gives
Academy an immutable baseline. Check compares that baseline with committed files and executes the
focused behavior itself. The browser URL remains deliberately outside that verifier because a local
file cannot prove a hosted event.