From dd7679fbab56fd6f700901bd358953dae23faf34 Mon Sep 17 00:00:00 2001 From: Travis James Date: Sun, 9 Aug 2026 05:52:20 -0500 Subject: [PATCH 1/6] docs: add CLAUDE.md agent guide Add a repository-level CLAUDE.md for Claude Code that defers to AGENTS.md as the authoritative operating guide and covers the mechanics it leaves implicit: - the mandatory per-invocation CARGO_TARGET_DIR requirement, including the Makefile targets that resolve binaries through a literal target/ path; - narrow-loop and baseline Rust commands, surface-specific gates, and the npm workspace commands for the viewer and VS Code extension; - the one-directional build pipeline across compass-files, -languages, -resolve, -graph, and -model, with the extractor/resolver evidence boundary and the compass-cypher/compass-query syntax-vs-execution split; - enforced workspace constraints (lint set, determinism, boundedness) and the compatibility-sensitive surfaces. Co-Authored-By: Claude Opus 5 (1M context) --- CLAUDE.md | 212 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 000000000..e43b0788e --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,212 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Read AGENTS.md first + +`AGENTS.md` is the authoritative operating guide for this repository and applies +to the whole tree. It covers product invariants, crate ownership routing, Rust +conventions, test/fixture policy, public-contract rules, and the completion +checklist. Read it before editing. This file only adds the mechanics AGENTS.md +does not spell out. + +## Build target directory (mandatory) + +The main disk is capped at 100 GB, so Cargo artifacts live on a mounted volume. +**Set `CARGO_TARGET_DIR` on every invocation that can compile** — `build`, +`check`, `test`, `clippy`, `bench`, `doc`, `install`, `package`, and any Make +target wrapping them. The variable does not persist between tool calls. + +```bash +CARGO_TARGET_DIR=/Volumes/Workspace/crabbuild-target/compass-main \ + cargo test -p compass-model --locked +``` + +Each checkout and worktree needs its own directory +(`compass-` for other worktrees). Never share one across +repositories or concurrent worktrees. If `/Volumes/Workspace` is not mounted, +stop and report it rather than falling back to local `target/`. + +Note the conflict this creates with the Makefile: several targets (`install`, +`dist`, `release-check`) look up binaries through a literal `target/` path after +Cargo finishes. Prefer direct `cargo` commands for verification, and inspect any +packaging/install target before running it so it does not silently trigger a +second local build. + +## Commands + +Rust (Edition 2024, pinned toolchain 1.97.1, always `--locked`): + +```bash +cargo test -p --locked # narrowest loop +cargo test -p --test --locked # one integration file +cargo test -p compass-cli --test compass_product --locked # CLI product contract +cargo clippy -p --all-targets --all-features --locked -- -D warnings + +# Repository baseline before finishing a Rust change +cargo fmt --all -- --check +cargo clippy --workspace --lib --bins --locked -- -D warnings +cargo test --workspace --lib --bins --locked +``` + +Surface-specific gates (run the ones matching what changed): + +```bash +sh scripts/check_product_boundary.sh # no Graphify references +cargo test -p compass-cypher --test tck --locked # CompassQL grammar +cargo test -p compass-query --test opencypher_tck --locked +python3 scripts/check_compassql_support.py # pinned support evidence +./scripts/qualify_code_graph_v1.sh --fixtures-only # code-graph publication gate +``` + +JavaScript / viewer / VS Code (npm workspaces: `apps/*`, `packages/*`, +`editors/*`, `tests/*`): + +```bash +npm ci +npm run typecheck:js +npm run test:js +node scripts/check_viewer_assets.mjs # generated viewer assets match source +``` + +`make help` lists wrappers. `make test`, `make lint`, `make test-js`, +`make qualify-code-graph-v1`, and `make ci-fast` cover the common paths. +`make test` is workspace `--lib --bins` only; `make test-all` adds +`--all-targets --all-features` and needs the Python oracle setup. + +CI (`.github/workflows/compass-ci.yml`) additionally runs nextest, isolated +native tests, crate-archive publishing checks, `cargo install` launch +verification, query-relevance qualification, dependency audit/policy, and a +native platform matrix. Consult it before touching those surfaces. + +## Architecture + +One Rust workspace of ~31 `compass-*` crates plus a vendored tree-sitter +language pack. The shipped artifact is package `compass-cli`, binary `compass`, +entry `crates/compass-cli/src/bin/compass.rs`. + +The core value proposition: source code and project artifacts become a typed, +directed multigraph with provenance, published as one atomic, deterministic +snapshot — no Python, embeddings, vector DB, model credentials, or runtime +parser downloads on the structural path. + +### The build pipeline + +`compass update` / `extract` / `watch` parse into `compass-core::BuildOptions` + +a `BuildPurpose`, then flow one direction through the layers: + +```text +compass-files walk + classify + ignore policy, cache/manifest, atomic writes + | (incremental reuse decided here, via fingerprints) + v +compass-languages per-file syntax facts only -> Extraction {nodes, edges, + | hyperedges, raw calls}; statically linked parsers + v +compass-resolve merge Extractions; resolve cross-file imports, calls, + | members, re-exports, aliases, stable IDs + v +compass-graph dedup, communities/clustering, god nodes, cycles, topology + | + v +compass-model GraphDocument / Graph / QueryIndex — the public contract + | + v +compass-core sequences the above into one transactional workflow +``` + +The critical boundary: **per-file extractors emit evidence; they never resolve +targets that need project-wide facts.** That lives in `compass-resolve`. +Similarly, anything that depends on graph topology rather than source syntax +belongs in `compass-graph`, not the extractor. + +### Query path + +`compass-cypher` (lexer → parser → AST → semantic analysis → logical plan → +optimizer) compiles CompassQL — a bounded, read-only openCypher subset — and +owns `LANGUAGE_VERSION` / `PLANNER_VERSION`, both cache-compatibility inputs. +`compass-query` executes against the graph (text scoring, traversal, impact, +CompassQL execution/cache/profile). Syntax acceptance is a `compass-cypher` +concern; execution behavior is a `compass-query` concern. + +### Presentation and interfaces + +`compass-output` renders an already-complete graph (Markdown, HTML, JSON, SVG, +GraphML, Cypher, Obsidian, wiki, canvas). `compass-cli` and `compass-mcp` are +deliberately thin: argument parsing, help, exit codes, streams, side effects, +schemas — reusable behavior belongs in the owning domain crate. + +### History + +`compass-history` stores immutable graph realizations per Git commit over +SQLite/Prolly: canonical encoding, meaning-affecting fingerprints, typed keys, +artifact partitioning, durable job queue, leases, locks, GC, and typed record +diffs. `compass-semantic-diff` compares two published realizations under +evidence gating. **Published realizations are immutable** — never rewrite in +place or silently substitute a different realization/profile. + +### Optional layers + +`compass-semantic` (provider fragments, prompts, validation — hard caps on +fragment bytes/record counts, endpoint checks), `compass-media` / +`compass-ingest` / `compass-transcribe` / `compass-whisper` (bounded document +and audio extraction), and integrations (`compass-cargo`, `compass-global`, +`compass-google-workspace`, `compass-graphdb`, `compass-postgres`, +`compass-prs`, `compass-reflect`). All of these are optional; structural +extraction and graph queries must keep working without any of them. + +### Generated viewer assets + +`crates/compass-output/assets/viewer/{graph.js,viewer.css,manifest.json}` are +build outputs of `packages/compass-viewer`. Edit the React source, then: + +```bash +node scripts/build_viewer_assets.mjs # regenerate +node scripts/check_viewer_assets.mjs # verify they match +``` + +Never hand-edit the generated files. + +## Enforced constraints + +Workspace lints forbid `unsafe_code` and deny `clippy::all`, `unwrap_used`, +`expect_used`, and `panic` — return typed errors with actionable context. + +Determinism is a correctness property, not a nicety: prefer `BTreeMap`/`BTreeSet` +or explicit sorting at contract boundaries, and never rely on hash iteration or +filesystem order. Never resolve ambiguity by picking the first or most +convenient candidate — an explicit unresolved/ambiguous result beats invented +meaning. + +Every traversal of files, graphs, archives, network responses, queries, and +subprocess output must be bounded. A limit error is a distinct outcome from an +empty result; do not collapse the two. + +Reuse the existing bounded readers, subprocess helpers, path-containment checks, +endpoint checks, and atomic-write functions rather than writing weaker local +variants. Pass subprocess arguments separately — never construct shell strings. + +Add workspace dependencies at the root `Cargo.toml` and reference them as +`{name}.workspace = true`. + +## Compatibility-sensitive surfaces + +CLI arguments/help/exit codes, environment variables, configuration, graph JSON, +CompassQL, MCP schemas, output files, history formats, and stable IDs. An +incompatible user-visible change needs all four of: native regression coverage, +updated reference documentation, a `MIGRATION.md` note when users must act, and +a `CHANGELOG.md` entry when release-visible. See `COMPATIBILITY.md`. + +## Documentation map + +- `docs/implementation/workspace-tour.md` — crate-by-crate responsibilities, + public interfaces, and "change here when" guidance. Use it to route work. +- `docs/implementation/extending-compass.md` — extension checklists. +- `docs/design/language-architecture.md` and + `docs/reference/universal-semantic-evidence.md` — required reading before + touching universal adapters, evidence facts, resolution rules, or language + cutovers. +- `docs/design/principles.md` — the rules behind AGENTS.md. +- `.impeccable.md` — viewer/extension design direction (restrained workbench + aesthetic, VS Code theme tokens, evidence over implication). +- Docs distinguish shipped behavior from plans; never cite anything under + `docs/superpowers/` as shipped evidence. From c349fdf6197ecc6754e62f628459ea28bfb246ed Mon Sep 17 00:00:00 2001 From: Travis James Date: Sun, 9 Aug 2026 05:55:44 -0500 Subject: [PATCH 2/6] chore: track Prometheus wiki and initialize OpenSpec Track the .prometheus/knowledge/wiki/ session records so the knowledge content lives with the repository. Initialize OpenSpec (schema: spec-driven) with generated configuration for Claude Code, Codex, Kimi CLI, and OpenCode. Zed was requested but is not a supported `openspec init` target, so it has no generated configuration. Kimi receives skills only; OpenSpec reports no command adapter for it. The local .claude/settings.local.json permission allowlist is intentionally left untracked. Co-Authored-By: Claude Opus 5 (1M context) --- .claude/commands/opsx/apply.md | 156 +++++ .claude/commands/opsx/archive.md | 161 +++++ .claude/commands/opsx/bulk-archive.md | 245 ++++++++ .claude/commands/opsx/continue.md | 118 ++++ .claude/commands/opsx/explore.md | 175 ++++++ .claude/commands/opsx/ff.md | 101 ++++ .claude/commands/opsx/new.md | 72 +++ .claude/commands/opsx/onboard.md | 551 +++++++++++++++++ .claude/commands/opsx/sync.md | 144 +++++ .claude/commands/opsx/verify.md | 168 ++++++ .claude/skills/openspec-apply-change/SKILL.md | 160 +++++ .../skills/openspec-archive-change/SKILL.md | 118 ++++ .../openspec-bulk-archive-change/SKILL.md | 249 ++++++++ .../skills/openspec-continue-change/SKILL.md | 122 ++++ .claude/skills/openspec-explore/SKILL.md | 290 +++++++++ .claude/skills/openspec-ff-change/SKILL.md | 105 ++++ .claude/skills/openspec-new-change/SKILL.md | 77 +++ .claude/skills/openspec-onboard/SKILL.md | 555 ++++++++++++++++++ .claude/skills/openspec-sync-specs/SKILL.md | 148 +++++ .../skills/openspec-verify-change/SKILL.md | 172 ++++++ .codex/skills/openspec-apply-change/SKILL.md | 160 +++++ .../skills/openspec-archive-change/SKILL.md | 118 ++++ .../openspec-bulk-archive-change/SKILL.md | 249 ++++++++ .../skills/openspec-continue-change/SKILL.md | 122 ++++ .codex/skills/openspec-explore/SKILL.md | 290 +++++++++ .codex/skills/openspec-ff-change/SKILL.md | 105 ++++ .codex/skills/openspec-new-change/SKILL.md | 77 +++ .codex/skills/openspec-onboard/SKILL.md | 555 ++++++++++++++++++ .codex/skills/openspec-sync-specs/SKILL.md | 148 +++++ .codex/skills/openspec-verify-change/SKILL.md | 172 ++++++ .kimi/skills/openspec-apply-change/SKILL.md | 160 +++++ .kimi/skills/openspec-archive-change/SKILL.md | 118 ++++ .../openspec-bulk-archive-change/SKILL.md | 249 ++++++++ .../skills/openspec-continue-change/SKILL.md | 122 ++++ .kimi/skills/openspec-explore/SKILL.md | 290 +++++++++ .kimi/skills/openspec-ff-change/SKILL.md | 105 ++++ .kimi/skills/openspec-new-change/SKILL.md | 77 +++ .kimi/skills/openspec-onboard/SKILL.md | 555 ++++++++++++++++++ .kimi/skills/openspec-sync-specs/SKILL.md | 148 +++++ .kimi/skills/openspec-verify-change/SKILL.md | 172 ++++++ .opencode/commands/opsx-apply.md | 152 +++++ .opencode/commands/opsx-archive.md | 157 +++++ .opencode/commands/opsx-bulk-archive.md | 241 ++++++++ .opencode/commands/opsx-continue.md | 114 ++++ .opencode/commands/opsx-explore.md | 171 ++++++ .opencode/commands/opsx-ff.md | 97 +++ .opencode/commands/opsx-new.md | 68 +++ .opencode/commands/opsx-onboard.md | 547 +++++++++++++++++ .opencode/commands/opsx-sync.md | 140 +++++ .opencode/commands/opsx-verify.md | 164 ++++++ .../skills/openspec-apply-change/SKILL.md | 160 +++++ .../skills/openspec-archive-change/SKILL.md | 118 ++++ .../openspec-bulk-archive-change/SKILL.md | 249 ++++++++ .../skills/openspec-continue-change/SKILL.md | 122 ++++ .opencode/skills/openspec-explore/SKILL.md | 290 +++++++++ .opencode/skills/openspec-ff-change/SKILL.md | 105 ++++ .opencode/skills/openspec-new-change/SKILL.md | 77 +++ .opencode/skills/openspec-onboard/SKILL.md | 555 ++++++++++++++++++ .opencode/skills/openspec-sync-specs/SKILL.md | 148 +++++ .../skills/openspec-verify-change/SKILL.md | 172 ++++++ .prometheus/knowledge/wiki/index.md | 14 + .../wiki/karpathy-session-04f1f5622348cff2.md | 54 ++ .../wiki/karpathy-session-0cf2eabc28e07ef7.md | 41 ++ .../wiki/karpathy-session-199d5165acd78a00.md | 48 ++ .../wiki/karpathy-session-7521e456ead1ce12.md | 52 ++ .../wiki/karpathy-session-85be47bbe3d4faec.md | 41 ++ .../wiki/karpathy-session-95e26dce31a612a2.md | 41 ++ .../wiki/karpathy-session-a0b489beb0d312d9.md | 44 ++ .../wiki/karpathy-session-bb64c62e88af6029.md | 48 ++ .../wiki/karpathy-session-c13ff840014cf2b3.md | 37 ++ .../wiki/karpathy-session-f8eff00b52d5f657.md | 48 ++ .prometheus/knowledge/wiki/log.md | 13 + openspec/config.yaml | 20 + 73 files changed, 12227 insertions(+) create mode 100644 .claude/commands/opsx/apply.md create mode 100644 .claude/commands/opsx/archive.md create mode 100644 .claude/commands/opsx/bulk-archive.md create mode 100644 .claude/commands/opsx/continue.md create mode 100644 .claude/commands/opsx/explore.md create mode 100644 .claude/commands/opsx/ff.md create mode 100644 .claude/commands/opsx/new.md create mode 100644 .claude/commands/opsx/onboard.md create mode 100644 .claude/commands/opsx/sync.md create mode 100644 .claude/commands/opsx/verify.md create mode 100644 .claude/skills/openspec-apply-change/SKILL.md create mode 100644 .claude/skills/openspec-archive-change/SKILL.md create mode 100644 .claude/skills/openspec-bulk-archive-change/SKILL.md create mode 100644 .claude/skills/openspec-continue-change/SKILL.md create mode 100644 .claude/skills/openspec-explore/SKILL.md create mode 100644 .claude/skills/openspec-ff-change/SKILL.md create mode 100644 .claude/skills/openspec-new-change/SKILL.md create mode 100644 .claude/skills/openspec-onboard/SKILL.md create mode 100644 .claude/skills/openspec-sync-specs/SKILL.md create mode 100644 .claude/skills/openspec-verify-change/SKILL.md create mode 100644 .codex/skills/openspec-apply-change/SKILL.md create mode 100644 .codex/skills/openspec-archive-change/SKILL.md create mode 100644 .codex/skills/openspec-bulk-archive-change/SKILL.md create mode 100644 .codex/skills/openspec-continue-change/SKILL.md create mode 100644 .codex/skills/openspec-explore/SKILL.md create mode 100644 .codex/skills/openspec-ff-change/SKILL.md create mode 100644 .codex/skills/openspec-new-change/SKILL.md create mode 100644 .codex/skills/openspec-onboard/SKILL.md create mode 100644 .codex/skills/openspec-sync-specs/SKILL.md create mode 100644 .codex/skills/openspec-verify-change/SKILL.md create mode 100644 .kimi/skills/openspec-apply-change/SKILL.md create mode 100644 .kimi/skills/openspec-archive-change/SKILL.md create mode 100644 .kimi/skills/openspec-bulk-archive-change/SKILL.md create mode 100644 .kimi/skills/openspec-continue-change/SKILL.md create mode 100644 .kimi/skills/openspec-explore/SKILL.md create mode 100644 .kimi/skills/openspec-ff-change/SKILL.md create mode 100644 .kimi/skills/openspec-new-change/SKILL.md create mode 100644 .kimi/skills/openspec-onboard/SKILL.md create mode 100644 .kimi/skills/openspec-sync-specs/SKILL.md create mode 100644 .kimi/skills/openspec-verify-change/SKILL.md create mode 100644 .opencode/commands/opsx-apply.md create mode 100644 .opencode/commands/opsx-archive.md create mode 100644 .opencode/commands/opsx-bulk-archive.md create mode 100644 .opencode/commands/opsx-continue.md create mode 100644 .opencode/commands/opsx-explore.md create mode 100644 .opencode/commands/opsx-ff.md create mode 100644 .opencode/commands/opsx-new.md create mode 100644 .opencode/commands/opsx-onboard.md create mode 100644 .opencode/commands/opsx-sync.md create mode 100644 .opencode/commands/opsx-verify.md create mode 100644 .opencode/skills/openspec-apply-change/SKILL.md create mode 100644 .opencode/skills/openspec-archive-change/SKILL.md create mode 100644 .opencode/skills/openspec-bulk-archive-change/SKILL.md create mode 100644 .opencode/skills/openspec-continue-change/SKILL.md create mode 100644 .opencode/skills/openspec-explore/SKILL.md create mode 100644 .opencode/skills/openspec-ff-change/SKILL.md create mode 100644 .opencode/skills/openspec-new-change/SKILL.md create mode 100644 .opencode/skills/openspec-onboard/SKILL.md create mode 100644 .opencode/skills/openspec-sync-specs/SKILL.md create mode 100644 .opencode/skills/openspec-verify-change/SKILL.md create mode 100644 .prometheus/knowledge/wiki/index.md create mode 100644 .prometheus/knowledge/wiki/karpathy-session-04f1f5622348cff2.md create mode 100644 .prometheus/knowledge/wiki/karpathy-session-0cf2eabc28e07ef7.md create mode 100644 .prometheus/knowledge/wiki/karpathy-session-199d5165acd78a00.md create mode 100644 .prometheus/knowledge/wiki/karpathy-session-7521e456ead1ce12.md create mode 100644 .prometheus/knowledge/wiki/karpathy-session-85be47bbe3d4faec.md create mode 100644 .prometheus/knowledge/wiki/karpathy-session-95e26dce31a612a2.md create mode 100644 .prometheus/knowledge/wiki/karpathy-session-a0b489beb0d312d9.md create mode 100644 .prometheus/knowledge/wiki/karpathy-session-bb64c62e88af6029.md create mode 100644 .prometheus/knowledge/wiki/karpathy-session-c13ff840014cf2b3.md create mode 100644 .prometheus/knowledge/wiki/karpathy-session-f8eff00b52d5f657.md create mode 100644 .prometheus/knowledge/wiki/log.md create mode 100644 openspec/config.yaml diff --git a/.claude/commands/opsx/apply.md b/.claude/commands/opsx/apply.md new file mode 100644 index 000000000..c6cb9b6d7 --- /dev/null +++ b/.claude/commands/opsx/apply.md @@ -0,0 +1,156 @@ +--- +name: "OPSX: Apply" +description: Implement tasks from an OpenSpec change (Experimental) +allowed-tools: Bash(openspec:*) +category: Workflow +tags: [workflow, artifacts, experimental] +--- + +Implement tasks from an OpenSpec change. + +**Store selection:** If the user names a store (a store is a standalone OpenSpec repo registered on this machine) or the work lives in one, run `openspec store list --json` to discover registered store ids, then pass `--store ` on the commands that read or write specs and changes (`new change`, `status`, `instructions`, `list`, `show`, `validate`, `archive`, `doctor`, `context`). Other commands do not take the flag. Hints printed by commands already carry the flag; keep it on follow-ups. Without a store, commands act on the nearest local `openspec/` root. + +**Input**: Optionally specify a change name (e.g., `/opsx:apply add-auth`). If omitted, check if it can be inferred from conversation context. If vague or ambiguous you MUST prompt for available changes. + +**Steps** + +1. **Select the change** + + If a name is provided, use it. Otherwise: + - Infer from conversation context if the user mentioned a change + - Auto-select if only one active change exists + - If ambiguous, run `openspec list --json` to get available changes and use the **AskUserQuestion tool** to let the user select + + Always announce: "Using change: " and how to override (e.g., `/opsx:apply `). + +2. **Check status to understand the schema** + ```bash + openspec status --change "" --json + ``` + Parse the JSON to understand: + - `schemaName`: The workflow being used (e.g., "spec-driven") + - `planningHome`, `changeRoot`, and `actionContext`: planning scope and edit constraints + - Which artifact contains the tasks (typically "tasks" for spec-driven, check status for others) + +3. **Get apply instructions** + + ```bash + openspec instructions apply --change "" --json + ``` + + This returns: + - `contextFiles`: artifact ID -> array of concrete file paths (varies by schema) + - Progress (total, complete, remaining) + - Task list with status + - Dynamic instruction based on current state + + **Handle states:** + - If `state: "blocked"` (missing artifacts): show message, suggest using `/opsx:continue` + - If `state: "all_done"`: congratulate, suggest archive + - Otherwise: proceed to implementation + +4. **Read context files** + + Read every file path listed under `contextFiles` from the apply instructions output. + The files depend on the schema being used: + - **spec-driven**: proposal, specs, design, tasks + - Other schemas: follow the contextFiles from CLI output + +5. **Show current progress** + + Display: + - Schema being used + - Progress: "N/M tasks complete" + - Remaining tasks overview + - Dynamic instruction from CLI + +6. **Implement tasks (loop until done or blocked)** + + For each pending task: + - Show which task is being worked on + - Make the code changes required + - Keep changes minimal and focused + - Mark task complete in the tasks file: `- [ ]` → `- [x]` + - Continue to next task + + **Pause if:** + - Task is unclear → ask for clarification + - Implementation reveals a design issue → suggest updating artifacts + - Error or blocker encountered → report and wait for guidance + - User interrupts + +7. **On completion or pause, show status** + + Display: + - Tasks completed this session + - Overall progress: "N/M tasks complete" + - If all done: suggest archive + - If paused: explain why and wait for guidance + +**Output During Implementation** + +``` +## Implementing: (schema: ) + +Working on task 3/7: +[...implementation happening...] +✓ Task complete + +Working on task 4/7: +[...implementation happening...] +✓ Task complete +``` + +**Output On Completion** + +``` +## Implementation Complete + +**Change:** +**Schema:** +**Progress:** 7/7 tasks complete ✓ + +### Completed This Session +- [x] Task 1 +- [x] Task 2 +... + +All tasks complete! You can archive this change with `/opsx:archive`. +``` + +**Output On Pause (Issue Encountered)** + +``` +## Implementation Paused + +**Change:** +**Schema:** +**Progress:** 4/7 tasks complete + +### Issue Encountered + + +**Options:** +1.