Preview 0.30

U02: Observe an audit-log guard without changing the audit trail

Know before you begin

U02 is a published Power User lesson in Preview 0.30. The action cards are the primary route. Academy provides local Prepare, Check, and Reset helpers.

Keep a native terminal and one supported CodeArbiter harness at the same clone. Native shell commands never begin with !. Harness shell commands begin with exactly one !. Host CodeArbiter commands never begin with !.

Read the audit-guard observation boundary

You · Browser · All operating systems

This lesson observes one harmless blocked write against an existing append-only audit log. It does not ask you to execute an override, change an audit record, or claim that anyone approved a bypass.

Why

A failed pre-write attempt and an actual override are different events.

Expected result

You know that `.codearbiter/overrides.log` stays unchanged and that the exercise commits only one local observation note.

If that does not happen

If any requested action would change an audit record, stop this lesson. Do not substitute an override command.

Evidence

Check binds repository bytes and one local event-shaped note. It cannot prove the refusal chronology; manual imitation remains possible.

What you will prove

Prepare creates a numbered U02 branch with a committed scenario overlay and binds the starting bytes of .codearbiter/overrides.log. The learner makes one content-neutral restore request. H-05 protects the audit log from that rewrite-shaped shell operation before Git runs.

The only committed learner artifact is .codearbiter/reports/academy/U02-observation.md. It records the prepared baseline digest and the displayed H-05 line, then says plainly that a written note cannot prove the event chronology. The audit log remains unchanged.

This lesson does not practice $ca-override, write audit packets, or preserve metrics output. Those are separate real CodeArbiter surfaces. Do not represent an Academy note as their output.

Prepare safely

Create the prepared U02 attempt

Prepare the bound U02 baseline

At the clean Academy clone root, run Academy Prepare in a native terminal. Native-terminal commands go directly into that terminal and never begin with `!`.

Why

Prepare creates the numbered attempt and binds Check to the audit log's pre-observation bytes.

Academy · Native terminal · Windows

$academy = "$env:LOCALAPPDATA\ArbiterAcademy\preview-0.30\Scripts\arbiter-academy.exe"
& $academy --repository (Get-Location).Path prepare U02-override-audit-metrics

Academy · Native terminal · macOS

academy="${XDG_DATA_HOME:-$HOME/.local/share}/arbiter-academy/preview-0.30/bin/arbiter-academy"
"$academy" --repository "$PWD" prepare U02-override-audit-metrics

Academy · Native terminal · Linux

academy="${XDG_DATA_HOME:-$HOME/.local/share}/arbiter-academy/preview-0.30/bin/arbiter-academy"
"$academy" --repository "$PWD" prepare U02-override-audit-metrics

Expected result

Academy creates one numbered U02 attempt with the audit-log baseline bound.

If that does not happen

If Prepare refuses or the clone is dirty, preserve its message and correct that setup condition. Do not manufacture an attempt or scenario file.

Evidence

The prepared commit is the source for the baseline digest Check derives.

Practice

Observe the protected path once

Inspect the bound audit-log baseline

In the prepared attempt, inspect the current audit log through the selected harness shell. Harness shell commands begin with exactly one `!`; they are shell commands, not CodeArbiter commands.

Why

Recognize the protected target before observing the guard that prevents its rewrite.

You · Claude Code harness · Windows

!Get-FileHash .codearbiter\overrides.log -Algorithm SHA256

You · Codex harness · Windows

!Get-FileHash .codearbiter\overrides.log -Algorithm SHA256

You · Pi harness · Windows

!Get-FileHash .codearbiter\overrides.log -Algorithm SHA256

You · Claude Code harness · macOS

!shasum -a 256 .codearbiter/overrides.log

You · Codex harness · macOS

!shasum -a 256 .codearbiter/overrides.log

You · Pi harness · macOS

!shasum -a 256 .codearbiter/overrides.log

You · Claude Code harness · Linux

!sha256sum .codearbiter/overrides.log

You · Codex harness · Linux

!sha256sum .codearbiter/overrides.log

You · Pi harness · Linux

!sha256sum .codearbiter/overrides.log

Expected result

You see a local baseline digest without changing the audit log.

If that does not happen

If the log is missing or the worktree is not clean, stop and Reset the attempt. Do not create or edit the log by hand.

Evidence

The displayed digest is orientation only. Check derives its own digest from the prepared commit.

Observe the H-05 guarded restore refusal

Run exactly one `git restore --source=HEAD` request in the harness shell, so it begins with one `!`. Prepare has proven the target equals HEAD, so the request is content-neutral if enforcement is unavailable. Do not retry it or use an override command.

Why

The real H-05 shell guard blocks Git restore because it can rewrite an audit log.

You · Claude Code harness · All operating systems

!git restore --source=HEAD -- .codearbiter/overrides.log

You · Codex harness · All operating systems

!git restore --source=HEAD -- .codearbiter/overrides.log

You · Pi harness · All operating systems

!git restore --source=HEAD -- .codearbiter/overrides.log

Expected result

The active host prints one `BLOCKED [H-05]: ...` line before Git runs, and the audit log remains byte-for-byte unchanged.

If that does not happen

If the guard does not run, verify the log still equals HEAD, preserve the result, and stop for host-install investigation. Never edit the log to repair or hide the attempt.

Evidence

Capture the displayed H-05 line exactly. Its SHA-256 binds the note to that text, but the note cannot independently prove when the refusal happened.

Preserve the limited local note

Draft one constrained observation note

Ask the agent to draft `.codearbiter/reports/academy/U02-observation.md` from the displayed H-05 line and the bound baseline. It must contain the exact target, baseline SHA-256, event SHA-256, event_line, and the chronology limitation. Do not stage, commit, or push.

Why

A constrained note preserves an observation without touching protected audit history.

Your agent · Claude Code harness · All operating systems

Create only .codearbiter/reports/academy/U02-observation.md. Write exactly these eight lines, each followed by LF:
# U02 audit-guard observation

event: H-05 guarded restore refusal
target: .codearbiter/overrides.log
baseline_sha256: <SHA-256 of the unchanged current .codearbiter/overrides.log UTF-8 bytes; Prepare bound it to HEAD>
event_sha256: <SHA-256 of the exact displayed BLOCKED [H-05] refusal line as UTF-8 bytes>
event_line: <that exact displayed line>
limitation: This record cannot prove the refusal chronology; manual imitation remains possible.

Do not stage, commit, push, or edit .codearbiter/overrides.log.

Your agent · Codex harness · All operating systems

Create only .codearbiter/reports/academy/U02-observation.md. Write exactly these eight lines, each followed by LF:
# U02 audit-guard observation

event: H-05 guarded restore refusal
target: .codearbiter/overrides.log
baseline_sha256: <SHA-256 of the unchanged current .codearbiter/overrides.log UTF-8 bytes; Prepare bound it to HEAD>
event_sha256: <SHA-256 of the exact displayed BLOCKED [H-05] refusal line as UTF-8 bytes>
event_line: <that exact displayed line>
limitation: This record cannot prove the refusal chronology; manual imitation remains possible.

Do not stage, commit, push, or edit .codearbiter/overrides.log.

Your agent · Pi harness · All operating systems

Create only .codearbiter/reports/academy/U02-observation.md. Write exactly these eight lines, each followed by LF:
# U02 audit-guard observation

event: H-05 guarded restore refusal
target: .codearbiter/overrides.log
baseline_sha256: <SHA-256 of the unchanged current .codearbiter/overrides.log UTF-8 bytes; Prepare bound it to HEAD>
event_sha256: <SHA-256 of the exact displayed BLOCKED [H-05] refusal line as UTF-8 bytes>
event_line: <that exact displayed line>
limitation: This record cannot prove the refusal chronology; manual imitation remains possible.

Do not stage, commit, push, or edit .codearbiter/overrides.log.

Expected result

One unstaged observation note describes the local refusal and explicitly says that manual imitation remains possible.

If that does not happen

If the agent cannot derive a field from the prepared baseline or displayed refusal, stop rather than guessing.

Evidence

Check requires exact note bytes and the unchanged protected log. It does not authenticate the agent or harness transcript.

Review the one-path observation boundary

You · Browser · All operating systems

Review the draft before staging. The only learner commit path is `.codearbiter/reports/academy/U02-observation.md`; `.codearbiter/overrides.log` must remain unchanged. Audit and metrics are optional read-only observations, never input to Check's chronology proof.

Why

A one-path commit boundary prevents an observation exercise from mutating the audit trail it discusses.

Expected result

You can accept the one-path note or identify the exact local field to correct.

If that does not happen

If another path changed, unstage it and correct only the note. Do not reset, amend, or rewrite audit history.

Evidence

Review is a learner action. No repository artifact can prove it occurred.

Stage only the observation note

After your review, stage exactly the observation note in a native terminal. Native-terminal commands never begin with `!`.

Why

The staged diff makes the permissible one-path boundary visible before the governed commit.

You · Native terminal · Windows

git add -- .codearbiter/reports/academy/U02-observation.md
git diff --cached --name-only

You · Native terminal · macOS

git add -- .codearbiter/reports/academy/U02-observation.md
git diff --cached --name-only

You · Native terminal · Linux

git add -- .codearbiter/reports/academy/U02-observation.md
git diff --cached --name-only

Expected result

Exactly one path is staged: `.codearbiter/reports/academy/U02-observation.md`.

If that does not happen

If any other path is staged, unstage only that unexpected path and inspect again.

Evidence

The staged diff demonstrates scope, not the timing or cause of the refusal.

Commit the observation through CodeArbiter

After learner approval of the one-path staged diff, invoke the host-native commit gate. It is a CodeArbiter command and never a `!` shell passthrough.

Why

One child commit lets Check compare local evidence against the prepared state.

Your agent · Claude Code harness · All operating systems

/ca:commit

Your agent · Codex harness · All operating systems

$ca-commit

Your agent · Pi harness · All operating systems

/ca-commit

Your agent · Pi harness · All operating systems

/skill:ca-commit

Expected result

The attempt gains exactly one observation-note commit.

If that does not happen

If the gate blocks, preserve its finding and correct only the named note boundary. Do not amend or rewrite the attempt.

Evidence

A commit proves local paths and bytes, not a human approval or real-time harness event.

Recognize success

The prepared attempt has exactly one child commit. It changes only .codearbiter/reports/academy/U02-observation.md; .codearbiter/overrides.log is byte-for-byte identical to the prepared baseline. The note has eight lines, including the displayed H-05 line and the chronology limitation.

This is not proof that the selected host ran the command at a particular time. It is a bounded local record whose path, bytes, prepared baseline, and commit scope Check can validate.

Check

Check validates the prepared baseline, protected-log preservation, note bytes, one child commit, and clean worktree. It does not authenticate a transcript, a person, or a hosted result.

Run the local U02 checkpoint

Run Check in a native terminal. Native-terminal commands never begin with `!`.

Why

Check validates the prepared baseline, protected-log preservation, exact note shape, one commit, and clean worktree.

You · Native terminal · Windows

$academy = "$env:LOCALAPPDATA\ArbiterAcademy\preview-0.30\Scripts\arbiter-academy.exe"
& $academy --repository (Get-Location).Path check U02-override-audit-metrics

You · Native terminal · macOS

academy="${XDG_DATA_HOME:-$HOME/.local/share}/arbiter-academy/preview-0.30/bin/arbiter-academy"
"$academy" --repository "$PWD" check U02-override-audit-metrics

You · Native terminal · Linux

academy="${XDG_DATA_HOME:-$HOME/.local/share}/arbiter-academy/preview-0.30/bin/arbiter-academy"
"$academy" --repository "$PWD" check U02-override-audit-metrics

Expected result

Check accepts only one clean observation-note commit with the protected audit log unchanged. It never claims refusal chronology.

If that does not happen

If Check reports a mismatch, correct only the note. Never touch the protected log.

Evidence

A pass is local deterministic evidence, not proof of a hosted action or an unforgeable harness event.

Recover or continue

If Check reports a mismatch, correct only the observation note. Do not edit .codearbiter/overrides.log, add a second event line, invent an override, or rewrite the attempt.

Hint 1. The probe is exactly git restore --source=HEAD -- .codearbiter/overrides.log through the harness shell. It is safe because Prepare bound the target to HEAD before the probe.

Hint 2. The note uses the displayed BLOCKED [H-05]: ... text verbatim. Hash that exact UTF-8 text for event_sha256.

Hint 3. Reset is only for an attempt that cannot be corrected inside the observation-note boundary. It preserves rather than erases the failed attempt.

Reset this attempt safely

If the attempt cannot be corrected within its note boundary, use Academy Reset in a native terminal. Native-terminal commands never begin with `!`.

Why

Reset preserves the failed attempt rather than hiding it through history rewriting.

You · Native terminal · Windows

$academy = "$env:LOCALAPPDATA\ArbiterAcademy\preview-0.30\Scripts\arbiter-academy.exe"
& $academy --repository (Get-Location).Path reset U02-override-audit-metrics

You · Native terminal · macOS

academy="${XDG_DATA_HOME:-$HOME/.local/share}/arbiter-academy/preview-0.30/bin/arbiter-academy"
"$academy" --repository "$PWD" reset U02-override-audit-metrics

You · Native terminal · Linux

academy="${XDG_DATA_HOME:-$HOME/.local/share}/arbiter-academy/preview-0.30/bin/arbiter-academy"
"$academy" --repository "$PWD" reset U02-override-audit-metrics

Expected result

Academy archives the failed U02 attempt before preparing a new numbered attempt.

If that does not happen

Do not use destructive Git commands to imitate Reset or erase unrelated state.

Evidence

The archive is local recovery state, not proof that the observed refusal happened.

Understand the mechanism

The guide and action manifest are one contract. The renderer turns each action reference into the same website card, with the correct operating-system, harness, and copy control. Check is the deterministic authority for the local artifact boundary. It does not claim a command invocation, approval, or event chronology that repository state cannot establish.

Next step

Continue with U03-refactor-chore-release.

Recovery guidance