U02: Observe an audit-log guard without changing the audit trail
Choose the commands you use
Operating system
CodeArbiter host
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.
A failed pre-write attempt and an actual override are different events.
You know that `.codearbiter/overrides.log` stays unchanged and that the exercise commits only one local observation note.
If any requested action would change an audit record, stop this lesson. Do not substitute an override command.
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 `!`.
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
Academy creates one numbered U02 attempt with the audit-log baseline bound.
If Prepare refuses or the clone is dirty, preserve its message and correct that setup condition. Do not manufacture an attempt or scenario file.
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.
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
You see a local baseline digest without changing the audit log.
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.
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.
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
The active host prints one `BLOCKED [H-05]: ...` line before Git runs, and the audit log remains byte-for-byte unchanged.
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.
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.
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.
One unstaged observation note describes the local refusal and explicitly says that manual imitation remains possible.
If the agent cannot derive a field from the prepared baseline or displayed refusal, stop rather than guessing.
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.
A one-path commit boundary prevents an observation exercise from mutating the audit trail it discusses.
You can accept the one-path note or identify the exact local field to correct.
If another path changed, unstage it and correct only the note. Do not reset, amend, or rewrite audit history.
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 `!`.
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
Exactly one path is staged: `.codearbiter/reports/academy/U02-observation.md`.
If any other path is staged, unstage only that unexpected path and inspect again.
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.
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
The attempt gains exactly one observation-note commit.
If the gate blocks, preserve its finding and correct only the named note boundary. Do not amend or rewrite the attempt.
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 `!`.
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
Check accepts only one clean observation-note commit with the protected audit log unchanged. It never claims refusal chronology.
If Check reports a mismatch, correct only the note. Never touch the protected log.
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 `!`.
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
Academy archives the failed U02 attempt before preparing a new numbered attempt.
Do not use destructive Git commands to imitate Reset or erase unrelated state.
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.