U07: Complete a bounded feature capstone
Choose the commands you use
Operating system
CodeArbiter host
Know before you begin
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.
What you will prove
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.
Prepare safely
Return safely to the Academy base branch
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.
U07 Prepare creates its own numbered branch from main; it must not start from a previous lesson attempt.
You · Native terminal · Windows
git switch main
git status --short
You · Native terminal · macOS
git switch main
git status --short
You · Native terminal · Linux
git switch main
git status --short
HEAD is on main and git status --short prints nothing; the completed U06 attempt branch remains intact.
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.
The branch name and clean status establish the base-branch precondition for the U07 attempt.
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.
The fixture makes the implementation boundary inspectable without replacing CodeArbiter's feature workflow.
You · Native terminal · Windows
$academy = "$env:LOCALAPPDATA\ArbiterAcademy\preview-0.30\Scripts\arbiter-academy.exe"
& $academy --repository (Get-Location).Path prepare U07-capstone
You · Native terminal · macOS
academy="${XDG_DATA_HOME:-$HOME/.local/share}/arbiter-academy/preview-0.30/bin/arbiter-academy"
"$academy" --repository "$PWD" prepare U07-capstone
You · Native terminal · Linux
academy="${XDG_DATA_HOME:-$HOME/.local/share}/arbiter-academy/preview-0.30/bin/arbiter-academy"
"$academy" --repository "$PWD" prepare U07-capstone
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.
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.
Keep the printed attempt branch and verify that git status --short is empty before entering the feature lane.
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.
Practice
Run the real feature lane
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.
The real feature lane owns specification, planning, test-first execution, its commit gate, and the terminal decision.
You · Claude Code harness · All operating systems
/ca:feature "Reject control characters in ticket resolutions"
You · Codex harness · All operating systems
$ca-feature "Reject control characters in ticket resolutions"
You · Pi harness · All operating systems
/ca-feature "Reject control characters in ticket resolutions"
You · Pi harness · All operating systems
/skill:ca-feature "Reject control characters in ticket resolutions"
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.
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.
The committed .codearbiter/triage.log small-lane entry, focused test, implementation, and clean worktree are local evidence that Academy Check can inspect.
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.
Choose Open a PR at the real terminal
You · Browser · All operating systems
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.
A feature ends through a real hosted PR. Academy must not imitate that event with a local file.
Your fork shows an open PR from the prepared feature branch. Leave it open for the normal hosted review and merge process.
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.
Preserve the browser URL of the real open PR. Academy Check does not authenticate that browser event.
Recognize success
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.
Check
Check durable local evidence
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.
Check independently verifies durable repository facts without claiming that a harness command, review, PR, CI run, or merge occurred.
You · Native terminal · Windows
$academy = "$env:LOCALAPPDATA\ArbiterAcademy\preview-0.30\Scripts\arbiter-academy.exe"
& $academy --repository (Get-Location).Path check U07-capstone
You · Native terminal · macOS
academy="${XDG_DATA_HOME:-$HOME/.local/share}/arbiter-academy/preview-0.30/bin/arbiter-academy"
"$academy" --repository "$PWD" check U07-capstone
You · Native terminal · Linux
academy="${XDG_DATA_HOME:-$HOME/.local/share}/arbiter-academy/preview-0.30/bin/arbiter-academy"
"$academy" --repository "$PWD" check U07-capstone
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.
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 records U07 progress. It is separate from the browser URL you retained for the actual hosted PR.
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.
Recover or continue
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.
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.
A preserved retry leaves the failed feature evidence inspectable and avoids rewriting history or deleting a real hosted branch.
You · Native terminal · Windows
$academy = "$env:LOCALAPPDATA\ArbiterAcademy\preview-0.30\Scripts\arbiter-academy.exe"
& $academy --repository (Get-Location).Path reset U07-capstone
You · Native terminal · macOS
academy="${XDG_DATA_HOME:-$HOME/.local/share}/arbiter-academy/preview-0.30/bin/arbiter-academy"
"$academy" --repository "$PWD" reset U07-capstone
You · Native terminal · Linux
academy="${XDG_DATA_HOME:-$HOME/.local/share}/arbiter-academy/preview-0.30/bin/arbiter-academy"
"$academy" --repository "$PWD" reset U07-capstone
Academy preserves the old attempt on an academy/archive/U07-capstone timestamped branch and prints a clean next attempt branch.
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.
The archive branch and the new numbered branch remain reachable for separate inspection.
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.
Understand the mechanism
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.