Preview 0.30

U07: Complete a bounded feature capstone

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.

Why

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

Expected result

HEAD is on main and git status --short prints nothing; the completed U06 attempt branch remains intact.

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.

Evidence

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.

Why

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

Expected result

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 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.

Evidence

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.

Why

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"

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.

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.

Evidence

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.

Why

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.

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.

Evidence

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.

Why

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

Expected result

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.

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.

Evidence

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.

Why

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

Expected result

Academy preserves the old attempt on an academy/archive/U07-capstone timestamped branch and prints a clean next attempt branch.

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.

Evidence

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.

Next step

none is not available in Arbiter Academy Preview 0.30.

Recovery guidance