Skip to content

Complete a bounded feature capstone

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.

  1. You

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

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

    Windows

    $academy = "$env:LOCALAPPDATA\ArbiterAcademy\preview-0.32\Scripts\arbiter-academy.exe"
    & $academy --repository (Get-Location).Path prepare U07-capstone

    macOS

    academy="${XDG_DATA_HOME:-$HOME/.local/share}/arbiter-academy/preview-0.32/bin/arbiter-academy"
    "$academy" --repository "$PWD" prepare U07-capstone

    Linux

    academy="${XDG_DATA_HOME:-$HOME/.local/share}/arbiter-academy/preview-0.32/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.

    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.

  1. You

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

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

  1. You

    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 this matters: Check independently verifies durable repository facts without claiming that a harness command, review, PR, CI run, or merge occurred.

    Windows

    $academy = "$env:LOCALAPPDATA\ArbiterAcademy\preview-0.32\Scripts\arbiter-academy.exe"
    & $academy --repository (Get-Location).Path check U07-capstone

    macOS

    academy="${XDG_DATA_HOME:-$HOME/.local/share}/arbiter-academy/preview-0.32/bin/arbiter-academy"
    "$academy" --repository "$PWD" check U07-capstone

    Linux

    academy="${XDG_DATA_HOME:-$HOME/.local/share}/arbiter-academy/preview-0.32/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.

    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.

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

    Windows

    $academy = "$env:LOCALAPPDATA\ArbiterAcademy\preview-0.32\Scripts\arbiter-academy.exe"
    & $academy --repository (Get-Location).Path reset U07-capstone

    macOS

    academy="${XDG_DATA_HOME:-$HOME/.local/share}/arbiter-academy/preview-0.32/bin/arbiter-academy"
    "$academy" --repository "$PWD" reset U07-capstone

    Linux

    academy="${XDG_DATA_HOME:-$HOME/.local/share}/arbiter-academy/preview-0.32/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.

    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.