Public skill
Alias /computer-setup
Computer Setup
View prompt
Read https://dvn.pw/computer-setup.md and help me use this skill for my task. Load task-required stages through dvn when needed.
CURRENTVerified 2026-10-24T07:07:40.146Z
Read the Markdown invocation packet
Skill instructions
Original instructions
public/skills/computer-setup/current/SKILL.md
--- name: computer-setup description: Prepare or resume the Starter Pack computer baseline with approved capability installs, cross-context command checks, private saving, file transfer, and actual phone-to-harness control. version: 0.2.3 updated: 2026-10-05 --- # Computer Setup The learner directs work in their selected agent platform. The editor is their way to inspect and edit files, especially Markdown plans and notes. Do not require an editor extension workflow or a coding lesson. ## Load and stage before changing anything 1. Read the [setup manifest](https://starter.uppercut-labs.com/setup/computer-setup.manifest.json), [canonical requirements](https://starter.uppercut-labs.com/agent/requirements.json), and [progress guide](https://starter.uppercut-labs.com/artifacts/progress/README.md). Use that registry's IDs, prerequisites and completion rules; the capability manifest supplies execution evidence, not a second phase-gate definition. 2. Load the learner's existing canonical `starter-progress.json`, portable handoff, and `setup/computer.json`. Preserve completed Phase 1 outcomes, unknown fields, notes, decisions, declines and customized Workbench. A private repository is not an entry prerequisite. Initialize the [setup state format](https://starter.uppercut-labs.com/setup/state.example.json) only when no setup state exists. Never reset real progress from an example. 3. Preserve the chosen computer harness separately from the phone companion. Reuse supplied packets; do not repeat intake or a failing fetch loop. Gemini chat remains outside the supported companion route; do not replace the bounded Claude fallback or require a paid upgrade. Antigravity is the Google computer route, not Gemini chat. 4. Make this Computer Setup skill and focused references available before their work starts. For a native install, inspect the selected harness's current official skill locations and discovery behavior, obtain the relevant approval, and verify discovery/invocation in the actual workspace. A supplied document can be used as context without being natively installed. Record name, source/version, scope/location and `native_discovered`, `context_only` or `not_tested` privately. Never spray copies into guessed global folders. 5. At the first computer session, make a short private intervention log available. Record significant attempts, observed results, cause hypotheses, approved repairs, verification, and beginner-unlikely expert rescues. Keep credentials and environment dumps out. Append corrections rather than rewriting historical reports. Full skill theory, a 25-skill bundle, orchestration and Phase 3 are not setup requirements. ## Keep the local viewer and email non-gating Follow the [Workbench lifecycle](https://starter.uppercut-labs.com/artifacts/progress-workbench/README.md) at entry: download the verified self-contained HTML beside canonical progress only when missing; preserve an existing customized file. The viewer is read-only and not a second progress database. With no filesystem, preserve portable state and hand it to the computer-capable harness. Ask once about missing development-account and notification-email preferences; explicit decline/deferral is enough to continue. Follow the progress guide for `choices.development_email` and `choices.service_auth`. Preserve legacy non-email overrides as sign-in notes. Never infer emails, change Git author identity, or grant Access merely from these preferences. A chosen private cloud-hosting route needs separate explicit Access identity confirmation. When Python is verified, start the local viewer independently of GitHub. Inspect port 8000 and reuse a listener only if its exact progress directory and loopback binding match; otherwise choose 8001 through 8010. Invoke the resolved interpreter with `-m http.server PORT --bind 127.0.0.1 --directory "ABS_PROGRESS_FOLDER"`. Record the managed process, binding, actual port and resume/stop action. Use a hidden window for a Windows background process. Never stop unrelated listeners or serve a broader workspace. Refresh after saves; direct-file mode needs the saved JSON selected again. Viewer failure never blocks other setup or graduation. A phone's localhost is not this server. Optional [Tailscale Serve access](https://starter.uppercut-labs.com/setup/private-workbench.md) requires separate approval and an isolated allowlisted snapshot, not a proxy to this repository-root listener. Later [Cloudflare Access hosting](https://starter.uppercut-labs.com/setup/workbench-publishing.md) is a different optional route, lower priority than instant-app deployment extra credit. Neither is required. ## Inspect, approve, install, verify, checkpoint 1. Inspect OS/version/architecture, native versus WSL context, selected harness, permissions, command resolution, installed versions, and prior results. Use [Windows](https://starter.uppercut-labs.com/setup/windows.md), [macOS](https://starter.uppercut-labs.com/setup/macos.md), or best-effort [Linux](https://starter.uppercut-labs.com/setup/linux.md). Classify each capability as working, missing, failed or not tested. Reuse the [Codex readiness checkpoint](https://starter.uppercut-labs.com/setup/codex-readiness.md); recheck only facts affected by a material context change. 2. Reuse healthy compatible installations. For missing tools compare the verified package-manager route with a supported vendor binary/installer, including provenance, signatures/checksums when published, updates, dependencies and repair. Resolve current supported versions at execution time. Avoid source compilation when a supported binary fits. Homebrew/WinGet are good options, not ceremony when direct tooling already supplies the baseline. 3. Explain the necessary batch and obtain approval, honoring existing authorization. Optional packs are separate. Execute dependencies in order using recoverable managed jobs; do not run conflicting installers together, stop OS installation daemons, bypass security, or reinstall everything to fix one command. 4. Prioritize Git and GitHub CLI when their prerequisites work. Follow [authentication and Git privacy](https://starter.uppercut-labs.com/setup/authentication.md). As soon as appropriately scoped GitHub write access exists, create or confirm the private progress repository and save an intended nonsecret commit. Verify remote files, revision and private visibility. An existing approved connector may save earlier, but does not waive baseline Git/gh. A failed save retains local/portable work and blocks claiming the private-save outcome, not independent setup. 5. Verify the selected harness in its intended workspace and the [required IDE](https://starter.uppercut-labs.com/setup/ide.md): Codex/Claude Code use VS Code; Antigravity agent application and Antigravity IDE are checked separately; Cursor's desktop editor is sufficient. Preserve existing editors, settings, extensions and workspaces. 6. Verify every applicable baseline CLI in the current shell, a newly launched terminal, the IDE terminal and a real harness subprocess/task. Include later selected CLIs. Use [command-context evidence](https://starter.uppercut-labs.com/setup/tool-troubleshooting.md#command-resolution-in-each-context), not installer exit status. Python is required up front; use uv to discover a healthy interpreter or provision a supported one. Project-local dependencies resolve through their project runner, never global `node_modules/.bin` PATH entries. 7. Complete [networking and actual harness control](https://starter.uppercut-labs.com/setup/remote-access.md) plus [both file-transfer directions](https://starter.uppercut-labs.com/setup/file-transfer.md). Record computer connection, phone connection, intended device/network identity, phone-to-computer receipt, computer-to-phone receipt/opening, and actual phone-to-harness action independently. A native remote message cannot complete Taildrop; Tailscale alone cannot complete harness control. Preserve already successful checks and honest learner-reported evidence. 8. After each outcome update `setup/computer.json` and only the supported canonical progress outcomes. Save nonsecret install source/scope/architecture/version/path, context results, evidence source/time and the exact next action. Pause for sign-in, administrative prompts and necessary restarts; save before relaunch and inspect again on resume. Do not persist secrets. 9. Review the final state diff, save it to the intended private remote, and verify its revision and files. Do not make a commit merely to record its own SHA in another commit: keep verification externally in the session or next substantive save. If saving fails, retain local successes with an explicit pending remote-save action; do not claim durable completion or start Quick Build. ## Setup closeout and handoff Reconcile required setup outcomes against the current registry and their evidence. Do not infer missing checks from an old aggregate boolean, a file arriving, or historical phase completion. Preserve older graduation with its original revision; propose targeted follow-up rather than silently revoking it. Personal-state repairs require a separately reviewed, approved diff. When setup outcomes and the private save pass, proactively state that setup is ready. This is not Phase 2 graduation: the approved Quick Build, durable source, live main behavior and final private save still follow the registry. Stage the current [Quick Build skill](https://starter.uppercut-labs.com/skills/quick-build/current/SKILL.md) and its [plan](https://starter.uppercut-labs.com/artifacts/quick-build/PLAN.md), [spec](https://starter.uppercut-labs.com/artifacts/quick-build/SPEC.md) and [ticket](https://starter.uppercut-labs.com/artifacts/quick-build/TICKET.md) before their first use. Verify native discovery or label context-only delivery honestly. Do not add Phase 3 machinery as a gate. Return a compact handoff with canonical progress/private location, selected harness, resource revisions, verified outcomes, unfinished work, optional choices and the exact next action. No secrets and no claim of automatic cross-provider chat transfer. Preserve the one-round product interview and explicit build go-ahead. ## Reuse Codex readiness at milestones Reuse the [Codex readiness checkpoint](https://starter.uppercut-labs.com/setup/codex-readiness.md) at Computer Setup entry and closeout. A readiness check never installs Codex, starts login, or runs inference. Preserve prior results when the target is unchanged; recheck only affected facts after a material change. Do not repeat an answered offer. Keep a decline as `skipped` and a deferral as `deferred` with one recovery action; continue to Quick Build either way. After required setup outcomes and the private save pass, Codex users who have not declined may choose the optional local [Programmatic Harness proof](https://starter.uppercut-labs.com/setup/programmatic-harness.md). Offer it only when the compatible adapter and reusable skill are released at pinned versions. The learner's explicit opt-in authorizes the documented checksum-verified reusable skill install; follow the skill's approval rules for any additional project changes. Load the released `programmatic-harness` skill from the skills repository and follow its exact project-local install command and proof. The Codex route uses managed ChatGPT sign-in with an eligible ChatGPT plan; it does not require an OpenAI Platform API key or API billing. Cloud usage is a separate opt-in. Keep Cursor and cloud workflows deferred until their own compatible routes are released. A decline, deferral, failure, or unavailable release preserves setup completion and hands directly to Quick Build. Record only normalized local/cloud proof outcomes under `artifacts.programmatic_harness`. Never save credentials, raw provider output, private planning URLs, or raw session/turn IDs. Local and cloud proof are independent evidence; neither changes the Phase 2 gate. Selected Docker Desktop is conditional and installed last; OrbStack is excluded. For pnpm approvals, runtime/module errors, Docker or Rosetta, use [bounded troubleshooting](https://starter.uppercut-labs.com/setup/tool-troubleshooting.md); do not apply those fixes universally.
Skill instructions
Supporting instructions
content/workbench-steps.json
{
"version": "0.2.0",
"requirements_revision": "2026-10-09",
"phases": {
"phase-1": {
"gate": {
"all_of": [
"primary-ai-phone-app",
"github-mobile",
"core-accounts",
"instant-build"
]
},
"optional": [
"phase-1-deployment-extra-credit"
]
},
"phase-2": {
"gate": {
"all_of": [
"computer-setup",
"private-progress-repository",
"phase-2-remote-baseline",
"quick-build",
"live-deployment",
"final-progress-save"
]
},
"optional": [
"development-email",
"progress-workbench",
"workbench-publishing-extra-credit",
"programmatic-harness"
]
},
"phase-3": {
"preview": true
}
},
"groups": {
"core-account-services": {
"title": "Core development accounts",
"semantics": "all_of",
"members": [
"github",
"cloudflare",
"neon",
"instant-builder"
]
},
"instant-builder-choice": {
"title": "One instant builder",
"semantics": "any_of",
"members": [
"google-ai-studio",
"lovable",
"replit",
"base44"
]
},
"computer-baseline": {
"title": "Computer and editor baseline",
"semantics": "all_of",
"members": [
"selected-agentic-harness",
"selected-ide",
"system-cli-baseline",
"cli-contexts"
]
},
"phase-2-remote-baseline": {
"title": "Private network, file movement, and harness control",
"semantics": "all_of",
"members": [
"tailscale-network",
"phone-to-computer-file",
"computer-to-phone-file",
"verified-phone-connection"
]
},
"tailscale-devices-and-network": {
"title": "Both devices and private network identity",
"semantics": "all_of",
"members": [
"tailscale-computer",
"tailscale-phone",
"private-network-identity"
]
}
},
"steps": {
"get-started": {
"title": "Start with your agent",
"phase": "phase-1",
"requirement": "recommended",
"gate_for": [],
"prerequisites": [],
"evidence": [
"learner_report",
"agent_observation"
],
"guide": "/agent/start.md",
"completion_meaning": "The companion has begun or resumed from the learner's actual progress, with one useful next action."
},
"primary-ai-phone-app": {
"title": "Your AI phone app",
"phase": "phase-1",
"requirement": "required",
"gate_for": [
"phase-1"
],
"prerequisites": [],
"evidence": [
"learner_report"
],
"guide": "/phases/1",
"completion_meaning": "The selected primary AI phone companion app is signed in and can complete a useful chat interaction."
},
"github-mobile": {
"title": "GitHub on your phone",
"phase": "phase-1",
"requirement": "required",
"gate_for": [
"phase-1"
],
"prerequisites": [],
"evidence": [
"learner_report"
],
"guide": "/phases/1",
"completion_meaning": "GitHub Mobile is installed and signed in to the intended GitHub account."
},
"github": {
"title": "GitHub account",
"phase": "phase-1",
"requirement": "required",
"gate_for": [
"phase-1"
],
"prerequisites": [],
"evidence": [
"learner_report"
],
"guide": "/phases/1",
"internal": true,
"completion_meaning": "The learner can sign in to the intended GitHub account; a working existing account counts."
},
"cloudflare": {
"title": "Cloudflare account",
"phase": "phase-1",
"requirement": "required",
"gate_for": [
"phase-1"
],
"prerequisites": [],
"evidence": [
"learner_report"
],
"guide": "/phases/1",
"internal": true,
"completion_meaning": "The learner can sign in to the intended Cloudflare account; deployment is not required here."
},
"neon": {
"title": "Neon account",
"phase": "phase-1",
"requirement": "required",
"gate_for": [
"phase-1"
],
"prerequisites": [],
"evidence": [
"learner_report"
],
"guide": "/phases/1",
"internal": true,
"completion_meaning": "The learner can sign in to the intended Neon account; an existing account or supported OAuth sign-in counts."
},
"instant-builder": {
"title": "One instant builder",
"phase": "phase-1",
"requirement": "required",
"gate_for": [
"phase-1"
],
"prerequisites": [],
"completion": {
"any_of": [
"instant-builder-choice"
]
},
"evidence": [
"learner_report"
],
"guide": "/phases/1",
"internal": true,
"completion_meaning": "One selected instant builder is usable. A clear direct record of this chosen capability counts without fabricating which alternative was used or requiring the other builders.",
"allow_recorded_completion": true
},
"google-ai-studio": {
"title": "Google AI Studio",
"phase": "phase-1",
"requirement": "optional",
"gate_for": [
"phase-1"
],
"prerequisites": [],
"evidence": [
"learner_report"
],
"guide": "/recommendations",
"internal": true,
"completion_meaning": "If selected, Google AI Studio is signed in and ready to create the instant app; other builder alternatives are not required."
},
"lovable": {
"title": "Lovable",
"phase": "phase-1",
"requirement": "optional",
"gate_for": [
"phase-1"
],
"prerequisites": [],
"evidence": [
"learner_report"
],
"guide": "/recommendations",
"internal": true,
"completion_meaning": "If selected, Lovable is signed in and ready to create the instant app; other builder alternatives are not required."
},
"replit": {
"title": "Replit",
"phase": "phase-1",
"requirement": "optional",
"gate_for": [
"phase-1"
],
"prerequisites": [],
"evidence": [
"learner_report"
],
"guide": "/recommendations",
"internal": true,
"completion_meaning": "If selected, Replit is signed in and ready to create the instant app; other builder alternatives are not required."
},
"base44": {
"title": "Base44",
"phase": "phase-1",
"requirement": "optional",
"gate_for": [
"phase-1"
],
"prerequisites": [],
"evidence": [
"learner_report"
],
"guide": "/recommendations",
"internal": true,
"completion_meaning": "If selected, Base44 is signed in and ready to create the instant app; other builder alternatives are not required."
},
"core-accounts": {
"title": "Your development accounts",
"phase": "phase-1",
"requirement": "required",
"gate_for": [
"phase-1"
],
"prerequisites": [],
"completion": {
"all_of": [
"core-account-services"
]
},
"evidence": [
"learner_report",
"agent_check",
"legacy_record"
],
"guide": "/phases/1",
"completion_meaning": "GitHub, Cloudflare, Neon and one instant builder are ready. A completed historical aggregate can count with its provenance without inventing missing child records; explicit contradictory evidence needs reconciliation.",
"allow_recorded_completion": true
},
"instant-build": {
"title": "Make one app that works",
"phase": "phase-1",
"requirement": "required",
"gate_for": [
"phase-1"
],
"prerequisites": [
"instant-builder"
],
"evidence": [
"learner_report",
"agent_check"
],
"guide": "/phases/1",
"completion_meaning": "One instant app performs an observable intended behavior on the learner's phone. Source publication, a desktop, a private progress repository and deployment are not required."
},
"phase-1-deployment-extra-credit": {
"title": "Publish your instant build (extra credit)",
"phase": "phase-1",
"requirement": "optional",
"gate_for": [],
"prerequisites": [
"instant-build"
],
"evidence": [
"learner_report",
"agent_check"
],
"guide": "/setup/mobile-deployment.md",
"completion_meaning": "If the learner chooses this extra credit, the instant app is published and its intended behavior is checked at the chosen public URL; declining does not block Phase 1."
},
"computer-setup": {
"title": "Set up your computer",
"phase": "phase-2",
"requirement": "required",
"gate_for": [
"phase-2"
],
"prerequisites": [],
"completion": {
"all_of": [
"computer-baseline"
]
},
"evidence": [
"agent_check",
"learner_report"
],
"guide": "/skills/computer-setup/current/SKILL.md",
"completion_meaning": "All current-revision computer-baseline children are verified: selected harness, appropriate IDE, required system tools and command resolution in every intended context. A summary-only completion cannot waive a missing child."
},
"selected-agentic-harness": {
"title": "Selected agentic harness",
"phase": "phase-2",
"requirement": "required",
"gate_for": [
"phase-2"
],
"prerequisites": [],
"evidence": [
"agent_check"
],
"guide": "/setup/ide.md",
"internal": true,
"completion_meaning": "The selected primary harness is installed, signed in and can perform a harmless action in the intended local workspace; an editor extension alone does not substitute for the selected agent surface."
},
"selected-ide": {
"title": "Selected editor",
"phase": "phase-2",
"requirement": "required",
"gate_for": [
"phase-2"
],
"prerequisites": [
"selected-agentic-harness"
],
"evidence": [
"agent_check",
"learner_report"
],
"guide": "/setup/ide.md",
"internal": true,
"completion_meaning": "The appropriate IDE opens the workspace for human file and Markdown inspection: VS Code for Codex or Claude Code, Antigravity IDE separately from its agent app, or the existing Cursor editor for Cursor."
},
"system-cli-baseline": {
"title": "System command baseline",
"phase": "phase-2",
"requirement": "required",
"gate_for": [
"phase-2"
],
"prerequisites": [],
"evidence": [
"agent_check"
],
"guide": "/setup/computer-setup.manifest.json",
"internal": true,
"completion_meaning": "The required supported computer tools, including Python, are usable. Reuse healthy installations; a specific package manager, Docker or optional media tools are not independent gates."
},
"private-progress-repository": {
"title": "Save progress to your private repository",
"phase": "phase-2",
"requirement": "required",
"gate_for": [
"phase-2"
],
"prerequisites": [],
"evidence": [
"agent_check",
"remote_check"
],
"guide": "/artifacts/progress/README.md",
"completion_meaning": "An intended progress commit has actually reached the learner's intended private GitHub repository, with account, visibility and saved remote revision checked. Perform this early when Git and authentication are ready; completing the entire setup is not a prerequisite."
},
"development-email": {
"title": "Choose development email preferences",
"phase": "phase-2",
"requirement": "optional",
"gate_for": [],
"prerequisites": [],
"evidence": [
"learner_report"
],
"guide": "/artifacts/progress/README.md",
"completion_meaning": "If volunteered, distinct email and sign-in preferences are recorded without inferring identity or reuse permission. Omission, deferral or refusal does not block work or graduation."
},
"progress-workbench": {
"title": "Open your Progress Workbench",
"phase": "phase-2",
"requirement": "recommended",
"gate_for": [],
"prerequisites": [],
"evidence": [
"agent_check"
],
"guide": "/artifacts/progress-workbench/README.md",
"completion_meaning": "If chosen, a private read-only Workbench displays the learner's progress without overwriting a customized copy; its absence or failure does not block setup, saving or graduation."
},
"tailscale-network": {
"title": "Verify private Tailscale networking",
"phase": "phase-2",
"requirement": "required",
"gate_for": [
"phase-2"
],
"prerequisites": [],
"evidence": [
"agent_check",
"learner_report"
],
"guide": "/setup/remote-access.md",
"completion_meaning": "Both device readiness records and the intended private-network identity and connectivity check are verified. A summary-only record cannot replace these independent outcomes.",
"completion": {
"all_of": [
"tailscale-devices-and-network"
]
}
},
"phone-to-computer-file": {
"title": "Send a file from your phone to your computer",
"phase": "phase-2",
"requirement": "required",
"gate_for": [
"phase-2"
],
"prerequisites": [
"tailscale-network"
],
"evidence": [
"agent_check",
"learner_report"
],
"guide": "/setup/file-transfer.md",
"completion_meaning": "A benign artifact sent from the phone is actually received at the computer's client-specific inbox and located and read by the agent. A send notification alone does not prove receipt; do not automatically execute or extract an arriving archive."
},
"computer-to-phone-file": {
"title": "Open a returned file on your phone",
"phase": "phase-2",
"requirement": "required",
"gate_for": [
"phase-2"
],
"prerequisites": [
"tailscale-network"
],
"evidence": [
"learner_report"
],
"guide": "/setup/file-transfer.md",
"completion_meaning": "A benign result sent from the computer is received and opened on the intended phone. Record this direction independently from phone-to-computer receipt and preserve either successful direction if the other fails."
},
"verified-phone-connection": {
"title": "Connect from your phone",
"phase": "phase-2",
"requirement": "required",
"gate_for": [
"phase-2"
],
"prerequisites": [
"selected-agentic-harness"
],
"evidence": [
"learner_report",
"agent_check"
],
"guide": "/setup/remote-access.md",
"completion_meaning": "One real phone-to-harness interaction performs a harmless action in the selected computer session through the selected supported route. A phone chatbot login, Tailscale connection or file transfer alone cannot satisfy harness control; native harness control can pass independently of them."
},
"quick-build": {
"title": "Shape and build your project",
"phase": "phase-2",
"requirement": "required",
"gate_for": [
"phase-2"
],
"prerequisites": [
"computer-setup",
"private-progress-repository",
"phase-2-remote-baseline"
],
"evidence": [
"agent_check",
"learner_report",
"remote_check"
],
"guide": "/skills/quick-build/current/SKILL.md",
"completion_meaning": "The harness has built the learner-approved meaningful project after the explicit go decision, with its intended main flow working and durable source saved to the intended source repository. A disposable demo, build-only pass or progress repository without project source is insufficient."
},
"live-deployment": {
"title": "Verify your live project",
"phase": "phase-2",
"requirement": "required",
"gate_for": [
"phase-2"
],
"prerequisites": [
"quick-build"
],
"evidence": [
"agent_check",
"learner_report"
],
"guide": "/skills/quick-build/current/SKILL.md",
"completion_meaning": "The intended deployed application performs its primary user behavior at the live URL, with clear agent-tested or learner-reported evidence and target-device gaps stated honestly. HTTP 200, a login page, a screenshot or a successful build alone is not behavioral verification."
},
"workbench-publishing-extra-credit": {
"title": "Publish your private Workbench (extra credit)",
"phase": "phase-2",
"requirement": "optional",
"gate_for": [],
"prerequisites": [
"progress-workbench"
],
"evidence": [
"agent_check",
"learner_report"
],
"guide": "/setup/private-workbench.md",
"completion_meaning": "If explicitly chosen, an isolated allowlisted Workbench view is reachable by its intended audience and its access boundary and denied private paths are verified. Do not claim untested access, overwrite customizations, expose the repository or reset unrelated routes."
},
"phase-2-project": {
"title": "Historical Phase 2 project record",
"phase": "phase-2",
"requirement": "recommended",
"gate_for": [],
"prerequisites": [],
"evidence": [
"legacy_record"
],
"guide": "/phases/2",
"legacy": true,
"completion_meaning": "Preserve this historical aggregate and its evidence as recorded activity, not an automatic alias for Quick Build, verified live behavior or the final private progress save."
},
"cli-contexts": {
"title": "Commands work in the intended contexts",
"phase": "phase-2",
"requirement": "required",
"gate_for": [
"phase-2"
],
"prerequisites": [
"selected-agentic-harness",
"selected-ide",
"system-cli-baseline"
],
"evidence": [
"agent_check"
],
"guide": "/skills/computer-setup/current/SKILL.md",
"internal": true,
"completion_meaning": "Each relevant CLI resolves in the current shell, a fresh terminal, the IDE terminal and the actual harness subprocess. Repeat this per-tool check for later additions; native and WSL contexts stay distinct, and project-local tools use their project runner without global .bin PATH entries."
},
"tailscale-computer": {
"title": "Tailscale on your computer",
"phase": "phase-2",
"requirement": "required",
"gate_for": [
"phase-2"
],
"prerequisites": [],
"evidence": [
"agent_check",
"learner_report"
],
"guide": "/setup/remote-access.md",
"internal": true,
"completion_meaning": "Tailscale is installed, signed in and active on the intended computer; installation alone or phone-side readiness does not prove this device is connected."
},
"tailscale-phone": {
"title": "Tailscale on your phone",
"phase": "phase-2",
"requirement": "required",
"gate_for": [
"phase-2"
],
"prerequisites": [],
"evidence": [
"learner_report",
"agent_observation"
],
"guide": "/setup/remote-access.md",
"internal": true,
"completion_meaning": "Tailscale is installed, signed in and active on the intended phone. A clear learner report counts with its provenance and does not imply a file-transfer or harness-control test occurred."
},
"private-network-identity": {
"title": "Verify the intended private network",
"phase": "phase-2",
"requirement": "required",
"gate_for": [
"phase-2"
],
"prerequisites": [
"tailscale-computer",
"tailscale-phone"
],
"evidence": [
"agent_check",
"learner_report"
],
"guide": "/setup/remote-access.md",
"internal": true,
"completion_meaning": "The intended phone and computer identities are confirmed on the intended private Tailscale network and permitted private connectivity is verified. Tailnet membership alone does not prove an owner-only access boundary or either file-transfer direction."
},
"final-progress-save": {
"title": "Save your completed work",
"phase": "phase-2",
"requirement": "required",
"gate_for": [
"phase-2"
],
"prerequisites": [
"computer-setup",
"private-progress-repository",
"phase-2-remote-baseline",
"quick-build",
"live-deployment"
],
"evidence": [
"agent_check",
"remote_check"
],
"guide": "/artifacts/progress/README.md",
"completion_meaning": "The final reconciled progress, actual evidence and completion record have reached the intended private GitHub repository and the saved remote revision is verified. Preserve local success and mark this save pending on push failure; an earlier setup save is not the final save. Repeat closeout without empty commits or storing the containing commit's own SHA recursively."
},
"programmatic-harness": {
"title": "Programmatic Harness (optional)",
"phase": "phase-2",
"requirement": "optional",
"gate_for": [],
"prerequisites": [
"computer-setup"
],
"evidence": [
"agent_check"
],
"guide": "/phases/2",
"completion_meaning": "After explicit opt-in and a compatible released workflow, a local two-turn file proof passes with the same session resumed. Record only normalized evidence in artifacts.programmatic_harness. Cloud proof is separate; absence, decline, deferral or failure never blocks Quick Build or graduation. This activity is preparation until the compatible adapter and reusable skill are released."
}
},
"aliases": {
"instant-app": "instant-build"
}
}
Skill instructions
Supporting instructions
public/artifacts/progress/README.md
# Your private progress repository
Version: 0.2.0. Updated October 9, 2026. Your companion keeps this record for you; the website does not store it. During Phase 1 and the start of Phase 2 Computer Setup, use existing local or portable progress. A private repository is not required to graduate Phase 1 or begin installing the tools that enable GitHub access.
## Read progress in the local Workbench
At Computer Setup start, follow the [Workbench lifecycle](https://starter.uppercut-labs.com/artifacts/progress-workbench/README.md) to place the downloadable [index.html](https://starter.uppercut-labs.com/artifacts/progress-workbench/index.html) beside the existing canonical `starter-progress.json`. Create the HTML only if missing; preserve a customized viewer and existing progress, including unknown fields. The same progress file remains the source of truth. Do not make a second JSON state for the local view.
As soon as Python is verified, serve this exact absolute progress folder using the resolved interpreter with `-m http.server PORT --bind 127.0.0.1 --directory ABS_PROGRESS_FOLDER`. Use port 8000 first, then 8001 through 8010 if occupied. Inspect a running listener before reuse: it must serve the correct directory over loopback. Keep unrelated processes running, never expose a broader workspace or bind to the LAN, and follow the lifecycle for launch verification, process records, resume, and stop behavior. This is a private local view; the phone's localhost cannot address the computer's server.
After the agent saves progress, refresh the Workbench or allow the visible HTTP view to reload data on its five-second polling cycle. In file mode, select the saved JSON again to reload it. The Workbench is the default visualization, works before GitHub is ready, and never counts as a completion milestone or blocks a phase.
Hosting a protected copy is optional later work, lower priority than deploying the learner's instant app for extra credit. Follow [Workbench publishing](https://starter.uppercut-labs.com/setup/workbench-publishing.md), confirm the Access email, and publish only its allowlisted snapshot. Never upload the private progress repository root as a website.
## Remember account details once
After confirming the phone companion and GitHub Mobile, offer one optional checkpoint for the learner's GitHub username, development account email and any existing service handles they want remembered. Reuse details they already supplied. This checkpoint is not a completion requirement, and declining it does not stop setup.
Store confirmed handles in `artifacts.account_profile` with `github_username` (string or null), `service_usernames` (an object keyed by service), `status` (`recorded`, `declined` or `deferred`), and `notes` (an array). Preserve unknown fields and existing service handles when merging. Do not ask the intake again after a recorded decision; clarify a missing value only when the current task needs it.
Keep the primary development email in the existing `choices.development_email.account_email` field, not a second copy in the profile. A supplied development email does not automatically authorize using it for notifications or Cloudflare Access. At Computer Setup, ask only for still-unaddressed email purposes. Never infer identity from an example or from the author's account. These are personal details: keep them in private or portable learner progress, never in the public app or a public example. Passwords, tokens and recovery codes do not belong in this record.
## Record development email choices
At Computer Setup entry, ask one concise question if these choices are missing and have not already been declined or deferred: "Which email should we use for development accounts and notifications? You can use the same address for both." Store only values the learner explicitly confirms. Do not infer an email from Git author settings, change Git identity, or assume account and notification addresses match.
Merge this object into `choices.development_email`, preserving other choices and existing fields:
```json
{
"account_email": null,
"notification_email": null,
"access_email": null,
"service_overrides": {},
"notes": []
}
```
The account email is the default for development-service accounts; the notification email is the default destination for service notices. They may be the same with explicit confirmation. Preserve legacy string-valued `service_overrides` exactly, even when a value is a sign-in description rather than an email. Display a non-email value as a sign-in note, never an email link. Unanswered choices may remain null or absent; note a decline or deferral so another session does not ask again unnecessarily. These choices never block the curriculum. Ask about reusing an address for Access only when an optional protected deployment is relevant, then save the confirmed `access_email`. Keep real addresses in private learner progress, never public source or examples.
For new sign-in metadata, use `choices.service_auth` instead of putting OAuth descriptions into email fields. This synthetic fragment separates method, provider, handle, and confirmed email:
```json
{
"service_auth": {
"neon": {
"method": "oauth",
"provider": "github",
"account_handle": "example-learner",
"account_email": null,
"source": "learner_report"
}
}
}
```
An OAuth provider or handle does not establish an email address. Migrate a legacy description only when its meaning is explicit or the learner confirms it; otherwise retain it unchanged and leave the method unknown. Real `account_email`, `notification_email`, and `access_email` values must still be valid emails or null. Permission for one purpose does not authorize another.
## Move progress to GitHub during setup
As soon as authenticated GitHub write access is ready, create or confirm a private progress repository and save the existing state there. Computer Setup installs and authenticates Git and GitHub CLI when needed. If connected GitHub tools already provide the required access, use them immediately while completing the computer baseline separately.
Verify the target owner and private visibility before uploading. Reuse an existing private progress repository and reconcile its latest state with the local checkpoint; do not replace completed work with an empty template or overwrite newer remote changes. If the intended repository is public, choose or create a private progress repository rather than publishing progress there.
Before the first intended commit/push, follow the [authentication guide](https://starter.uppercut-labs.com/setup/authentication.md). Check the account and Git author identity without printing secrets. If needed, propose the learner's actual account-specific noreply address as a repository-local choice and obtain approval. Keep global Git identity and GitHub email protection unchanged; do not disable protection or rewrite shared history to bypass GH007. Prefer supported provider sign-in/consent rather than a phone credentials-file workaround.
Review the nonsecret files and actual diff, commit and push them, or save a commit through connected tools. Confirm the resulting revision and files on GitHub. Record the repository URL, branch, and checked result in the `private-progress-repository` step's notes; mark it completed only after the remote save succeeds. A local commit or empty private repository is not enough. Save the latest progress and setup results again before leaving Computer Setup. Keep this initial durable checkpoint distinct from `final-progress-save`, which confirms the Phase 2 closeout is saved too.
If authentication, repository creation, or remote saving fails, keep local or portable state with an exact resume action. Independent setup can continue and completed capability checks remain completed, but Quick Build must not begin until its canonical prerequisites, including private remote progress, are confirmed. On resume, inspect what succeeded and continue from that point.
## Create the template
1. Prepare a local progress folder, or reuse the existing one. Save this README there and use the [empty progress file](https://starter.uppercut-labs.com/artifacts/progress/starter-progress.json) as `starter-progress.json` only when no progress exists. Preserve existing progress if resuming.
2. Initialize missing `setup/computer.json` from the [setup state template](https://starter.uppercut-labs.com/setup/state.example.json). Use the [ignore template](https://starter.uppercut-labs.com/artifacts/progress/gitignore.txt) for `.gitignore`, preserving existing rules and setup results.
3. Create `artifacts/` for your nonsecret project notes and links. Keep this folder locally until GitHub access is ready, then follow the remote-save steps above. With no filesystem access, provide downloadable or copyable state until it can be saved to a computer.
The [schema](https://starter.uppercut-labs.com/schemas/starter-progress.schema.json) defines the format. The [safe example](https://starter.uppercut-labs.com/artifacts/progress/starter-progress.example.json) shows a phone session in progress; the [completed Phase 1 example](https://starter.uppercut-labs.com/artifacts/progress/starter-progress.completed-phase-1.example.json) illustrates a synthetic phone-only closeout. Examples are not evidence about a learner. Use actual timestamps when saving, and keep `starter_pack_version` associated with the resources you used.
## Requirements and older records
Read the [canonical requirements](https://starter.uppercut-labs.com/agent/requirements.json), or the matching generated definitions in a supplied packet. This release uses version `0.2.0` and requirements revision `2026-10-09`. Evaluate only the relevant phase's gate and its referenced groups, prerequisites, completion meanings, and accepted evidence. `all_of` means every member; `any_of` means a qualifying choice, not all alternatives. These are registry expressions, not JSON Schema validation keywords. Do not infer gates from labels, counts, or optional preferences or maintain a separate curriculum checklist.
Retain the original data while reconciling known IDs:
- `instant-app` is an alias for `instant-build`; keep original notes and provenance without counting it twice.
- `authenticator` is a retired Phase 1 checkpoint, **not a current requirement**. Preserve older learner records without turning this historical step into a gate, blocker, or repeated prompt. Provider-specific account verification is handled privately through the provider's supported flow.
- `github`, `cloudflare`, `neon`, and `instant-builder` belong to the core-account group. A completed historical `core-accounts` aggregate can be recognized without fabricating missing child records. Explicit conflicting child evidence needs reconciliation, not an automatic pass.
- `phase-2-project` is a historical aggregate, not an alias for both `quick-build` and `live-deployment`. Carry its evidence forward; ask only for genuinely missing behavior evidence. A URL or HTTP 200 alone is insufficient.
- Keep unknown steps and fields. A custom step with a valid phase belongs there; an unassigned one remains additional work, not a new gate. Retain conflicting aliases/duplicates and surface the conflict instead of overwriting whichever timestamp is older.
Keep recorded activity counts distinct from required outcomes. A selected builder does not leave every alternative unfinished. Omitted or declined email choices and an unavailable Workbench do not block setup or graduation. Network readiness, Tailscale on each device, each file direction, and actual harness control have independent evidence. `environment.remote_access_ready` reflects verified harness interaction, not just an installed network client. A learner correction about one device is not proof of an untested transfer.
## Close a phase without waiting to be asked
Run this protocol after the last apparent required outcome, at session close, and on resume. Do it quietly; do not invent a new graduation ceremony for the learner.
1. Load the journey's requirements revision and current phase definitions. Reconcile aliases and existing evidence. Clear learner reports count as reports; do not claim to have performed their tests. If the needed definitions are unavailable, use the matching supplied packet or exact fallback resources, not guessed requirements.
2. Resolve only missing or conflicting required outcomes. Ask one focused question if evidence is needed. Do not repeat successful tests or answered/declined optional intake.
3. Reconcile `phase.status`, `choices.workbench.next_step_id`, resolved step `blocker`/`next_action` fields, and any legacy `artifacts.next_action`. Remove a stale required pointer to completed work; preserve unresolved optional work as optional. Keep setup capability state and `environment.remote_access_ready` consistent with their own evidence. Preserve historical notes and unknown data.
4. Prepare an updated full record and a history entry in `artifacts.phase_history`, an array. Each newly confirmed completion uses `phase`, `status: "completed"`, `requirements_revision`, actual `recorded_at`, concise `evidence_summary`, and `source`. Keep `phase.current` on the completed phase until the learner chooses the next one. Use actual observed completion times; omit unknown old times instead of inventing them.
5. Validate writer output against the schema before saving. Use a temporary sibling file and atomic replacement when the filesystem supports it, preserving the previous valid record if validation or writing fails. In phone chat without filesystem access, return the entire updated JSON as a download or copyable block; a patch fragment or hidden chat memory is not a portable save. Say that the learner must retain the file, not that an inaccessible disk or repository was updated.
6. For Phase 2, complete the final private save protocol below before announcing durable completion. Phase 1 never requires a private repository, desktop, Workbench, email preferences, or deployment. If a private repository is already available and saving is authorized, preserve the closeout there too without turning a temporary save failure into a new Phase 1 gate.
7. State completion plainly, identify where progress is actually saved, and offer the next phase or a stopping point without beginning it automatically. Phase 3 is a preview, not an automatically certifiable graduation.
### History and repeat checks
Do not append a second completed entry for the same phase and requirements revision, reset counters, repeat celebrations, or commit an empty diff on resume. Reconcile stale pointers once, then return the existing outcome. `phase.current` being numerically later does not prove an earlier graduation.
An older valid graduation retains its original requirements revision, evidence, and recorded time. If the revision or completion time was never recorded, leave it unknown and explain that provenance; never backfill today's revision as if it governed the old journey. Newly introduced requirements are a targeted update checklist, not grounds to silently revoke historical completion or restart the build. On an explicitly chosen next phase, evaluate that phase's current requirements.
Repairs to actual private learner state are a separate authorized operation: preserve originals and reports, reconcile remote changes, propose a dated correction with a reviewable diff, and apply only after approval. Keep learner-reported corrections distinct from independent tests. Product examples do not authorize repairing personal state.
### Final private save and interruption
`private-progress-repository` establishes the earlier private remote checkpoint. `final-progress-save` is the later confirmation that the intended final progress and setup/closeout files have reached that private remote. An earlier push alone cannot pass this final outcome.
Review the target owner, visibility, latest remote state, and intended diff. Prepare the final completion candidate with the already-observed evidence, then commit/push the intended files and verify that exact revision and file contents remotely. Treat the candidate as pending until that verification succeeds; do not announce completion just because a local candidate says completed. A progress file may cite a previously observed revision; report the final SHA outside the file. Do not keep rewriting the file to contain its own commit SHA.
If the final save fails or its result is uncertain, retain the build, source, live-test evidence, and local checkpoint. Keep `final-progress-save` in progress with an exact nonsecret blocker and recovery action, and keep the current unconfirmed phase closeout in progress. Retain the proposed completion evidence under `artifacts.pending_closeout` if useful; do not append an unconfirmed completed history entry. If a completion candidate was already written locally, restore only that candidate's pending status and retain its evidence. Never revoke a previously verified historical completion. Tell the learner what is saved locally and what is not yet confirmed on GitHub.
On resume, first check whether the attempted save actually reached the remote; reconcile the observed candidate and local pending state before retrying. Once saved and verified, keep one confirmed completion entry and clear the pending action. Do not rebuild, replay unrelated successful checks, lose the original reports, or enter an empty-commit/recursive-SHA loop.
## Handoff and lightweight session notes
Before switching devices or agents, provide canonical progress or its private location, completed required outcomes, genuine blockers, selected optional branches, the computer harness separately from the phone companion, one exact next action, and the schema/resource/requirements revisions with focused references. Preserve answered or declined choices. A new agent must inspect and merge the existing record; chats do not automatically transfer across providers.
Make the companion available in Phase 1, Computer Setup at setup entry, and Quick Build plus its planning templates before the Phase 2 interview. Record the source/version used and whether a skill is supplied as `context_only` or confirmed `native_discovered` using the harness's supported discovery behavior. Copying Markdown into an arbitrary directory is not installation proof. Full skill theory, large engineering bundles, and AFK orchestration remain optional later work.
At the first harness build, keep a short private Markdown session report. For consequential friction, record the date and relevant OS/harness/resource versions, attempted action, observed result, cause hypothesis labeled as a hypothesis, workaround, actual verification, and unresolved next action. Mark an `expert_intervention` when a beginner likely could not devise the rescue, and whether it should become general guidance. Use `not_tested` when evidence is absent. Append later corrections; do not rewrite old reports or describe ordinary Git history as tamper-proof. No logging service is required and no secrets belong in the report.
## Step statuses
- `not_started`: no work has begun.
- `in_progress`: work began and still needs action.
- `completed`: the stated completion condition was met; notes identify learner reports or agent checks accurately.
- `skipped`: the learner declined an optional action.
- `deferred`: work is saved for later, with a resume point.
- `not_applicable`: a conditional branch does not apply, with the reason recorded.
Required steps marked deferred, skipped, or not applicable do not count as complete. Overall phase status is `not_started`, `in_progress`, or `completed`. Phase 3 remains a curriculum preview.
Phase 1 deployment is extra credit. If offered, record it as `phase-1-deployment-extra-credit`: `skipped` when declined, `deferred` when accepted but postponed, or `completed` only after the live app's main action is verified. Keep the route, destination, visibility decision, and live link in nonsecret notes. Skipped or deferred extra credit does not prevent Phase 1 completion and does not satisfy the Phase 2 project milestone.
## What to record
Keep nonsecret choices, completed actions, project links, blockers, and the next action. Never store passwords, API keys, access tokens, recovery codes, cookies, connection strings, private keys, or environment-file contents. Store credentials in a password manager or the provider's supported secret store. A private repository still needs this boundary.
On a failed step, keep prior progress and record the safe resume point. On a new session, load the existing file instead of resetting it. With no filesystem access, provide the learner the updated JSON to copy or download. Before each commit, inspect the actual diff; ignore rules are only a first filter.
Skill instructions
Supporting instructions
public/schemas/starter-progress.schema.json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://starter.devthomas.site/schemas/starter-progress.schema.json",
"title": "Starter Pack Progress",
"type": "object",
"required": [
"schema_version",
"starter_pack_version",
"phase",
"steps",
"updated_at"
],
"properties": {
"schema_version": {
"type": "integer",
"const": 1
},
"starter_pack_version": {
"type": "string"
},
"updated_at": {
"type": "string",
"format": "date-time"
},
"environment": {
"type": "object",
"properties": {
"device": {
"type": "string"
},
"os": {
"type": [
"string",
"null"
]
},
"harness": {
"type": [
"string",
"null"
]
},
"remote_access_ready": {
"type": "boolean"
}
},
"additionalProperties": true
},
"phase": {
"type": "object",
"required": [
"current",
"status"
],
"properties": {
"current": {
"enum": [
"phase-1",
"phase-2",
"phase-3"
]
},
"status": {
"enum": [
"not_started",
"in_progress",
"completed"
]
},
"requirements_revision": {
"type": "string"
},
"completed_at": {
"type": "string",
"format": "date-time"
}
},
"additionalProperties": true
},
"steps": {
"type": "object",
"additionalProperties": {
"type": "object",
"required": [
"status"
],
"properties": {
"phase": {
"enum": [
"phase-1",
"phase-2",
"phase-3"
]
},
"next_action": {
"type": "string"
},
"blocker": {
"type": "string"
},
"status": {
"enum": [
"not_started",
"in_progress",
"completed",
"skipped",
"deferred",
"not_applicable"
]
},
"updated_at": {
"type": "string",
"format": "date-time"
},
"notes": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": true
}
},
"choices": {
"type": "object",
"properties": {
"development_email": {
"type": "object",
"properties": {
"account_email": {
"type": [
"string",
"null"
],
"format": "email"
},
"notification_email": {
"type": [
"string",
"null"
],
"format": "email"
},
"access_email": {
"type": [
"string",
"null"
],
"format": "email"
},
"service_overrides": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"notes": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": true
},
"service_auth": {
"type": "object",
"additionalProperties": {
"type": "object",
"properties": {
"method": {
"type": "string"
},
"provider": {
"type": "string"
},
"account_handle": {
"type": [
"string",
"null"
]
},
"account_email": {
"type": [
"string",
"null"
],
"format": "email"
},
"source": {
"type": "string"
},
"notes": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": true
}
},
"workbench": {
"type": "object",
"properties": {
"learner_name": {
"type": "string"
},
"next_step_id": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": true
},
"artifacts": {
"type": "object",
"properties": {
"account_profile": {
"type": "object",
"properties": {
"github_username": {
"type": [
"string",
"null"
]
},
"service_usernames": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"status": {
"enum": [
"recorded",
"declined",
"deferred"
]
},
"notes": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": true
},
"phase_history": {
"type": "array",
"items": {
"type": "object",
"required": [
"phase",
"status",
"requirements_revision",
"source"
],
"properties": {
"phase": {
"enum": [
"phase-1",
"phase-2",
"phase-3"
]
},
"status": {
"enum": [
"not_started",
"in_progress",
"completed"
]
},
"recorded_at": {
"type": "string",
"format": "date-time"
},
"requirements_revision": {
"type": "string"
},
"evidence_summary": {
"type": "string"
},
"source": {
"type": "string"
}
},
"additionalProperties": true
}
},
"programmatic_harness": {
"$ref": "#/$defs/programmaticHarnessEvidence"
}
},
"additionalProperties": true
}
},
"additionalProperties": true,
"$defs": {
"programmaticHarnessEvidence": {
"type": "object",
"additionalProperties": false,
"required": [
"attempts"
],
"properties": {
"attempts": {
"type": "array",
"maxItems": 16,
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"provider",
"target",
"outcome"
],
"properties": {
"provider": {
"enum": [
"codex",
"cursor"
]
},
"target": {
"enum": [
"local",
"cloud"
]
},
"outcome": {
"enum": [
"not_tested",
"declined",
"deferred",
"partial",
"failed",
"passed"
]
},
"runtime_version": {
"type": "string",
"pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$",
"maxLength": 32
},
"auth_mode": {
"enum": [
"managed_chatgpt",
"provider_managed"
]
},
"verified_at": {
"type": "string",
"format": "date-time"
},
"first_file_verified": {
"type": "boolean"
},
"second_file_verified": {
"type": "boolean"
},
"same_session_resumed": {
"type": "boolean"
},
"next_action": {
"enum": [
"sign_in",
"update_runtime",
"retry_local",
"return_to_curriculum",
"await_release",
"separate_cloud_opt_in"
]
}
},
"allOf": [
{
"if": {
"properties": {
"provider": {
"const": "codex"
}
}
},
"then": {
"properties": {
"target": {
"const": "local"
},
"auth_mode": {
"const": "managed_chatgpt"
}
}
}
},
{
"if": {
"properties": {
"outcome": {
"const": "passed"
}
}
},
"then": {
"required": [
"verified_at",
"first_file_verified",
"second_file_verified",
"same_session_resumed"
],
"properties": {
"first_file_verified": {
"const": true
},
"second_file_verified": {
"const": true
},
"same_session_resumed": {
"const": true
}
}
}
}
]
}
}
}
}
}
}
Skill instructions
Supporting instructions
public/artifacts/progress-workbench/README.md
# Progress Workbench
Version: 0.2.0. A downloadable, read-only view of the learner's `starter-progress.json`. The Starter Pack website remains a shared guide; it never loads or personalizes itself with learner progress. The learner's agent writes the canonical JSON and uses the local Workbench as its default visual reference. No Starter Pack account, backend, browser storage, npm, or learner build step is needed.
## Assemble at the start of Computer Setup
1. Locate and preserve the learner's existing progress. Materialize portable progress in a learner-owned folder when filesystem access is available. Initialize a [progress template](https://starter.uppercut-labs.com/artifacts/progress/starter-progress.json) only if no state exists. Never replace a real record with the example.
2. Download the [self-contained HTML template](https://starter.uppercut-labs.com/artifacts/progress-workbench/index.html) as `index.html` beside `starter-progress.json`. Save the response as a file, preserving its bytes, and verify its byte count and SHA-256 against the [download manifest](https://starter.uppercut-labs.com/artifacts/progress-workbench/manifest.json). A mismatch requires another intact download, not rewriting the file from a chat rendering. Do this at setup entry, independently of Git, GitHub authentication, and Python availability. An agent without filesystem access provides both files for handoff into the computer harness.
3. If `index.html` already exists, inspect it first. Reuse a working Workbench; preserve learner customizations. Do not overwrite an unrelated website. Use another learner-owned progress folder when needed, moving the canonical record deliberately rather than maintaining two active copies. Keep customizations separate from template updates until reviewed.
4. Record nonsecret location and launch information in `artifacts.progress_workbench` (for example `path`, `url`, `port`, and `status`). Do not copy the entire record into that field. Record `progress-workbench` as a step when useful, but it is never a phase gate. Viewer failures or a learner's decision not to use it do not prevent setup or Quick Build.
The folder normally becomes the existing private progress repository after GitHub access is ready. A second repository is unnecessary. Private remote progress must still be verified before Quick Build; the viewer does not replace that requirement.
## Start serving as soon as Python works
Do not wait for all of Computer Setup to finish. After the first successful Python capability check, use the exact interpreter discovered by uv or the environment. In the commands below, `python` means that verified interpreter and `PROGRESS_FOLDER` means the resolved absolute learner progress folder.
```text
python -m http.server 8000 --bind 127.0.0.1 --directory "PROGRESS_FOLDER"
```
1. Inspect port 8000. Reuse an existing server only after verifying it serves this learner's intended `index.html` and canonical `starter-progress.json`. Never reuse another project's server or stop an unrelated process.
2. If 8000 is occupied, try 8001 through 8010 in order. On a bind race, choose the next free port and retry. If none works, record the cause and provide direct-file viewing while independent setup continues.
3. Launch the server through the harness's managed process facility or an OS background process with recorded process identity. On Windows use `Start-Process -WindowStyle Hidden`, correctly quote paths with spaces, and preserve separate local logs. On other systems use the harness's background session support. Do not add an autostart service or scheduled task. Keep process details in `setup/computer.json`, not public project notes.
4. Verify HTTP 200 and the expected Workbench identity at `http://127.0.0.1:PORT/`. Fetch `/starter-progress.json` and compare it to the actual canonical file, not merely a 200 response. Open the URL for the learner using the available browser-opening tool. If unavailable, give them the verified link.
5. Record the actual port and URL. After restarts, re-inspect the port/process and repeat the two-file check before reusing or starting a server. Stop only the exact process this setup started when cleanup is requested.
This standard Python server exposes files in the selected progress folder to local processes. Bind only to `127.0.0.1`, select only the learner's progress folder, and keep secrets outside it. Do not serve a home directory or bind to `0.0.0.0`. A phone's localhost is the phone; use the established remote harness to view this local page, or the separately approved protected hosting path below.
The HTTP viewer refreshes the canonical file every five seconds while visible and when the tab becomes visible again. It never writes to it. Save JSON atomically where supported to avoid half-written reads. On an invalid or unavailable update, the viewer labels the previous record as the last successfully loaded copy. After an agent update, refer the learner back to the dashboard and verify the next successful refresh. Do not require repeated manual acceptance of every refresh.
## Direct-file fallback
Double-click `index.html`, then select or drop `starter-progress.json`. No upload occurs. A browser cannot reliably reread a neighboring file in this mode: reopen the JSON after the agent saves changes. The Refresh progress control opens the file chooser in direct-file mode. Closing the page forgets the selection; nothing is stored in localStorage, IndexedDB, cookies, or an embedded copy of learner progress.
Selecting a valid file in an HTTP viewer switches to that manual file view. Reload the browser page to return to its server's canonical file. A rejected file leaves the previous server refresh mode working.
## Use the existing data contract
The [progress schema](https://starter.uppercut-labs.com/schemas/starter-progress.schema.json) remains the strict writer contract for `schema_version: 1`. The viewer first parses the file, classifies its fields, and constructs a safe read-only view. Legacy string sign-in notes and structured `choices.service_auth` work without turning OAuth into an email address. Unknown optional fields remain in the source; malformed optional fields do not blank the dashboard. It does not migrate records or mark steps complete.
Invalid step statuses or phases are quarantined and completion is withheld. Unsupported schema versions can be shown as limited previews, never ordinary completion. An unusable or truncated refresh keeps the last good record with a stale label; a later intact copy clears that label even if its bytes match the original. With no good copy, show known safe fields or an informative empty state. Copy sanitized diagnostics for the agent: these contain schema paths and expected kinds, with custom step/service/artifact names replaced by placeholders, not personal values. The agent inspects the local file to locate a specific custom entry. Nothing is sent automatically.
As the agent updates progress, maintain `choices.workbench.next_step_id` and that unfinished step's `next_action` so the default view shows the actual next action. Record `blocker` only when one exists, and clear it when resolved. These fields are optional for older files, not a reason to guess or rewrite their history.
- `phase.current` and `phase.status` describe only the current phase. Do not infer historical phase completion from the phase number.
- `steps` contains recorded work. Known IDs use shared [guide labels](https://starter.uppercut-labs.com/artifacts/progress-workbench/catalog.json); unknown IDs are humanized. Add optional `phase` to a custom step so it appears in the correct phase. Otherwise it remains visible under Other recorded steps.
- Optional `next_action` and `blocker` on a step provide the concrete action and obstacle without guessing from notes. Keep explanatory notes in `notes` as before.
- Optional `choices.workbench.next_step_id` names the next unfinished recorded step. Without it, the viewer selects an in-progress, deferred, then not-started step in the current phase. If none exists it asks the learner to consult their agent; it never invents a next action.
- Optional `choices.workbench.learner_name` personalizes the local title. Project names and links belong in `artifacts`; use named objects such as `phase_2_project` with `name`, `repository`, and `live_url`. The viewer renders text safely and only makes HTTP/HTTPS links clickable.
Counts show completed steps out of recorded steps, not a curriculum completion percentage. Required outcomes are evaluated separately from the generated [requirements registry](https://starter.uppercut-labs.com/agent/requirements.json). Skipped, deferred, and not-applicable requirements do not count as completed; one selected builder does, without requiring alternatives. `instant-app` resolves to `instant-build`; granular accounts retain their Phase 1 placement. Conflicting records require reconciliation, and `phase-2-project` alone cannot prove live behavior. Completion recorded in the current phase or `artifacts.phase_history` is preserved under its recorded revision. Newly added requirements appear as an update checklist, not a revocation or automatic enrollment. The companion still verifies evidence and saves closeout; the viewer never does either. Phase 3 remains a preview.
The HTML bundles the registry and derived labels for offline use. When online it can anonymously GET the public guide-label catalog with no learner state, credentials, or referring URL. No analytics, remote images, external fonts, or network writes are included. An unavailable, invalid, or different-revision catalog retains bundled definitions. Different pack versions produce a review notice, not an automatic migration. Download upgrades beside a customized viewer, compare changes and manifest integrity, and switch only after review; never overwrite the learner's customized HTML.
## Ask once about development email
At setup entry, reuse previously confirmed preferences. Otherwise ask: **Which email should your development accounts use, and where should development emails go by default? They can be the same address, or you can give me different addresses for different services.** Do not obtain passwords or one-time codes in progress notes.
Store confirmed preferences under `choices.development_email`:
```json
{
"account_email": "learner@example.com",
"notification_email": "learner@example.com",
"access_email": null,
"service_overrides": {
"github": "code@example.com"
},
"notes": []
}
```
This is an example, never a default value to copy into real learner progress. Legacy service overrides may contain distinct email addresses or sign-in descriptions; preserve them as notes, not assumed email links. Prefer structured `choices.service_auth` for new method/provider/handle/confirmed-email/source metadata. Missing addresses remain null or absent; do not infer identity from Git author settings, a logged-in provider, or the computer name. Do not change Git author identity, account emails, or send messages merely because a preference was recorded. If the learner declines or defers, record that and continue; ask again only when a chosen service actually needs the missing address.
Before optional Cloudflare Access setup, propose the saved `access_email`, otherwise `notification_email`, otherwise `account_email`. Confirm the actual allowlisted address (or explicit list of addresses) with the learner. Then record the chosen primary address in `access_email` and any additional allowed addresses in their service preferences/notes. An account-sign-in email is not automatically an Access grant. These personal preferences remain in the learner's private record and are excluded from public examples or screenshots unless approved.
## Optional customization and publishing
Personalize the Workbench only when it helps display real project information and the learner wants it. Preserve canonical JSON, phase navigation, read-only behavior, and the data contract. Keep the icon-led layout: prominent phase badges, recognizable step and status icons, labeled controls, and icons for setup, email, and project sections. Keep visible text beside icons and preserve accessible names. Reuse the embedded set when customizing; do not introduce a network dependency for icons. A learner/project name or useful artifact links may be enough. Never customize the shared Starter Pack site for an individual learner.
Workbench publishing is optional extra credit and lower priority than publishing the learner's instant build. Ask plainly before creating a separate hosting repository or an externally reachable site. Follow the [Cloudflare Access publishing recipe](https://starter.uppercut-labs.com/setup/workbench-publishing.md) for deliberate account/domain selection, confirmed email access, protected placeholder verification, and allowlisted snapshot deployment. For an explicitly chosen tailnet-only route, follow the [private Workbench guide](https://starter.uppercut-labs.com/setup/private-workbench.md); never point Tailscale Serve at the general Python progress-folder server described above. Use an isolated approved two-file projection, inspect effective tailnet access, and test denial paths. Never upload the private repository or canonical JSON to a public static host by default. A hosted snapshot must be refreshed deliberately; the local JSON stays canonical.
The HTML embeds 35 curated SVG icons from the Starter Pack site and its Lucide collection, including provider marks when a saved harness is recognized. Icons require no extra files or network access. Original color marks retain their colors; interface icons follow the current section color. The build verifies source hashes and includes Lucide, Lobe Icons, and Simple Icons licenses and provenance in the download. The embedded Geist font retains its SIL Open Font License inside the HTML. The artifact has no runtime dependency downloads or build requirements.
Skill instructions
Supporting instructions
public/setup/computer-setup.manifest.json
{
"manifest_version": 1,
"id": "starter-pack-computer-setup",
"skill_version": "0.2.3",
"updated_at": "2026-10-15",
"requirements": "https://starter.uppercut-labs.com/agent/requirements.json",
"requirements_revision": "2026-10-09",
"requirements_role": "canonical_phase_gates; this manifest specifies setup implementation and evidence only",
"workbench": {
"role": "default_local_visualization",
"phase_gate": false,
"assemble_at": "computer_setup_start",
"independent_of_github": true,
"lifecycle": "https://starter.uppercut-labs.com/artifacts/progress-workbench/README.md",
"download": "https://starter.uppercut-labs.com/artifacts/progress-workbench/index.html",
"location": "beside_canonical_starter_progress_json",
"preserve_existing_html": true,
"serve_when": "python_interpreter_verified",
"server_module": "http.server",
"bind": "127.0.0.1",
"default_port": 8000,
"fallback_ports": [
8001,
8002,
8003,
8004,
8005,
8006,
8007,
8008,
8009,
8010
],
"verify_directory_and_binding_before_reuse": true,
"directory": "absolute_progress_folder",
"visible_http_poll_seconds": 5,
"file_mode_reload": "choose_saved_json_again",
"optional_publishing": "https://starter.uppercut-labs.com/setup/workbench-publishing.md",
"optional_private_access": "https://starter.uppercut-labs.com/setup/private-workbench.md",
"remote_share_boundary": "isolated_allowlisted_snapshot_with_approved_progress_projection",
"publishing_priority": "after_instant_app_deployment_extra_credit"
},
"development_email": {
"progress_path": "choices.development_email",
"ask_once_early_when_missing": true,
"explicit_learner_confirmation": true,
"allow_same_account_and_notification_email": true,
"allow_service_overrides": true,
"allow_unanswered": true,
"phase_gate": false,
"service_auth_path": "choices.service_auth",
"legacy_non_email_overrides": "preserve_as_sign_in_notes",
"change_git_identity": false,
"infer_from_git_author": false,
"confirm_access_email_separately": true
},
"policies": {
"inspect_first": true,
"idempotent": true,
"resumable": true,
"do_not_downgrade": true,
"resolve_installers_from_official_sources": true,
"required_batch_approval": true,
"optional_packs_separate_approval": true,
"pause_for_auth_admin_restart": true,
"verify_capabilities": true,
"never_store_secrets": true,
"prefer_healthy_existing_capability": true,
"compare_supported_binary_and_package_manager_routes": true,
"avoid_source_build_when_supported_binary_exists": true,
"package_manager_is_not_a_gate_when_supported_direct_tools_suffice": true,
"managed_recoverable_installer_jobs_only": true,
"no_conflicting_parallel_installers": true,
"preserve_profiles_and_environment": true,
"git_privacy_preflight_before_first_push": true
},
"platforms": {
"windows": {
"support": "first_class",
"target": "Windows 11",
"preferred_install_support": "verified_winget_or_supported_vendor_binary",
"extra_required": [
"powershell-7"
],
"adapter": "https://starter.uppercut-labs.com/setup/windows.md"
},
"macos": {
"support": "first_class",
"target": "current macOS",
"preferred_install_support": "healthy_homebrew_or_supported_vendor_binary",
"extra_required": [],
"adapter": "https://starter.uppercut-labs.com/setup/macos.md"
},
"linux": {
"support": "best_effort",
"target": "agent-routed",
"extra_required": [],
"adapter": "https://starter.uppercut-labs.com/setup/linux.md"
}
},
"required_capabilities": [
{
"id": "installation-support",
"verification": "trusted_supported_install_update_and_repair_route_for_missing_tools; no named_package_manager_gate"
},
{
"id": "selected-agentic-harness",
"version_policy": "current_supported"
},
{
"id": "selected-ide",
"selection": "ide.harness_to_ide_or_default",
"version_policy": "current_supported",
"instructions": "https://starter.uppercut-labs.com/setup/ide.md"
},
{
"id": "git",
"version_policy": "current_stable"
},
{
"id": "github-cli",
"command": "gh",
"version_policy": "current_stable"
},
{
"id": "node",
"version_policy": "active_lts"
},
{
"id": "npm",
"provided_by": "node"
},
{
"id": "npx",
"provided_by": "node"
},
{
"id": "uv",
"version_policy": "current_stable"
},
{
"id": "python",
"provisioned_or_discovered_by": "uv; reuse_healthy_existing_interpreter",
"version_policy": "current_stable"
},
{
"id": "ripgrep",
"command": "rg",
"version_policy": "current_stable"
},
{
"id": "fd",
"command": "fd",
"version_policy": "current_stable"
},
{
"id": "jq",
"command": "jq",
"version_policy": "current_stable"
},
{
"id": "curl",
"command": "curl",
"version_policy": "system_or_current"
},
{
"id": "cli-contexts",
"verification": "cli_verification; per-tool ordinary resolution in each applicable execution context"
},
{
"id": "tailscale-computer",
"legacy_capability_ids": ["tailscale-desktop"],
"version_policy": "current_stable"
},
{
"id": "tailscale-phone",
"version_policy": "current_stable"
},
{
"id": "private-network-identity",
"verification": "remote_access.checks.device_identity; intended devices and permitted private connectivity confirmed"
},
{
"id": "tailscale-network",
"verification": "derived from registry.steps.tailscale-network.completion; never an independent summary-flag gate"
},
{
"id": "phone-to-computer-file",
"verification": "benign_file_received_in_actual_client_destination_and_contents_confirmed",
"instructions": "https://starter.uppercut-labs.com/setup/file-transfer.md"
},
{
"id": "computer-to-phone-file",
"verification": "returned_benign_file_opened_on_phone_and_contents_confirmed",
"instructions": "https://starter.uppercut-labs.com/setup/file-transfer.md"
},
{
"id": "remote-interaction-layer",
"selection": "best_fit"
},
{
"id": "verified-phone-connection",
"verification": "phone_action_reaches_intended_running_computer_harness; independent_of_file_transfer"
}
],
"recommended_non_gate": [
{
"id": "fzf"
},
{
"id": "direnv"
},
{
"id": "make",
"selection": "when_project_invokes_it"
}
],
"project_local_defaults": [
"typescript",
"vite-or-next",
"vitest",
"eslint",
"wrangler",
"playwright",
"neon-cli",
"vercel-cli",
"astro"
],
"optional_packs": {
"containers": {
"tools": [
"docker-desktop"
],
"install_order": "last",
"restart_aware": true,
"phase_gate": false,
"verify_current_license_and_host_suitability": true,
"rosetta": "only_if_actual_architecture_and_selected_feature_require_it_with_approval",
"instructions": "https://starter.uppercut-labs.com/setup/tool-troubleshooting.md",
"excluded": [
"orbstack",
"legacy-docker-compose"
]
},
"alternate-js": {
"tools": [
"pnpm",
"bun",
"deno",
"corepack"
],
"selection": "only_when_needed"
},
"cloud-networking": {
"tools": [
"cloudflared"
],
"selection": "only_when_needed"
},
"media": {
"tools": [
"ffmpeg",
"ffprobe",
"yt-dlp"
],
"selection": "only_when_needed"
},
"native-mobile": {
"tools": [
"cocoapods",
"cmake",
"ninja",
"meson",
"clang",
"llvm",
"pkg-config",
"java"
],
"selection": "project_specific"
},
"programmatic-harness": {
"phase_gate": false,
"selection": "explicit_opt_in",
"availability": "codex_local_only_after_compatible_pinned_adapter_and_reusable_skill_releases",
"codex_auth": "managed_chatgpt_sign_in",
"codex_billing": "eligible_chatgpt_plan; no_openai_platform_api_key_or_api_billing",
"local_and_cloud_evidence": "independent",
"automatic_install": false,
"installation_scope": "project_local_after_explicit_approval",
"evidence_path": "artifacts.programmatic_harness",
"evidence_schema": "https://starter.uppercut-labs.com/schemas/starter-progress.schema.json#/$defs/programmaticHarnessEvidence",
"guide": "https://starter.uppercut-labs.com/setup/programmatic-harness.md",
"adapter_package": "@uppercut-labs/agent-native@0.1.1",
"adapter_tarball": "https://github.com/uppercut-labs/agent-native/releases/download/v0.1.1/uppercut-labs-agent-native-0.1.1.tgz",
"adapter_tarball_sha256": "https://github.com/uppercut-labs/agent-native/releases/download/v0.1.1/uppercut-labs-agent-native-0.1.1.tgz.sha256",
"adapter_docs": "https://github.com/uppercut-labs/agent-native/blob/main/docs/harness-codex.md",
"skill_version": "0.1.1",
"skill_source": "https://github.com/devin-thomas/skills/tree/50ce5dce91c49fcf896aa887e11b4c3a529e40e5/programmatic-harness",
"skills_cli_tarball": "https://github.com/devin-thomas/skills/releases/download/v0.1.1/uppercut-labs-skills-0.1.1.tgz",
"skills_cli_tarball_sha256": "https://github.com/devin-thomas/skills/releases/download/v0.1.1/uppercut-labs-skills-0.1.1.tgz.sha256",
"skill_install_arguments": "add programmatic-harness --host codex --project ABS_PROJECT --channel bundled"
}
},
"state_path": "setup/computer.json",
"cli_verification": {
"applies_to": "all_required_and_later_selected_system_or_user_CLIs",
"contexts": ["current_shell", "new_terminal", "ide_terminal", "harness_subprocess", "alternate_shell_or_wsl_if_selected"],
"outcomes": ["passed", "failed", "not_tested", "not_applicable"],
"record": ["version", "resolved_path", "scope", "install_source", "architecture", "verified_at", "contexts", "next_action"],
"use_ordinary_resolution": true,
"project_local_tools": "verify_through_repository_runner; never_add_project_node_modules_bin_to_global_PATH",
"instructions": "https://starter.uppercut-labs.com/setup/tool-troubleshooting.md"
},
"progress_mapping": {
"selected-agentic-harness": "capabilities.selected-agentic-harness",
"selected-ide": "capabilities.selected-ide and ide.verification",
"system-cli-baseline": "capabilities; applicable baseline tools are installed and usable",
"cli-contexts": "capabilities.*.contexts; all applicable cli_verification contexts pass for each relevant CLI",
"tailscale-computer": "remote_access.checks.tailscale_computer",
"tailscale-phone": "remote_access.checks.tailscale_phone",
"private-network-identity": "remote_access.checks.device_identity",
"tailscale-network": "derived from registry.steps.tailscale-network.completion; preserve leaf evidence separately",
"phone-to-computer-file": "remote_access.checks.phone_to_computer_file",
"computer-to-phone-file": "remote_access.checks.computer_to_phone_file",
"verified-phone-connection": "remote_access.checks.phone_harness_interaction",
"private-progress-repository": "private_save; actual approved remote commit and private visibility verified",
"programmatic-harness": "artifacts.programmatic_harness; normalized per-provider local/cloud proof outcomes; no credentials, raw provider output, private planning URLs, or raw session/turn IDs"
},
"focused_guides": {
"authentication": "https://starter.uppercut-labs.com/setup/authentication.md",
"codex_readiness": "https://starter.uppercut-labs.com/setup/codex-readiness.md",
"file_transfer": "https://starter.uppercut-labs.com/setup/file-transfer.md",
"private_workbench": "https://starter.uppercut-labs.com/setup/private-workbench.md",
"troubleshooting": "https://starter.uppercut-labs.com/setup/tool-troubleshooting.md"
},
"ide": {
"required": true,
"lifecycle": "https://starter.uppercut-labs.com/setup/ide.md",
"select_from": "development_harness_not_phone_companion",
"harness_to_ide": {
"antigravity": "antigravity",
"cursor": "cursor"
},
"default": "vscode",
"default_includes": [
"chatgpt",
"codex",
"claude-code"
],
"install_and_configure": "agent_applies_approved_required_batch",
"reuse_working_installation": true,
"preserve_settings": true,
"state_path": "setup/computer.json",
"verification": [
"ide_launches",
"workspace_opens",
"markdown_displays",
"integrated_terminal_resolves_applicable_baseline_tools",
"selected_harness_works_with_workspace"
]
}
}