Preview 0.30

P04 - Review a dependency without installing it

Know before you begin

P04 is a guided, runnable Academy lesson in this preview. Its shared action cards are the public course route.

Complete P03 in the same Academy fork and clone. Keep a native terminal at the clone root for Academy operations and file inspection. Keep one CodeArbiter harness open at that same clone for agent work. Native-terminal commands are entered directly and never begin with !. A shell command inside a harness begins with exactly one !. CodeArbiter commands and agent messages belong in the harness and never begin with !.

The website is the primary lesson surface. Academy CLI only handles Prepare, Check, and Reset. It does not replace these guided decisions.

This is a review lesson, not a package-adoption lesson. The candidate set is committed offline evidence. It is not a live package-registry lookup, and its maintenance and vulnerability statements are a frozen 2026-07-31 snapshot rather than current registry or CVE truth.

Its policy is review-only-never-install. The report still records Known vulnerabilities and Supply chain as named review sections, but calls neither live truth. The prepared set has No NOTICE payload; no install during P04 means neither archive enters the exercise environment.

What you will prove

You will preserve one reviewed report for python-dateutil==2.9.0.post0 and its six closure. The beginner path rejects the candidate because finite legacy date formats can use a bounded datetime.strptime parser: explicit formats, a length limit, deterministic timezone and default rules, and fail-closed trailing-content behavior.

No CodeArbiter dependency-adoption command applies: $ca-add-dep is for an intended adoption and may present an install for confirmation. Use read-only $ca-btw only for a bounded question about existing repository context; it cannot inspect the frozen wheel artifacts, decide adoption, or write a report. After you inspect the supplied files, an ordinary harness request drafts learner-owned Academy evidence. You inspect it, review the tradeoff, and then select Decision: reject. The resulting commit contains only the review report. It does not change a dependency declaration, environment lock, or Academy approval wrapper. The existing checkpoint can still recognize its pre-existing equivalent acceptance topology, but that is not an instruction path in this lesson.

Prepare safely

Prepare the numbered dependency-review attempt

In a native terminal at the Academy clone root, run Prepare from clean main.

Why

Prepare records a repeatable baseline.

You · Native terminal · Windows

$academy = "$env:LOCALAPPDATA\ArbiterAcademy\preview-0.30\Scripts\arbiter-academy.exe"
& $academy --repository (Get-Location).Path prepare P04-review-a-dependency

You · Native terminal · macOS

academy="${XDG_DATA_HOME:-$HOME/.local/share}/arbiter-academy/preview-0.30/bin/arbiter-academy"
"$academy" --repository "$PWD" prepare P04-review-a-dependency

You · Native terminal · Linux

academy="${XDG_DATA_HOME:-$HOME/.local/share}/arbiter-academy/preview-0.30/bin/arbiter-academy"
"$academy" --repository "$PWD" prepare P04-review-a-dependency

Expected result

Academy prints academy/P04-review-a-dependency/ATTEMPT_NUMBER and switches to that branch.

If that does not happen

Preserve an error and resolve only its named condition before retrying.

Evidence

The branch binds later evidence to one prepared project state.

Read the no-install boundary

You · Browser · All operating systems

Use the website as the primary lesson surface before asking an agent to review the proposal. This beginner path teaches rejection only.

Why

Review is evidence about a proposal, not permission to change project state.

Expected result

You can state that Academy CLI only handles Prepare, Check, and Reset and that this lesson does not add a dependency declaration, environment lock, or Academy wrapper.

If that does not happen

If you expected package adoption, stop and return to the course boundary.

Evidence

No repository evidence has been created yet.

Read the frozen candidate set

Read the committed candidate set in the native terminal. It is offline evidence, not a live registry query.

Why

The review must name exact candidate bytes.

You · Native terminal · Windows

Get-Content -Raw -LiteralPath 'academy/candidates/P04-review-a-dependency/candidate-set.json'

You · Native terminal · macOS

cat academy/candidates/P04-review-a-dependency/candidate-set.json

You · Native terminal · Linux

cat academy/candidates/P04-review-a-dependency/candidate-set.json

Expected result

It identifies python-dateutil 2.9.0.post0, its six closure, digests, and review-only-never-install policy.

If that does not happen

If the file is absent or differs, stop. Do not fetch or substitute it.

Evidence

The review begins from committed candidate evidence.

Confirm the project has not changed

Inspect status in the native terminal before review evidence is written.

Why

Review must precede dependency-surface changes.

You · Native terminal · Windows

git status --short

You · Native terminal · macOS

git status --short

You · Native terminal · Linux

git status --short

Expected result

Git prints nothing.

If that does not happen

If Git prints a path, preserve it outside this attempt or use Reset. Do not hide it in history.

Evidence

The prepared baseline remains intact.

Practice

Inspect the supplied wheel metadata

List each prepared wheel. This reads archives only; it does not install or import either package.

Why

Metadata is evidence about a supplied archive, not a live registry.

You · Native terminal · Windows

python -m zipfile -l academy/candidates/P04-review-a-dependency/python_dateutil-2.9.0.post0-py2.py3-none-any.whl
python -m zipfile -l academy/candidates/P04-review-a-dependency/six-1.17.0-py2.py3-none-any.whl

You · Native terminal · macOS

python3 -m zipfile -l academy/candidates/P04-review-a-dependency/python_dateutil-2.9.0.post0-py2.py3-none-any.whl
python3 -m zipfile -l academy/candidates/P04-review-a-dependency/six-1.17.0-py2.py3-none-any.whl

You · Native terminal · Linux

python3 -m zipfile -l academy/candidates/P04-review-a-dependency/python_dateutil-2.9.0.post0-py2.py3-none-any.whl
python3 -m zipfile -l academy/candidates/P04-review-a-dependency/six-1.17.0-py2.py3-none-any.whl

Expected result

Each archive lists metadata and license payload without changing the environment.

If that does not happen

If Python cannot read an archive, preserve the error and Reset. Do not download a replacement.

Evidence

The report can cite artifact-local metadata.

Recompute the wheel digests

Hash both supplied wheels and compare them with candidate-set.json.

Why

A name and version are insufficient; the review binds to bytes.

You · Native terminal · Windows

Get-FileHash -Algorithm SHA256 academy/candidates/P04-review-a-dependency/python_dateutil-2.9.0.post0-py2.py3-none-any.whl
Get-FileHash -Algorithm SHA256 academy/candidates/P04-review-a-dependency/six-1.17.0-py2.py3-none-any.whl

You · Native terminal · macOS

shasum -a 256 academy/candidates/P04-review-a-dependency/python_dateutil-2.9.0.post0-py2.py3-none-any.whl academy/candidates/P04-review-a-dependency/six-1.17.0-py2.py3-none-any.whl

You · Native terminal · Linux

sha256sum academy/candidates/P04-review-a-dependency/python_dateutil-2.9.0.post0-py2.py3-none-any.whl academy/candidates/P04-review-a-dependency/six-1.17.0-py2.py3-none-any.whl

Expected result

The SHA-256 values match the frozen candidate set exactly.

If that does not happen

If either digest differs, stop and Reset.

Evidence

The report can bind its candidate and closure statements to archive bytes.

Read the bundled license evidence

Read the two wheel-derived licenses and Apache text. Do not invent a NOTICE or patent payload.

Why

License claims need named local source material.

You · Native terminal · Windows

Get-Content -Raw academy/candidates/P04-review-a-dependency/python_dateutil-2.9.0.post0.LICENSE
Get-Content -Raw academy/candidates/P04-review-a-dependency/six-1.17.0.LICENSE
Get-Content -Raw academy/candidates/P04-review-a-dependency/Apache-2.0.txt

You · Native terminal · macOS

cat academy/candidates/P04-review-a-dependency/python_dateutil-2.9.0.post0.LICENSE academy/candidates/P04-review-a-dependency/six-1.17.0.LICENSE academy/candidates/P04-review-a-dependency/Apache-2.0.txt

You · Native terminal · Linux

cat academy/candidates/P04-review-a-dependency/python_dateutil-2.9.0.post0.LICENSE academy/candidates/P04-review-a-dependency/six-1.17.0.LICENSE academy/candidates/P04-review-a-dependency/Apache-2.0.txt

Expected result

You can name both wheel-derived licenses and Apache text; the prepared set has no NOTICE payload.

If that does not happen

If a named file is absent, stop. Do not add a replacement.

Evidence

The report distinguishes observed terms from unobserved ones.

Assess frozen provenance limits

Use the selected copyable request to obtain a bounded reading of the frozen candidate evidence, then compare it with the files you read. Treat maintenance and vulnerability statements as the 2026-07-31 snapshot, never live registry or CVE truth.

Why

The learner reviews the time boundary, not an agent summary.

You · Claude Code harness · All operating systems

Review only academy/candidates/P04-review-a-dependency/candidate-set.json, the two supplied wheels, and their bundled license files. Explain the candidate provenance and supply-chain signals that those frozen files support, separating archive facts from the 2026-07-31 maintenance/vulnerability snapshot. Do not use live registry or CVE data, change files, stage, or commit; stop for my comparison.

You · Codex harness · All operating systems

Review only academy/candidates/P04-review-a-dependency/candidate-set.json, the two supplied wheels, and their bundled license files. Explain the candidate provenance and supply-chain signals that those frozen files support, separating archive facts from the 2026-07-31 maintenance/vulnerability snapshot. Do not use live registry or CVE data, change files, stage, or commit; stop for my comparison.

You · Pi harness · All operating systems

Review only academy/candidates/P04-review-a-dependency/candidate-set.json, the two supplied wheels, and their bundled license files. Explain the candidate provenance and supply-chain signals that those frozen files support, separating archive facts from the 2026-07-31 maintenance/vulnerability snapshot. Do not use live registry or CVE data, change files, stage, or commit; stop for my comparison.

Expected result

You can distinguish archive evidence from time-bounded maintenance and vulnerability observations.

If that does not happen

Do not add a live claim without inspectable source evidence.

Evidence

Your decision remains limited to supplied evidence and its review date.

Compare the bounded standard-library alternative

Use the selected copyable request to compare the bounded standard-library alternative against the frozen two-wheel closure, then decide whether its stated limits fit this exercise.

Why

The capability need is smaller than the package surface.

You · Claude Code harness · All operating systems

Compare finite-format datetime.strptime parsing with the frozen two-wheel closure across every SMARTS lens. Address length limits, explicit formats, deterministic defaults, and fail-closed trailing content. Do not change files, stage, commit, select a decision, or make safety claims beyond the supplied evidence; stop for my decision.

You · Codex harness · All operating systems

Compare finite-format datetime.strptime parsing with the frozen two-wheel closure across every SMARTS lens. Address length limits, explicit formats, deterministic defaults, and fail-closed trailing content. Do not change files, stage, commit, select a decision, or make safety claims beyond the supplied evidence; stop for my decision.

You · Pi harness · All operating systems

Compare finite-format datetime.strptime parsing with the frozen two-wheel closure across every SMARTS lens. Address length limits, explicit formats, deterministic defaults, and fail-closed trailing content. Do not change files, stage, commit, select a decision, or make safety claims beyond the supplied evidence; stop for my decision.

Expected result

You can explain why bounded datetime.strptime is sufficient for this finite-format exercise.

If that does not happen

If requirements broaden beyond finite formats, stop and record a separate decision.

Evidence

The rejection is a capability comparison, not an unsupported safety assertion.

Ask CodeArbiter the bounded no-install context question

Ask the read-only $ca-btw route one bounded project-context question about whether the prepared finite legacy date-format requirement has an existing local policy constraint. Its answer is conversational context only: it cannot inspect the supplied wheel artifacts, decide adoption, or write the Academy report.

Why

The real no-adoption route can clarify repository context without pretending to review an artifact or create evidence.

You · Claude Code harness · All operating systems

/ca:btw Does the existing Academy context constrain the finite legacy date-format requirement beyond the supplied P04 artifacts?

You · Codex harness · All operating systems

$ca-btw Does the existing Academy context constrain the finite legacy date-format requirement beyond the supplied P04 artifacts?

You · Pi harness · All operating systems

/ca-btw Does the existing Academy context constrain the finite legacy date-format requirement beyond the supplied P04 artifacts?

You · Pi harness · All operating systems

/skill:ca-btw Does the existing Academy context constrain the finite legacy date-format requirement beyond the supplied P04 artifacts?

Expected result

CodeArbiter answers from the repository's existing context without changing a file, routing work, installing a package, or deciding the rejection.

If that does not happen

If the answer is absent from repository context, record that limit and continue from the supplied frozen artifacts; do not turn $ca-btw into package research or a write request.

Evidence

The harness answer is ephemeral context, not a report or proof of the dependency assessment.

Draft learner-owned Academy evidence

No dependency is proposed for adoption, so do not invoke $ca-add-dep: its real lane reviews an intended dependency and can present an install for confirmation. After inspecting the frozen evidence, ask the active agent to draft learner-owned Academy evidence; it is not $ca-add-dep output and it must not install, change dependency files, or choose for you.

Why

The no-install decision is based on frozen local evidence. The separate Academy record makes that decision reviewable without pretending a CodeArbiter command wrote it.

Your agent · Claude Code harness · All operating systems

Draft .codearbiter/reports/academy/P04-dependency-review.md from the frozen P04 candidate files only. This is learner-owned Academy evidence, not $ca-add-dep output. Do not install, modify dependency files, stage, or commit; wait for my review.

Your agent · Codex harness · All operating systems

Draft .codearbiter/reports/academy/P04-dependency-review.md from the frozen P04 candidate files only. This is learner-owned Academy evidence, not $ca-add-dep output. Do not install, modify dependency files, stage, or commit; wait for my review.

Your agent · Pi harness · All operating systems

Draft .codearbiter/reports/academy/P04-dependency-review.md from the frozen P04 candidate files only. This is learner-owned Academy evidence, not $ca-add-dep output. Do not install, modify dependency files, stage, or commit; wait for my review.

Your agent · Pi harness · All operating systems

Draft .codearbiter/reports/academy/P04-dependency-review.md from the frozen P04 candidate files only. This is learner-owned Academy evidence, not $ca-add-dep output. Do not install, modify dependency files, stage, or commit; wait for my review.

Expected result

The agent drafts learner-owned Academy evidence at .codearbiter/reports/academy/P04-dependency-review.md with candidate, closure, license, provenance, supply-chain, compatibility, alternatives, and SMARTS evidence; dependency state is unchanged.

If that does not happen

If the agent changes dependency state or claims this is $ca-add-dep output, stop and Reset.

Evidence

The draft is an Academy record of reviewed local evidence, not proof that a CodeArbiter dependency command ran.

Review the drafted evidence

Use the selected copyable request to review the learner-owned draft against the prepared candidate evidence before deciding whether it needs correction.

Why

A formatted report is not a learner decision.

You · Claude Code harness · All operating systems

Review only .codearbiter/reports/academy/P04-dependency-review.md against academy/candidates/P04-review-a-dependency/candidate-set.json, the recorded hashes, and bundled licenses. Identify unsupported claims and verify that the report labels the 2026-07-31 snapshot rather than live registry or CVE truth. Do not change files, stage, commit, or choose the decision; stop for my review.

You · Codex harness · All operating systems

Review only .codearbiter/reports/academy/P04-dependency-review.md against academy/candidates/P04-review-a-dependency/candidate-set.json, the recorded hashes, and bundled licenses. Identify unsupported claims and verify that the report labels the 2026-07-31 snapshot rather than live registry or CVE truth. Do not change files, stage, commit, or choose the decision; stop for my review.

You · Pi harness · All operating systems

Review only .codearbiter/reports/academy/P04-dependency-review.md against academy/candidates/P04-review-a-dependency/candidate-set.json, the recorded hashes, and bundled licenses. Identify unsupported claims and verify that the report labels the 2026-07-31 snapshot rather than live registry or CVE truth. Do not change files, stage, commit, or choose the decision; stop for my review.

Expected result

You can identify candidate, closure, no-install policy, bounded alternative, and SMARTS comparison.

If that does not happen

Ask the agent to correct any claim unsupported by prepared files before you choose.

Evidence

The final report reflects reviewed local evidence.

Select the rejection decision

After you personally choose the rejection path, use the selected copyable request to record only that choice in the learner-owned report.

Why

The learner owns the tradeoff; the agent records it.

You · Claude Code harness · All operating systems

I choose bounded datetime.strptime for the supplied finite formats and Decision: reject. Update only .codearbiter/reports/academy/P04-dependency-review.md to record that learner decision and its reviewed rationale. Do not change files outside that report, stage, commit, install, or make the choice for me; stop for my review.

You · Codex harness · All operating systems

I choose bounded datetime.strptime for the supplied finite formats and Decision: reject. Update only .codearbiter/reports/academy/P04-dependency-review.md to record that learner decision and its reviewed rationale. Do not change files outside that report, stage, commit, install, or make the choice for me; stop for my review.

You · Pi harness · All operating systems

I choose bounded datetime.strptime for the supplied finite formats and Decision: reject. Update only .codearbiter/reports/academy/P04-dependency-review.md to record that learner decision and its reviewed rationale. Do not change files outside that report, stage, commit, install, or make the choice for me; stop for my review.

Expected result

The report says the bounded standard-library alternative is selected and ends with Decision: reject.

If that does not happen

If the formats are not finite and bounded, stop. That is a new requirement decision.

Evidence

The report preserves the decision and rationale, but not an authenticated account of who chose it.

Stage only the review report

Stage the report in the native terminal and inspect the staged path list before asking the agent to commit it.

Why

The rejection path commits only evidence.

You · Native terminal · Windows

git add -- .codearbiter/reports/academy/P04-dependency-review.md
git diff --cached --name-only

You · Native terminal · macOS

git add -- .codearbiter/reports/academy/P04-dependency-review.md
git diff --cached --name-only

You · Native terminal · Linux

git add -- .codearbiter/reports/academy/P04-dependency-review.md
git diff --cached --name-only

Expected result

The staged path list contains exactly .codearbiter/reports/academy/P04-dependency-review.md.

If that does not happen

If another path appears, preserve it and unstage only that unrelated path.

Evidence

The pending commit boundary makes the no-install decision inspectable.

Let the agent commit the review evidence

After you approve the one staged path, ask the active agent to invoke the host-native commit gate. This is a harness command, not a shell command.

Why

The governed commit records review without changing the dependency surface.

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

One descendant commit changes only .codearbiter/reports/academy/P04-dependency-review.md.

If that does not happen

If the gate blocks, preserve its finding and resolve the report boundary. Do not use a raw commit.

Evidence

Check can recompute the report and commit-path boundary.

Confirm the dependency surface stayed untouched

Inspect the final commit and worktree in the native terminal before Check. The review report is the only new committed path.

Why

A rejection leaves application dependency state unchanged.

You · Native terminal · Windows

git show --name-only --format= HEAD
git status --short

You · Native terminal · macOS

git show --name-only --format= HEAD
git status --short

You · Native terminal · Linux

git show --name-only --format= HEAD
git status --short

Expected result

The final commit names only the review report, Git is clean, and pyproject.toml, requirements.lock, and the Academy approval wrapper remain unchanged or absent.

If that does not happen

If another path is committed or uncommitted, preserve the attempt and Reset. Do not rewrite it to look clean.

Evidence

The final state separates review evidence from adoption.

Recognize success

The final descendant commit changes only .codearbiter/reports/academy/P04-dependency-review.md. Its report names the candidate and closure archives, their SHA-256 values, wheel-derived licenses and Apache text, frozen review date, supply-chain limits, compatibility boundary, bounded alternative, every SMARTS lens, and Install-Policy: no-install-in-p04. The report ends with Decision: reject.

pyproject.toml is unchanged. requirements.lock and .codearbiter/reports/academy/P04-approved-dependency.lock.json remain absent or unchanged. No package enters the exercise environment.

The checker retains a pre-existing equivalent acceptance topology for regression coverage. That path is not taught here: it would require one later governed adoption boundary, complete closure evidence, and remains separate from external installation. This beginner lesson never edits that surface.

Check

Run external Academy Check

Run installed Academy Check from the prepared clone in the native terminal.

Why

Check recomputes facts without trusting a transcript.

You · Native terminal · Windows

$academy = "$env:LOCALAPPDATA\ArbiterAcademy\preview-0.30\Scripts\arbiter-academy.exe"
& $academy --repository (Get-Location).Path check P04-review-a-dependency

You · Native terminal · macOS

academy="${XDG_DATA_HOME:-$HOME/.local/share}/arbiter-academy/preview-0.30/bin/arbiter-academy"
"$academy" --repository "$PWD" check P04-review-a-dependency

You · Native terminal · Linux

academy="${XDG_DATA_HOME:-$HOME/.local/share}/arbiter-academy/preview-0.30/bin/arbiter-academy"
"$academy" --repository "$PWD" check P04-review-a-dependency

Expected result

Check reports a passed P04 checkpoint and records progress only after valid evidence.

If that does not happen

If Check fails, preserve the attempt and read its named predicate before Reset.

Evidence

Check proves candidate binding, report structure, unchanged dependency surfaces, commit ancestry, and clean state. It does not prove that you ran a host command, and it does not authenticate your review or selection.

Check recomputes frozen candidate bytes, report grammar, prepared project digest, allowed commit paths, unchanged dependency surfaces, and clean worktree. It does not prove that you ran a host command, does not authenticate your review or selection, and cannot turn the frozen snapshot into live external truth.

Recover or continue

If evidence is incomplete, unsupported, or Check fails, preserve the attempt and start a new numbered one. Do not erase failed evidence to make a later decision look cleaner.

Hint 1

Read candidate-set.json before accepting an agent summary. A package name is not an artifact identity, and a candidate artifact is not installation permission.

Hint 2

Keep the requirement bounded: finite formats, a length limit, deterministic defaults, and a parser that fails closed. Broader requirements deserve their own decision.

Hint 3

The report records learner-owned Academy evidence and selected rejection. Check can inspect final state; it cannot reconstruct who read the draft or whether a CodeArbiter command ran.

Preserve and reset a failed attempt

Use Reset only for a new attempt or when Check directs recovery. It preserves failed evidence before restoring the prepared baseline.

Why

Failed reviews are evidence and must not be erased.

You · Native terminal · Windows

$academy = "$env:LOCALAPPDATA\ArbiterAcademy\preview-0.30\Scripts\arbiter-academy.exe"
& $academy --repository (Get-Location).Path reset P04-review-a-dependency

You · Native terminal · macOS

academy="${XDG_DATA_HOME:-$HOME/.local/share}/arbiter-academy/preview-0.30/bin/arbiter-academy"
"$academy" --repository "$PWD" reset P04-review-a-dependency

You · Native terminal · Linux

academy="${XDG_DATA_HOME:-$HOME/.local/share}/arbiter-academy/preview-0.30/bin/arbiter-academy"
"$academy" --repository "$PWD" reset P04-review-a-dependency

Expected result

Academy preserves the numbered attempt and prints the next safe start.

If that does not happen

If Reset refuses, preserve its output. Never force-reset, rebase, or delete evidence.

Evidence

The prior attempt remains inspectable.

After Check passes, leave the completed branch intact and return to main when ready. Continue to P05 when you are ready to practice a bounded checkpoint remediation.

Understand the mechanism

Dependency governance separates proposal, evidence, decision, and adoption. This lesson stops at a reviewed rejection because the bounded standard library parser meets the stated need with no new runtime closure. The stored report makes that tradeoff inspectable; it does not invent live facts, delegate the learner decision, or silently promote review evidence into installation authority.

Next step

Continue with P05-checkpoint-remediation.

Recovery guidance