Luna entry point
Course content comes first
The user found the site confusing because most chapter pages were short outlines.
There are now fifteen developed lessons: 00–10 and 14–17. Pages 11–13 remain
outlines; deeper tracks and native-lab validation remain incomplete. The available learner
route connects the core lessons.
New chapters 04, 09, 10 and 14 now teach remote-path reasoning, policy/container
boundaries, binary parsing and cryptographic integrity. python3 -m labs.binary_frame
reports two decoded and four rejected frames. python3 -m labs.integrity checks
RFC 4231 and demonstrates untrusted-hash replacement and accepted replay. Both
are original standard-library exercises. Windows remoting and container inspection
are reference-checked instructions with native execution still pending.
The python3 -m labs.detection exercise compares status-only alert rules on
six synthetic labeled cases. Both miss the successful cross-owner read; broader
error matching adds false positives. Windows identity commands are reference-
checked, not claimed to have been executed on Windows during the macOS build.
The coverage map names the missing depth and tracks,
including mobile, exploit development, industrial protocols, cloud and identity.
Do not equate the 24-week plan or private draft counts with a finished course.
Expand those tracks into coherent explanations and reproducible exercises. The
new OT sequence uses checked public references and an original offline fixture,
not a claim of approved private-book distillation. python3 -m labs.ot_trace
produces 7 synthetic records / 5 decoded / 2 unclassified / 1 policy deviation.
Its intentionally broad policy misses the address/context issue in r7, discussed
in chapters 16–17. Fixture tests run before Pages deployment.
The planner now requires recall, lab and explanation scores before promotion; a partial mean cannot unlock prerequisites. Recommendations show missing dimensions and weighted contributions; difficulty and ID break ties. Durable learning-event history remains pending. The readiness checker independently rejects outline chapters, even with claimed passing pipeline metrics. Software validation at this checkpoint: 118 tests passed; Ruff and mypy passed (including the two new lab modules). Strict MkDocs build and pinned-plugin checks passed, with 5,739 local link/asset checks and 428 search destinations. The embedded policy, mutation and public-test-key Python exercises produced the documented results. Sixteen live curl checks and the bounded permission/hash examples passed on macOS; Windows and Linux-only command execution remains untested here. Human review and learner validation remain outstanding.
The first real private review packet is at
.deadwire/review-packets/ad-foundations-001/README.md, alongside
machine-review.md and proposal-service-hosts.pending.json. Six selected drafts
from three books have source-byte checks and page locators; fourteen page slices
were compared against the original PDFs. Five drafts received revisions through
host Codex CLI Luna, and every human decision remains pending. The private
.deadwire/revisions/README.md maps the latest drafts, the retained failed response,
and one explicit citation-hash repair. deadwire revise-packet checks input hashes
and saves new outputs without replacing originals; inspect the
revision workflow.
Do not publish these
drafts based on their existence or schema validity. deadwire review-packet
creates additional private PDF review batches. The chunk-span refactor preserved
all 2,386 pilot chunks byte-for-byte, so it does not invalidate current drafts.
The MkDocs cover, terminal mark, mobile drawer, and content tabs are updated. See website maintenance for exact package pins, preview commands, and the build/link/search checks now required before Pages deployment. The 2026-09-11 software checkpoint passed 74 tests; it is not a source-quality measurement. The committed pilot snapshot is 1,190 generated / 355 quarantined / 841 untouched chunks after a bounded 20-batch run. Use the live status command below when a subsequent run is active.
deadwire evaluate observations.json --output report.json now computes OCR
CER/WER/fidelity and lexical/dense/candidate Recall@10/nDCG@10 from labeled inputs.
Use examples/evaluation.synthetic.json only to verify software behavior. Actual
labels and outputs stay private. The report includes sample sizes, denominators,
source split, and an input hash; see evaluation for the formulas.
Readiness rejects invalid numeric scores, synthetic or development runs, missing
metadata/sample sizes and duplicate metrics. The merge gate is zero known
incorrect accepted merges with a completed review, allowing zero accepted merges.
No real source-quality result is established by the synthetic example.
Deadwire is a documentation-and-infrastructure handoff. Inventory, extraction, local draft adapters, strict proposal validation, conflict-safe publication, planning, learner-event recording, and pure graph projection are present; Neo4j synchronization and durable learner-event storage remain backlog work. Read ADR index, then implement backlog in order.
The learner-facing target is an MkDocs site built from docs/course/. Keep the authored course spine usable while automation evolves. Do not ingest prior curriculum, audit, or SQLite-ledger experiments; only source documents and approved Deadwire notes are eligible inputs.
Canonical publication now retains complete typed metadata in Markdown, including
claims, command sources/evidence, prerequisites, proposal IDs and aliases.
deadwire canonical-export VAULT --output .deadwire/canonical.json validates and
exports those notes for graph-rebuild. Synthetic tests reproduce the graph
through publication → Markdown reload → JSON export → projection. Real source
approval and the live Neo4j rebuild gate remain outstanding. See the updated
review workflow for legacy-file migration and
command-evidence requirements; never fill missing human evidence automatically.
Lesson 08 now ships its own synthetic HTTP object-authorization fixture in
labs/web_boundary/. It runs with Python 3.12+ and no installed packages, binds
only loopback, and has explicit vulnerable/fixed modes. The four HTTP tests in
tests/test_web_lab.py run before Pages deployment. On 2026-09-11, the full suite
passed 47 tests under Python 3.12; a separate standard-library-only CLI run under
Python 3.14.6 confirmed the expected 200/403 behavior and port closure on Ctrl-C.
These are software validation results. Canonical approval, empirical model
quality, and student practice remain separate unfulfilled release gates.
Stage drafts in bounded batches with DEADWIRE_ALLOW_CODEX_EGRESS=1 uv run python scripts/distill_batch.py --limit 10 only after approving the Codex account data policy. The batch calls the host Codex CLI with --model gpt-5.6-luna, in read-only and ephemeral mode. LM Studio is not a generation fallback: it is reserved for batched embedding requests. Review generated Markdown before publishing it into docs/course/; staging output is ignored and canonical notes remain a human decision. If the host Codex CLI cannot resolve the requested model, record the failure and stop the batch; do not substitute a slower LM Studio chat model or a cloud provider silently.
The batch runner processes 4,000-character chunks with 200-character overlap and records #chunk:<index> in every provenance reference. --limit caps model attempts, not successful drafts; the result reports both attempted and processed. Use examples/pilot-books.json with --source-manifest to restrict the first run to the five-book AD pilot; its current status is 2,386 eligible chunks, of which 1,190 have staged drafts, 355 are quarantined failures, and 841 have not yet been attempted. A full-corpus status on the 2026-09-10 extraction snapshot reports 44,965 eligible chunks (27 empty/unsupported extraction payloads skipped); 1,190 current chunk drafts remain proposed staging output. The directory also contains 40 legacy pre-chunk drafts from ignored experiments; they are not course material and must not be published. These are queue-size observations, not a claim that the corpus has been distilled. Use repeated small runs until all eligible chunk destinations exist, then review before publication.
When a model response is rejected, failures.json records the bundle, chunk index, canonical source reference, and error so the same work can be retried or reviewed without guessing which chunk failed.
Before handing the site to students, run uv run python scripts/check_student_readiness.py --status-file pilot-status.json --approved-notes N --practice-days N. The readiness report requires a complete lesson contract, a finished pilot with no quarantined chunks, at least 120 human-approved canonical notes, and seven days of practice evidence.
Create a deterministic review manifest after each batch:
deadwire review-index
The manifest contains draft paths, titles, content hashes, source references, and failure records; it deliberately omits source excerpts. It separates current #chunk: proposals from legacy pre-chunk experiments. Open the referenced local Markdown files for review, then create a validated proposal before using deadwire publish-note.
Use uv run python scripts/distill_status.py --source-manifest examples/pilot-books.json to report generated, failed, and remaining chunks without invoking a model. This is the authoritative queue check after an interrupted worker.
For sustained processing, use the resumable queue wrapper. It invokes one bounded batch at a time, appends machine-readable progress to ignored staging output, and stops when a batch makes no progress:
uv run python scripts/distill_queue.py \
--source-manifest examples/pilot-books.json \
--batch-size 10 \
--max-batches 20 \
--model gpt-5.6-luna
Use a bounded --max-batches value for interactive runs. The worker skips chunks already listed in failures.json so it advances through untouched material; add --retry-failed only for a deliberate quarantine retry pass. Review queue-progress.jsonl, failures.json, and the status report between runs; a generated draft remains proposed until a human approves its claims, provenance, safety, and originality.
Non-negotiable invariants
- iCloud
Hackingis authoritative;Hacking/Deadwireis the canonical subtree. - Neo4j, artifacts, embeddings, and run state are projections and must be rebuildable.
- Source revisions are content-addressed. A rename does not re-OCR; changed bytes do.
- Source excerpts are passed only to the explicitly selected host Codex CLI model; embedding requests stay on the local LM Studio endpoint. Never execute extracted commands.
- A command is
verifiedonly with human lab evidence and a source reference. - An LLM proposal is never an approved canonical note until review.
- Every public contract is versioned, validated, idempotent, and testable with synthetic fixtures.
First implementation slice
Configuration, contracts, inventory, native extraction, local draft adapters, strict proposal validation, conflict-safe canonical publication, prerequisite planning, and learner-event recording now have executable slices. Next make the five-book pilot run end-to-end on fixtures with fake inference adapters, then add graph projection, durable learner-event storage, Anki export, and reporting.
The planner and evidence loop are available as deadwire plan <approved-concepts.json> and deadwire record-learning <event-id> <concept-id> <recall|review|lab|explanation> <0..1> --state-path <canonical-json>. Lab and explanation events require a redacted evidence reference; duplicate event IDs are no-ops.
Export reviewed concepts for offline Anki import with deadwire anki-export reviewed-concepts.json cards.tsv. This writes stable deadwire:<concept-id> tags; Anki owns scheduling and Deadwire owns the path and evidence model.
Do not decide again
Use Python 3.12 with uv, Swift/PDFKit/Vision on the host, Codex CLI --model gpt-5.6-luna in read-only ephemeral mode for distillation, LM Studio's local /embeddings endpoint for batched vectors, BGE-reranker-v2-m3 reranking, Neo4j Community in Compose, and NetworkX for prerequisite planning. If a dependency is unavailable on Apple Silicon, document the adapter and preserve the interface rather than silently changing behavior.