diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml new file mode 100644 index 00000000..0abe65e4 --- /dev/null +++ b/.github/workflows/quality.yml @@ -0,0 +1,32 @@ +name: Quality + +on: + pull_request: + push: + branches: + - main + +jobs: + quality: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Setup Node + uses: actions/setup-node@v6 + with: + node-version: 24 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Lint + run: npm run lint + + - name: Check formatting + run: npm run format:check + + - name: Run tests + run: npm test diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 00000000..f841cf21 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,2 @@ +#!/usr/bin/env sh +npx lint-staged diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..98b18013 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,6 @@ +node_modules/ +docs/.vitepress/dist/ +.git-history-backup-20260519/ +coverage/ +artifacts/ +temp/ diff --git a/README.md b/README.md index b7238ff8..75fd7271 100644 --- a/README.md +++ b/README.md @@ -7,14 +7,19 @@ This repository is no longer only the `Learn Harness Engineering` course. It now - a reusable VitePress course platform - one active course selected at build time - multiple course manifests under `courses/` +- isolated course content under `courses//docs` ## Current structure - active course selector: [docs/.vitepress/active-course.mjs](/Users/matheuspuppe/Desktop/estudo/course-builder/docs/.vitepress/active-course.mjs:1) - active-course wrapper: [docs/.vitepress/course.manifest.mjs](/Users/matheuspuppe/Desktop/estudo/course-builder/docs/.vitepress/course.manifest.mjs:1) +- builder shell: [docs/.vitepress/config.mts](/Users/matheuspuppe/Desktop/estudo/course-builder/docs/.vitepress/config.mts:1) - course manifests: - [courses/learn-harness-engineering/course.manifest.mjs](/Users/matheuspuppe/Desktop/estudo/course-builder/courses/learn-harness-engineering/course.manifest.mjs:1) - [courses/agent-ops-bootcamp/course.manifest.mjs](/Users/matheuspuppe/Desktop/estudo/course-builder/courses/agent-ops-bootcamp/course.manifest.mjs:1) +- course content roots: + - [courses/learn-harness-engineering/docs](/Users/matheuspuppe/Desktop/estudo/course-builder/courses/learn-harness-engineering/docs:1) + - [courses/agent-ops-bootcamp/docs](/Users/matheuspuppe/Desktop/estudo/course-builder/courses/agent-ops-bootcamp/docs:1) ## Commands @@ -29,6 +34,7 @@ To inspect and switch courses: ```bash npm run course:list +npm run course:new -- my-new-course "My New Course" npm run course:activate -- learn-harness-engineering npm run course:activate -- agent-ops-bootcamp ``` @@ -44,22 +50,22 @@ Each course manifest defines: - `curriculum` - `homeByLocale` -The VitePress layer reads the active manifest and builds nav, sidebar, branding, and homepage from it. +The VitePress layer reads the active manifest and points `srcDir` at that course's own `docs` directory. Nav, sidebar, branding, homepage, and markdown content all come from the active course. ## Creating a new course 1. Create `courses//course.manifest.mjs`. -2. Start from one of the existing manifests. -3. Define the course `site`, `brand`, `theme`, `locales`, `curriculum`, and `homeByLocale`. -4. Switch to it with `npm run course:activate -- `. -5. Update `docs/` markdown content so it matches the new curriculum. +2. Or scaffold both manifesto and docs with `npm run course:new -- "Course Title"`. +3. Create `courses//docs/` if you did not use the scaffold command. +4. Define the course `site`, `brand`, `theme`, `locales`, `curriculum`, and `homeByLocale`. +5. Add markdown content under `courses//docs//...` to match the curriculum. +6. Switch to it with `npm run course:activate -- `. ## Current limitations - only one course is active per build -- `docs/` content is still mostly from `Learn Harness Engineering` - the current manifest format is code-first, not CMS-driven -- the public docs URLs still depend on each course's configured `site.base` +- only one course is active per build ## Validation diff --git a/WHITELABEL.md b/WHITELABEL.md index 01982bb2..c0796828 100644 --- a/WHITELABEL.md +++ b/WHITELABEL.md @@ -6,6 +6,7 @@ O projeto agora está estruturado para suportar múltiplos cursos com um curso a - curso ativo: [docs/.vitepress/active-course.mjs](/Users/matheuspuppe/Desktop/estudo/course-builder/docs/.vitepress/active-course.mjs:1) - manifesto do curso atual: [courses/learn-harness-engineering/course.manifest.mjs](/Users/matheuspuppe/Desktop/estudo/course-builder/courses/learn-harness-engineering/course.manifest.mjs:1) +- conteúdo do curso atual: [courses/learn-harness-engineering/docs](/Users/matheuspuppe/Desktop/estudo/course-builder/courses/learn-harness-engineering/docs:1) - wrappers compatíveis com a camada antiga: - [docs/.vitepress/course.config.mjs](/Users/matheuspuppe/Desktop/estudo/course-builder/docs/.vitepress/course.config.mjs:1) - [docs/.vitepress/course-content.mjs](/Users/matheuspuppe/Desktop/estudo/course-builder/docs/.vitepress/course-content.mjs:1) @@ -19,13 +20,15 @@ O projeto agora está estruturado para suportar múltiplos cursos com um curso a - manifesto de locales e labels de UI - currículo por locale - conteúdo da homepage por locale +- conteúdo markdown por curso - seleção do curso ativo ## Como criar outro curso 1. Crie uma pasta `courses//`. -2. Copie [courses/learn-harness-engineering/course.manifest.mjs](/Users/matheuspuppe/Desktop/estudo/course-builder/courses/learn-harness-engineering/course.manifest.mjs:1) para o novo slug. -3. Edite no manifesto: +2. Crie `courses//docs/`. +3. Copie [courses/learn-harness-engineering/course.manifest.mjs](/Users/matheuspuppe/Desktop/estudo/course-builder/courses/learn-harness-engineering/course.manifest.mjs:1) para o novo slug. +4. Edite no manifesto: - `site.title` - `site.description` - `site.base` @@ -35,17 +38,17 @@ O projeto agora está estruturado para suportar múltiplos cursos com um curso a - `locales` - `curriculum` - `homeByLocale` -4. Aponte [docs/.vitepress/active-course.mjs](/Users/matheuspuppe/Desktop/estudo/course-builder/docs/.vitepress/active-course.mjs:1) para o novo manifesto. -5. Reescreva o conteúdo real em `docs//` para bater com o currículo do novo curso. +5. Adicione o conteúdo real em `courses//docs//` para bater com o currículo do novo curso. +6. Ative o curso. Ou use os comandos: - `npm run course:list` +- `npm run course:new -- "Course Title"` - `npm run course:activate -- ` ## Limitações atuais -- o conteúdo markdown em `docs/` ainda é do curso `Learn Harness Engineering` - o manifesto do curso atual ainda concentra muito conteúdo inline - ainda existe apenas um curso ativo por build -- `README.md` ainda descreve o curso atual, não a plataforma +- o builder ainda depende de manifests em código, não de uma camada editorial diff --git a/courses/agent-ops-bootcamp/course.manifest.mjs b/courses/agent-ops-bootcamp/course.manifest.mjs index 6952614e..1e0dc6ac 100644 --- a/courses/agent-ops-bootcamp/course.manifest.mjs +++ b/courses/agent-ops-bootcamp/course.manifest.mjs @@ -4,33 +4,30 @@ const courseManifest = { description: "A compact course on operating, debugging, and shipping agentic workflows in production teams.", base: "/course-builder/", - repoTreeUrl: "https://github.com/puppe1990/course-builder/tree/main" + repoTreeUrl: "https://github.com/puppe1990/course-builder/tree/main", }, brand: { - logo: - 'data:image/svg+xml;utf8,' + logo: 'data:image/svg+xml;utf8,', }, theme: { fontStylesheets: [ - "https://fonts.googleapis.com/css2?family=Newsreader:opsz,wght@6..72,400;6..72,600&family=Plus+Jakarta+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" + "https://fonts.googleapis.com/css2?family=Newsreader:opsz,wght@6..72,400;6..72,600&family=Plus+Jakarta+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap", ], typography: { - body: - "'Plus Jakarta Sans', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif", + body: "'Plus Jakarta Sans', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif", heading: "'Newsreader', ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif", - mono: - "'JetBrains Mono', 'Fira Code', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace", - mermaid: "'Plus Jakarta Sans', sans-serif" + mono: "'JetBrains Mono', 'Fira Code', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace", + mermaid: "'Plus Jakarta Sans', sans-serif", }, layout: { maxWidth: "1280px", sidebarWidth: "280px", - cardRadius: "14px" + cardRadius: "14px", }, effects: { featureShadow: "0 18px 48px rgba(11, 110, 79, 0.14)", - featureShadowDark: "0 18px 48px rgba(0, 0, 0, 0.4)" + featureShadowDark: "0 18px 48px rgba(0, 0, 0, 0.4)", }, colors: { light: { @@ -47,7 +44,7 @@ const courseManifest = { brandSoft: "rgba(11, 110, 79, 0.12)", divider: "rgba(8, 32, 20, 0.1)", sidebarBg: "#ECF5F0", - navBg: "#F6FBF8" + navBg: "#F6FBF8", }, dark: { bg: "#0E1712", @@ -63,9 +60,9 @@ const courseManifest = { brandSoft: "rgba(57, 163, 127, 0.16)", divider: "rgba(255, 255, 255, 0.12)", sidebarBg: "#0A120D", - navBg: "#0E1712" - } - } + navBg: "#0E1712", + }, + }, }, locales: [ { @@ -78,31 +75,40 @@ const courseManifest = { resources: "Toolkit", skills: "Playbooks", resourceLibrary: "Toolkit", - tryHarness: "Open Templates ↗" - } - } + tryHarness: "Open Templates ↗", + }, + }, ], curriculum: { en: { lectures: [ { text: "Welcome", link: "/en/" }, - { text: "Operate Agents with Guardrails", link: "/en/lectures/operate-agents-with-guardrails/" }, - { text: "Debug Long-Running Workflows", link: "/en/lectures/debug-long-running-workflows/" }, - { text: "Ship with Runtime Feedback", link: "/en/lectures/ship-with-runtime-feedback/" } + { + text: "Operate Agents with Guardrails", + link: "/en/lectures/operate-agents-with-guardrails/", + }, + { + text: "Debug Long-Running Workflows", + link: "/en/lectures/debug-long-running-workflows/", + }, + { + text: "Ship with Runtime Feedback", + link: "/en/lectures/ship-with-runtime-feedback/", + }, ], projects: [ { text: "Overview", link: "/en/projects/" }, { text: "Incident Drill", link: "/en/projects/incident-drill/" }, - { text: "Release Checklist", link: "/en/projects/release-checklist/" } + { text: "Release Checklist", link: "/en/projects/release-checklist/" }, ], resources: [ { text: "Overview", link: "/en/resources/" }, { text: "Runbooks", link: "/en/resources/templates/" }, { text: "Reference", link: "/en/resources/reference/" }, - { text: "Advanced Ops", link: "/en/resources/openai-advanced/" } + { text: "Advanced Ops", link: "/en/resources/openai-advanced/" }, ], - skills: [{ text: "Playbooks", link: "/en/skills/" }] - } + skills: [{ text: "Playbooks", link: "/en/skills/" }], + }, }, homeByLocale: { en: { @@ -110,20 +116,20 @@ const courseManifest = { title: "Welcome to Agent Ops Bootcamp", intro: [ "Agent Ops Bootcamp focuses on how teams run, observe, and correct agentic systems under production constraints.", - "The course is intentionally compact: a few modules, a few labs, and a toolkit you can adapt to your own operating model." + "The course is intentionally compact: a few modules, a few labs, and a toolkit you can adapt to your own operating model.", ], references: [ { label: "Operational feedback loops", - href: "https://openai.com/index/harness-engineering/" - } - ] + href: "https://openai.com/index/harness-engineering/", + }, + ], }, sections: { start: "Start here", mechanism: "Operating loop", learn: "You will practice", - next: "Next moves" + next: "Next moves", }, startText: "This sample course exists to prove the platform can host a second curriculum with different naming, visual identity, and positioning.", @@ -131,18 +137,18 @@ const courseManifest = { { title: "Modules", body: "Short theory units about operating agents safely.", - href: "./lectures/operate-agents-with-guardrails/" + href: "./lectures/operate-agents-with-guardrails/", }, { title: "Labs", body: "Hands-on operational drills.", - href: "./projects/" + href: "./projects/", }, { title: "Toolkit", body: "Runbooks and reusable templates.", - href: "./resources/" - } + href: "./resources/", + }, ], mechanismText: "Production agent work improves when runtime feedback and verification are part of the operating loop.", @@ -155,23 +161,23 @@ const courseManifest = { learnItems: [ "Define operator-facing guardrails.", "Treat logs and runtime feedback as first-class inputs.", - "Run lightweight drills before real incidents." + "Run lightweight drills before real incidents.", ], nextIntro: "The sample path is intentionally small:", nextSteps: [ { title: "Module 1", description: "Start with guardrails.", - href: "./lectures/operate-agents-with-guardrails/" + href: "./lectures/operate-agents-with-guardrails/", }, { title: "Lab 1", description: "Run an incident drill.", - href: "./projects/incident-drill/" - } - ] - } - } + href: "./projects/incident-drill/", + }, + ], + }, + }, }; export default courseManifest; diff --git a/docs/en/index.md b/courses/agent-ops-bootcamp/docs/en/index.md similarity index 100% rename from docs/en/index.md rename to courses/agent-ops-bootcamp/docs/en/index.md diff --git a/courses/agent-ops-bootcamp/docs/en/lectures/debug-long-running-workflows/index.md b/courses/agent-ops-bootcamp/docs/en/lectures/debug-long-running-workflows/index.md new file mode 100644 index 00000000..2fade37f --- /dev/null +++ b/courses/agent-ops-bootcamp/docs/en/lectures/debug-long-running-workflows/index.md @@ -0,0 +1,14 @@ +# Debug Long-Running Workflows + +Long-running agents rarely fail in one obvious place. They drift, loop, or lose context across steps. + +## What to inspect + +- Execution logs +- State transitions +- Retry behavior +- Handoff boundaries + +## Debugging principle + +Treat every long-running workflow as an observable system, not a black box prompt. diff --git a/courses/agent-ops-bootcamp/docs/en/lectures/operate-agents-with-guardrails/index.md b/courses/agent-ops-bootcamp/docs/en/lectures/operate-agents-with-guardrails/index.md new file mode 100644 index 00000000..793c8492 --- /dev/null +++ b/courses/agent-ops-bootcamp/docs/en/lectures/operate-agents-with-guardrails/index.md @@ -0,0 +1,13 @@ +# Operate Agents with Guardrails + +Agent systems need explicit operating boundaries. This module shows how teams define ownership, stop conditions, and escalation paths before runtime issues become incidents. + +## Core rules + +- Define who can trigger the workflow. +- Define what the agent can change without approval. +- Define when the system must pause and ask for human review. + +## Outcome + +By the end of this module, you should have a lightweight guardrail policy that can be attached to any agent workflow. diff --git a/courses/agent-ops-bootcamp/docs/en/lectures/ship-with-runtime-feedback/index.md b/courses/agent-ops-bootcamp/docs/en/lectures/ship-with-runtime-feedback/index.md new file mode 100644 index 00000000..d94203d6 --- /dev/null +++ b/courses/agent-ops-bootcamp/docs/en/lectures/ship-with-runtime-feedback/index.md @@ -0,0 +1,14 @@ +# Ship with Runtime Feedback + +Shipping agent systems safely requires a feedback loop between runtime behavior and product decisions. + +## Runtime inputs + +- Error classes +- Human overrides +- Repeated retries +- Failed postconditions + +## Practice + +Turn the most common runtime failures into explicit operating rules and release checks. diff --git a/courses/agent-ops-bootcamp/docs/en/projects/incident-drill/index.md b/courses/agent-ops-bootcamp/docs/en/projects/incident-drill/index.md new file mode 100644 index 00000000..3dd162b8 --- /dev/null +++ b/courses/agent-ops-bootcamp/docs/en/projects/incident-drill/index.md @@ -0,0 +1,7 @@ +# Incident Drill + +Simulate a production issue where an agent keeps retrying a task with stale context. + +## Deliverable + +Write the operator checklist your team should follow in the first ten minutes of the incident. diff --git a/courses/agent-ops-bootcamp/docs/en/projects/index.md b/courses/agent-ops-bootcamp/docs/en/projects/index.md new file mode 100644 index 00000000..0810eea1 --- /dev/null +++ b/courses/agent-ops-bootcamp/docs/en/projects/index.md @@ -0,0 +1,3 @@ +# Labs + +Use these labs to pressure-test your operating model before a real release. diff --git a/courses/agent-ops-bootcamp/docs/en/projects/release-checklist/index.md b/courses/agent-ops-bootcamp/docs/en/projects/release-checklist/index.md new file mode 100644 index 00000000..d8bd10ad --- /dev/null +++ b/courses/agent-ops-bootcamp/docs/en/projects/release-checklist/index.md @@ -0,0 +1,8 @@ +# Release Checklist + +Before enabling a workflow in production, verify: + +- the trigger is intentional, +- the stop conditions are explicit, +- the logs are reviewable, +- the fallback path is owned by a human. diff --git a/courses/agent-ops-bootcamp/docs/en/resources/index.md b/courses/agent-ops-bootcamp/docs/en/resources/index.md new file mode 100644 index 00000000..23ca95d9 --- /dev/null +++ b/courses/agent-ops-bootcamp/docs/en/resources/index.md @@ -0,0 +1,3 @@ +# Toolkit + +This toolkit is the operational layer of the course: compact templates, references, and reusable docs. diff --git a/courses/agent-ops-bootcamp/docs/en/resources/openai-advanced/index.md b/courses/agent-ops-bootcamp/docs/en/resources/openai-advanced/index.md new file mode 100644 index 00000000..284800ed --- /dev/null +++ b/courses/agent-ops-bootcamp/docs/en/resources/openai-advanced/index.md @@ -0,0 +1,3 @@ +# Advanced Ops + +Use this area for deeper operational patterns once the core course flow is stable. diff --git a/courses/agent-ops-bootcamp/docs/en/resources/reference/index.md b/courses/agent-ops-bootcamp/docs/en/resources/reference/index.md new file mode 100644 index 00000000..552622c1 --- /dev/null +++ b/courses/agent-ops-bootcamp/docs/en/resources/reference/index.md @@ -0,0 +1,3 @@ +# Reference + +Use this section for operating heuristics, terminology, and small checklists that support the labs. diff --git a/courses/agent-ops-bootcamp/docs/en/resources/templates/index.md b/courses/agent-ops-bootcamp/docs/en/resources/templates/index.md new file mode 100644 index 00000000..80b4c8f7 --- /dev/null +++ b/courses/agent-ops-bootcamp/docs/en/resources/templates/index.md @@ -0,0 +1,9 @@ +# Runbooks + +## Minimal runbook template + +1. Trigger +2. Expected outcome +3. Failure signals +4. Human escalation point +5. Cleanup steps diff --git a/courses/agent-ops-bootcamp/docs/en/skills/index.md b/courses/agent-ops-bootcamp/docs/en/skills/index.md new file mode 100644 index 00000000..df86ceb5 --- /dev/null +++ b/courses/agent-ops-bootcamp/docs/en/skills/index.md @@ -0,0 +1,7 @@ +# Playbooks + +Playbooks are compact action guides for common operational situations: + +- rollout review +- runtime incident response +- postmortem capture diff --git a/courses/agent-ops-bootcamp/docs/index.md b/courses/agent-ops-bootcamp/docs/index.md new file mode 100644 index 00000000..261535fd --- /dev/null +++ b/courses/agent-ops-bootcamp/docs/index.md @@ -0,0 +1,14 @@ +--- +layout: page +--- + + + +
+

Loading...

+
diff --git a/courses/learn-harness-engineering/course.manifest.mjs b/courses/learn-harness-engineering/course.manifest.mjs index 015d1c92..3488494b 100644 --- a/courses/learn-harness-engineering/course.manifest.mjs +++ b/courses/learn-harness-engineering/course.manifest.mjs @@ -6,32 +6,34 @@ const defaultHome = { title: "Welcome to Learn Harness Engineering", intro: [ "Learn Harness Engineering is a course dedicated to the engineering of AI coding agents. We have deeply studied and synthesized the most advanced Harness Engineering theories and practices in the industry.", - "Through systematic environment design, state management, verification, and control systems, this course teaches you how to make agentic coding tools like Codex and Claude Code truly reliable." + "Through systematic environment design, state management, verification, and control systems, this course teaches you how to make agentic coding tools like Codex and Claude Code truly reliable.", ], references: [ { - label: "OpenAI: Harness engineering: leveraging Codex in an agent-first world", - href: "https://openai.com/index/harness-engineering/" + label: + "OpenAI: Harness engineering: leveraging Codex in an agent-first world", + href: "https://openai.com/index/harness-engineering/", }, { label: "Anthropic: Effective harnesses for long-running agents", - href: "https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents" + href: "https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents", }, { - label: "Anthropic: Harness design for long-running application development", - href: "https://www.anthropic.com/engineering/harness-design-long-running-apps" + label: + "Anthropic: Harness design for long-running application development", + href: "https://www.anthropic.com/engineering/harness-design-long-running-apps", }, { label: "Awesome Harness Engineering", - href: "https://github.com/walkinglabs/awesome-harness-engineering" - } - ] + href: "https://github.com/walkinglabs/awesome-harness-engineering", + }, + ], }, sections: { start: "Get started", mechanism: "The Core Mechanism of a Harness", learn: "What you will learn", - next: "Next steps" + next: "Next steps", }, startText: "Choose your learning path to get started. The course is divided into theoretical lectures, hands-on projects, and a copy-ready resource library.", @@ -39,18 +41,18 @@ const defaultHome = { { title: "Lectures", body: "Understand why strong models still fail and learn the theory behind effective harnesses.", - href: "./lectures/lecture-01-why-capable-agents-still-fail/" + href: "./lectures/lecture-01-why-capable-agents-still-fail/", }, { title: "Projects", body: "Hands-on practice building a reliable agentic environment from scratch.", - href: "./projects/" + href: "./projects/", }, { title: "Resource Library", body: "Copy-ready templates (AGENTS.md, feature_list.json) to use in your own repositories.", - href: "./resources/" - } + href: "./resources/", + }, ], mechanismText: 'A harness does not "make the model smarter"; it establishes a closed-loop working system for the model.', @@ -75,7 +77,7 @@ const defaultHome = { "Maintain context across long-running, multi-session tasks.", "Stop agents from declaring victory too early.", "Verify work using full-pipeline tests and self-reflection.", - "Make runtime observable and debuggable." + "Make runtime observable and debuggable.", ], nextIntro: "Once you understand the core concepts, these guides help you go deeper:", @@ -83,19 +85,19 @@ const defaultHome = { { title: "Lecture 01: Why Capable Agents Still Fail", description: "Start with the theory behind harness engineering.", - href: "./lectures/lecture-01-why-capable-agents-still-fail/" + href: "./lectures/lecture-01-why-capable-agents-still-fail/", }, { title: "Project 01: Baseline vs Minimal Harness", description: "Walk through your first real task.", - href: "./projects/project-01-baseline-vs-minimal-harness/" + href: "./projects/project-01-baseline-vs-minimal-harness/", }, { title: "Templates", description: "Grab the minimal harness pack for your own projects.", - href: "./resources/templates/" - } - ] + href: "./resources/templates/", + }, + ], }; const localeEntries = [ @@ -109,8 +111,8 @@ const localeEntries = [ resources: "Library", skills: "Skills", resourceLibrary: "Resource Library", - tryHarness: "Try Harness ↗" - } + tryHarness: "Try Harness ↗", + }, }, { key: "zh", @@ -130,8 +132,8 @@ const localeEntries = [ sidebarMenu: "菜单", darkModeSwitch: "主题", lightModeSwitchTitle: "切换到浅色模式", - darkModeSwitchTitle: "切换到深色模式" - } + darkModeSwitchTitle: "切换到深色模式", + }, }, { key: "zh-TW", @@ -151,8 +153,8 @@ const localeEntries = [ sidebarMenu: "選單", darkModeSwitch: "主題", lightModeSwitchTitle: "切換到淺色模式", - darkModeSwitchTitle: "切換到深色模式" - } + darkModeSwitchTitle: "切換到深色模式", + }, }, { key: "ja", @@ -173,8 +175,8 @@ const localeEntries = [ sidebarMenu: "メニュー", darkModeSwitch: "テーマ", lightModeSwitchTitle: "ライトモードに切り替え", - darkModeSwitchTitle: "ダークモードに切り替え" - } + darkModeSwitchTitle: "ダークモードに切り替え", + }, }, { key: "es", @@ -195,8 +197,8 @@ const localeEntries = [ sidebarMenu: "Menú", darkModeSwitch: "Tema", lightModeSwitchTitle: "Cambiar a tema claro", - darkModeSwitchTitle: "Cambiar a tema oscuro" - } + darkModeSwitchTitle: "Cambiar a tema oscuro", + }, }, { key: "fr", @@ -217,8 +219,8 @@ const localeEntries = [ sidebarMenu: "Menu", darkModeSwitch: "Thème", lightModeSwitchTitle: "Passer au thème clair", - darkModeSwitchTitle: "Passer au thème sombre" - } + darkModeSwitchTitle: "Passer au thème sombre", + }, }, { key: "de", @@ -239,8 +241,8 @@ const localeEntries = [ sidebarMenu: "Menü", darkModeSwitch: "Theme", lightModeSwitchTitle: "Zum hellen Theme wechseln", - darkModeSwitchTitle: "Zum dunklen Theme wechseln" - } + darkModeSwitchTitle: "Zum dunklen Theme wechseln", + }, }, { key: "ar", @@ -261,8 +263,8 @@ const localeEntries = [ sidebarMenu: "القائمة", darkModeSwitch: "السمة", lightModeSwitchTitle: "التبديل إلى السمة الفاتحة", - darkModeSwitchTitle: "التبديل إلى السمة الداكنة" - } + darkModeSwitchTitle: "التبديل إلى السمة الداكنة", + }, }, { key: "vi", @@ -282,8 +284,8 @@ const localeEntries = [ sidebarMenu: "Menu", darkModeSwitch: "Giao diện", lightModeSwitchTitle: "Chuyển sang chế độ sáng", - darkModeSwitchTitle: "Chuyển sang chế độ tối" - } + darkModeSwitchTitle: "Chuyển sang chế độ tối", + }, }, { key: "ko", @@ -304,8 +306,8 @@ const localeEntries = [ sidebarMenu: "메뉴", darkModeSwitch: "테마", lightModeSwitchTitle: "라이트 모드로 전환", - darkModeSwitchTitle: "다크 모드로 전환" - } + darkModeSwitchTitle: "다크 모드로 전환", + }, }, { key: "uz", @@ -326,8 +328,8 @@ const localeEntries = [ sidebarMenu: "Menyu", darkModeSwitch: "Mavzu", lightModeSwitchTitle: "Yorugʻ rejimga oʻtish", - darkModeSwitchTitle: "Qorongʻi rejimga oʻtish" - } + darkModeSwitchTitle: "Qorongʻi rejimga oʻtish", + }, }, { key: "ru", @@ -348,78 +350,186 @@ const localeEntries = [ sidebarMenu: "Меню", darkModeSwitch: "Тема", lightModeSwitchTitle: "Включить светлую тему", - darkModeSwitchTitle: "Включить тёмную тему" - } - } + darkModeSwitchTitle: "Включить тёмную тему", + }, + }, ]; const sourceItemsByLocale = { en: { lectures: [ { text: "Welcome", link: "/en/" }, - { text: "Why Capable Agents Still Fail", link: "/en/lectures/lecture-01-why-capable-agents-still-fail/" }, - { text: "What a Harness Actually Is", link: "/en/lectures/lecture-02-what-a-harness-actually-is/" }, - { text: "Why the Repository Must Become the System of Record", link: "/en/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/" }, - { text: "Why One Giant Instruction File Fails", link: "/en/lectures/lecture-04-why-one-giant-instruction-file-fails/" }, - { text: "Why Long-Running Tasks Lose Continuity", link: "/en/lectures/lecture-05-why-long-running-tasks-lose-continuity/" }, - { text: "Why Initialization Needs Its Own Phase", link: "/en/lectures/lecture-06-why-initialization-needs-its-own-phase/" }, - { text: "Why Agents Overreach and Under-Finish", link: "/en/lectures/lecture-07-why-agents-overreach-and-under-finish/" }, - { text: "Why Feature Lists Are Harness Primitives", link: "/en/lectures/lecture-08-why-feature-lists-are-harness-primitives/" }, - { text: "Why Agents Declare Victory Too Early", link: "/en/lectures/lecture-09-why-agents-declare-victory-too-early/" }, - { text: "Why End-to-End Testing Changes Results", link: "/en/lectures/lecture-10-why-end-to-end-testing-changes-results/" }, - { text: "Why Observability Belongs Inside the Harness", link: "/en/lectures/lecture-11-why-observability-belongs-inside-the-harness/" }, - { text: "Why Every Session Must Leave a Clean State", link: "/en/lectures/lecture-12-why-every-session-must-leave-a-clean-state/" } + { + text: "Why Capable Agents Still Fail", + link: "/en/lectures/lecture-01-why-capable-agents-still-fail/", + }, + { + text: "What a Harness Actually Is", + link: "/en/lectures/lecture-02-what-a-harness-actually-is/", + }, + { + text: "Why the Repository Must Become the System of Record", + link: "/en/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/", + }, + { + text: "Why One Giant Instruction File Fails", + link: "/en/lectures/lecture-04-why-one-giant-instruction-file-fails/", + }, + { + text: "Why Long-Running Tasks Lose Continuity", + link: "/en/lectures/lecture-05-why-long-running-tasks-lose-continuity/", + }, + { + text: "Why Initialization Needs Its Own Phase", + link: "/en/lectures/lecture-06-why-initialization-needs-its-own-phase/", + }, + { + text: "Why Agents Overreach and Under-Finish", + link: "/en/lectures/lecture-07-why-agents-overreach-and-under-finish/", + }, + { + text: "Why Feature Lists Are Harness Primitives", + link: "/en/lectures/lecture-08-why-feature-lists-are-harness-primitives/", + }, + { + text: "Why Agents Declare Victory Too Early", + link: "/en/lectures/lecture-09-why-agents-declare-victory-too-early/", + }, + { + text: "Why End-to-End Testing Changes Results", + link: "/en/lectures/lecture-10-why-end-to-end-testing-changes-results/", + }, + { + text: "Why Observability Belongs Inside the Harness", + link: "/en/lectures/lecture-11-why-observability-belongs-inside-the-harness/", + }, + { + text: "Why Every Session Must Leave a Clean State", + link: "/en/lectures/lecture-12-why-every-session-must-leave-a-clean-state/", + }, ], projects: [ { text: "Welcome", link: "/en/projects/" }, - { text: "Prompt-Only vs. Rules-First", link: "/en/projects/project-01-baseline-vs-minimal-harness/" }, - { text: "Agent-Readable Workspace", link: "/en/projects/project-02-agent-readable-workspace/" }, - { text: "Multi-Session Continuity", link: "/en/projects/project-03-multi-session-continuity/" }, - { text: "Runtime Feedback and Scope Control", link: "/en/projects/project-04-incremental-indexing/" }, - { text: "Self-Verification and Role Separation", link: "/en/projects/project-05-grounded-qa-verification/" }, - { text: "Complete Harness (Capstone)", link: "/en/projects/project-06-runtime-observability-and-debugging/" } + { + text: "Prompt-Only vs. Rules-First", + link: "/en/projects/project-01-baseline-vs-minimal-harness/", + }, + { + text: "Agent-Readable Workspace", + link: "/en/projects/project-02-agent-readable-workspace/", + }, + { + text: "Multi-Session Continuity", + link: "/en/projects/project-03-multi-session-continuity/", + }, + { + text: "Runtime Feedback and Scope Control", + link: "/en/projects/project-04-incremental-indexing/", + }, + { + text: "Self-Verification and Role Separation", + link: "/en/projects/project-05-grounded-qa-verification/", + }, + { + text: "Complete Harness (Capstone)", + link: "/en/projects/project-06-runtime-observability-and-debugging/", + }, ], resources: [ { text: "Overview", link: "/en/resources/" }, { text: "English Templates", link: "/en/resources/templates/" }, { text: "English Reference", link: "/en/resources/reference/" }, - { text: "Advanced Pack", link: "/en/resources/openai-advanced/" } + { text: "Advanced Pack", link: "/en/resources/openai-advanced/" }, ], - skills: [{ text: "Skills Overview", link: "/en/skills/" }] + skills: [{ text: "Skills Overview", link: "/en/skills/" }], }, ko: { lectures: [ { text: "환영합니다", link: "/ko/" }, - { text: "유능한 에이전트가 여전히 실패하는 이유", link: "/ko/lectures/lecture-01-why-capable-agents-still-fail/" }, - { text: "하네스란 무엇인가", link: "/ko/lectures/lecture-02-what-a-harness-actually-is/" }, - { text: "저장소가 시스템 오브 레코드(SoR)가 되어야 하는 이유", link: "/ko/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/" }, - { text: "거대한 단일 지시 파일이 실패하는 이유", link: "/ko/lectures/lecture-04-why-one-giant-instruction-file-fails/" }, - { text: "장기 작업이 연속성을 잃는 이유", link: "/ko/lectures/lecture-05-why-long-running-tasks-lose-continuity/" }, - { text: "초기화가 별도 단계여야 하는 이유", link: "/ko/lectures/lecture-06-why-initialization-needs-its-own-phase/" }, - { text: "에이전트가 과도하게 손대고 끝맺지 못하는 이유", link: "/ko/lectures/lecture-07-why-agents-overreach-and-under-finish/" }, - { text: "기능 목록이 하네스의 기본 단위인 이유", link: "/ko/lectures/lecture-08-why-feature-lists-are-harness-primitives/" }, - { text: "에이전트가 너무 일찍 완료를 선언하는 이유", link: "/ko/lectures/lecture-09-why-agents-declare-victory-too-early/" }, - { text: "엔드투엔드 테스트가 결과를 바꾸는 이유", link: "/ko/lectures/lecture-10-why-end-to-end-testing-changes-results/" }, - { text: "관측 가능성이 하네스 안에 있어야 하는 이유", link: "/ko/lectures/lecture-11-why-observability-belongs-inside-the-harness/" }, - { text: "모든 세션이 클린 상태로 끝나야 하는 이유", link: "/ko/lectures/lecture-12-why-every-session-must-leave-a-clean-state/" } + { + text: "유능한 에이전트가 여전히 실패하는 이유", + link: "/ko/lectures/lecture-01-why-capable-agents-still-fail/", + }, + { + text: "하네스란 무엇인가", + link: "/ko/lectures/lecture-02-what-a-harness-actually-is/", + }, + { + text: "저장소가 시스템 오브 레코드(SoR)가 되어야 하는 이유", + link: "/ko/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/", + }, + { + text: "거대한 단일 지시 파일이 실패하는 이유", + link: "/ko/lectures/lecture-04-why-one-giant-instruction-file-fails/", + }, + { + text: "장기 작업이 연속성을 잃는 이유", + link: "/ko/lectures/lecture-05-why-long-running-tasks-lose-continuity/", + }, + { + text: "초기화가 별도 단계여야 하는 이유", + link: "/ko/lectures/lecture-06-why-initialization-needs-its-own-phase/", + }, + { + text: "에이전트가 과도하게 손대고 끝맺지 못하는 이유", + link: "/ko/lectures/lecture-07-why-agents-overreach-and-under-finish/", + }, + { + text: "기능 목록이 하네스의 기본 단위인 이유", + link: "/ko/lectures/lecture-08-why-feature-lists-are-harness-primitives/", + }, + { + text: "에이전트가 너무 일찍 완료를 선언하는 이유", + link: "/ko/lectures/lecture-09-why-agents-declare-victory-too-early/", + }, + { + text: "엔드투엔드 테스트가 결과를 바꾸는 이유", + link: "/ko/lectures/lecture-10-why-end-to-end-testing-changes-results/", + }, + { + text: "관측 가능성이 하네스 안에 있어야 하는 이유", + link: "/ko/lectures/lecture-11-why-observability-belongs-inside-the-harness/", + }, + { + text: "모든 세션이 클린 상태로 끝나야 하는 이유", + link: "/ko/lectures/lecture-12-why-every-session-must-leave-a-clean-state/", + }, ], projects: [ { text: "환영합니다", link: "/ko/projects/" }, - { text: "프롬프트 단독 vs 규칙 우선", link: "/ko/projects/project-01-baseline-vs-minimal-harness/" }, - { text: "에이전트가 읽을 수 있는 작업 공간", link: "/ko/projects/project-02-agent-readable-workspace/" }, - { text: "다중 세션 연속성", link: "/ko/projects/project-03-multi-session-continuity/" }, - { text: "런타임 피드백과 범위 제어", link: "/ko/projects/project-04-incremental-indexing/" }, - { text: "자기 검증과 역할 분리", link: "/ko/projects/project-05-grounded-qa-verification/" }, - { text: "완성형 하네스(캡스톤)", link: "/ko/projects/project-06-runtime-observability-and-debugging/" } + { + text: "프롬프트 단독 vs 규칙 우선", + link: "/ko/projects/project-01-baseline-vs-minimal-harness/", + }, + { + text: "에이전트가 읽을 수 있는 작업 공간", + link: "/ko/projects/project-02-agent-readable-workspace/", + }, + { + text: "다중 세션 연속성", + link: "/ko/projects/project-03-multi-session-continuity/", + }, + { + text: "런타임 피드백과 범위 제어", + link: "/ko/projects/project-04-incremental-indexing/", + }, + { + text: "자기 검증과 역할 분리", + link: "/ko/projects/project-05-grounded-qa-verification/", + }, + { + text: "완성형 하네스(캡스톤)", + link: "/ko/projects/project-06-runtime-observability-and-debugging/", + }, ], resources: [ { text: "리소스 모음 개요", link: "/ko/resources/" }, { text: "한국어 템플릿", link: "/ko/resources/templates/" }, { text: "한국어 레퍼런스", link: "/ko/resources/reference/" }, - { text: "고급 리소스 팩", link: "/ko/resources/openai-advanced/" } + { text: "고급 리소스 팩", link: "/ko/resources/openai-advanced/" }, ], - skills: [{ text: "스킬 개요", link: "/ko/skills/" }] - } + skills: [{ text: "스킬 개요", link: "/ko/skills/" }], + }, }; const homeByLocale = { @@ -430,15 +540,15 @@ const homeByLocale = { title: "Learn Harness Engineering에 오신 것을 환영합니다", intro: [ "Learn Harness Engineering은 AI 코딩 에이전트의 엔지니어링에 집중하는 강의입니다. 업계에서 가장 앞선 하네스 엔지니어링 이론과 실천을 깊이 정리했습니다.", - "체계적인 환경 설계, 상태 관리, 검증, 제어 시스템을 통해 Codex와 Claude Code 같은 도구를 실제로 신뢰할 수 있게 만드는 방법을 다룹니다." + "체계적인 환경 설계, 상태 관리, 검증, 제어 시스템을 통해 Codex와 Claude Code 같은 도구를 실제로 신뢰할 수 있게 만드는 방법을 다룹니다.", ], - references: defaultHome.hero.references + references: defaultHome.hero.references, }, sections: { start: "시작하기", mechanism: "하네스의 핵심 메커니즘", learn: "이 강의에서 배우는 것", - next: "다음 단계" + next: "다음 단계", }, startText: "학습 경로를 선택해 시작하세요. 강의는 이론 강의, 실습 프로젝트, 즉시 사용 가능한 리소스 모음으로 구성됩니다.", @@ -446,18 +556,18 @@ const homeByLocale = { { title: "강의(Lectures)", body: "강력한 모델이 왜 여전히 실패하는지 이해하고, 효과적인 하네스의 이론을 배웁니다.", - href: "./lectures/lecture-01-why-capable-agents-still-fail/" + href: "./lectures/lecture-01-why-capable-agents-still-fail/", }, { title: "프로젝트(Projects)", body: "믿을 수 있는 에이전트 환경을 처음부터 직접 만들어 보는 실습입니다.", - href: "./projects/" + href: "./projects/", }, { title: "리소스 모음(Resource Library)", body: "여러분의 저장소에서 바로 쓸 수 있는 복사용 템플릿입니다.", - href: "./resources/" - } + href: "./resources/", + }, ], mechanismText: '하네스는 모델을 "더 똑똑하게" 만드는 것이 아니라, 모델을 위한 닫힌 루프 작업 시스템을 만듭니다.', @@ -466,7 +576,7 @@ const homeByLocale = { "장시간·다중 세션 작업에서도 컨텍스트를 유지합니다.", "에이전트가 너무 빨리 완료를 선언하지 못하게 합니다.", "전체 파이프라인 테스트와 자기 점검으로 결과물을 검증합니다.", - "런타임을 관측·디버깅 가능하게 만듭니다." + "런타임을 관측·디버깅 가능하게 만듭니다.", ], nextIntro: "핵심 개념이 익숙해졌다면, 다음 자료로 한 걸음 더 들어가 보세요.", @@ -474,20 +584,20 @@ const homeByLocale = { { title: "강의 01: 유능한 에이전트가 여전히 실패하는 이유", description: "하네스 엔지니어링의 이론적 출발점입니다.", - href: "./lectures/lecture-01-why-capable-agents-still-fail/" + href: "./lectures/lecture-01-why-capable-agents-still-fail/", }, { title: "프로젝트 01: 베이스라인 vs 미니멀 하네스", description: "첫 실제 과제를 처음부터 진행해 봅니다.", - href: "./projects/project-01-baseline-vs-minimal-harness/" + href: "./projects/project-01-baseline-vs-minimal-harness/", }, { title: "템플릿(Templates)", description: "미니멀 하네스 팩을 자신의 프로젝트에 바로 적용해 보세요.", - href: "./resources/templates/" - } - ] - } + href: "./resources/templates/", + }, + ], + }, }; const courseManifest = { @@ -496,32 +606,30 @@ const courseManifest = { description: "A project-based course on designing the environments, state, verification, and control systems that make Codex and Claude Code reliable.", base: "/course-builder/", - repoTreeUrl: "https://github.com/puppe1990/course-builder/tree/main" + repoTreeUrl: "https://github.com/puppe1990/course-builder/tree/main", }, brand: { - logo: brandLogo + logo: brandLogo, }, theme: { fontStylesheets: [ - "https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,400;9..144,500;9..144,600&family=Instrument+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap" + "https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,400;9..144,500;9..144,600&family=Instrument+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap", ], typography: { - body: - "'Instrument Sans', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif", + body: "'Instrument Sans', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif", heading: "'Fraunces', ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif", - mono: - "'JetBrains Mono', 'Fira Code', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace", - mermaid: "'Instrument Sans', sans-serif" + mono: "'JetBrains Mono', 'Fira Code', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace", + mermaid: "'Instrument Sans', sans-serif", }, layout: { maxWidth: "1376px", sidebarWidth: "296px", - cardRadius: "12px" + cardRadius: "12px", }, effects: { featureShadow: "0 18px 48px rgba(217, 92, 65, 0.12)", - featureShadowDark: "0 18px 48px rgba(0, 0, 0, 0.35)" + featureShadowDark: "0 18px 48px rgba(0, 0, 0, 0.35)", }, colors: { light: { @@ -538,7 +646,7 @@ const courseManifest = { brandSoft: "rgba(217, 92, 65, 0.1)", divider: "rgba(0, 0, 0, 0.08)", sidebarBg: "#F4F3EE", - navBg: "#FAF9F5" + navBg: "#FAF9F5", }, dark: { bg: "#1A1A1A", @@ -554,13 +662,13 @@ const courseManifest = { brandSoft: "rgba(224, 122, 100, 0.15)", divider: "rgba(255, 255, 255, 0.1)", sidebarBg: "#141414", - navBg: "#1A1A1A" - } - } + navBg: "#1A1A1A", + }, + }, }, locales: localeEntries, curriculum: sourceItemsByLocale, - homeByLocale + homeByLocale, }; export default courseManifest; diff --git a/docs/ar/index.md b/courses/learn-harness-engineering/docs/ar/index.md similarity index 100% rename from docs/ar/index.md rename to courses/learn-harness-engineering/docs/ar/index.md diff --git a/docs/ar/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts b/courses/learn-harness-engineering/docs/ar/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts similarity index 100% rename from docs/ar/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts diff --git a/docs/ar/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md similarity index 100% rename from docs/ar/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md diff --git a/docs/ar/lectures/lecture-01-why-capable-agents-still-fail/code/index.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-01-why-capable-agents-still-fail/code/index.md similarity index 100% rename from docs/ar/lectures/lecture-01-why-capable-agents-still-fail/code/index.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-01-why-capable-agents-still-fail/code/index.md diff --git a/docs/ar/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md similarity index 100% rename from docs/ar/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md diff --git a/docs/ar/lectures/lecture-01-why-capable-agents-still-fail/index.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-01-why-capable-agents-still-fail/index.md similarity index 100% rename from docs/ar/lectures/lecture-01-why-capable-agents-still-fail/index.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-01-why-capable-agents-still-fail/index.md diff --git a/docs/ar/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md similarity index 100% rename from docs/ar/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md diff --git a/docs/ar/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts b/courses/learn-harness-engineering/docs/ar/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts similarity index 100% rename from docs/ar/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts diff --git a/docs/ar/lectures/lecture-02-what-a-harness-actually-is/code/index.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-02-what-a-harness-actually-is/code/index.md similarity index 100% rename from docs/ar/lectures/lecture-02-what-a-harness-actually-is/code/index.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-02-what-a-harness-actually-is/code/index.md diff --git a/docs/ar/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts b/courses/learn-harness-engineering/docs/ar/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts similarity index 100% rename from docs/ar/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts diff --git a/docs/ar/lectures/lecture-02-what-a-harness-actually-is/index.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-02-what-a-harness-actually-is/index.md similarity index 100% rename from docs/ar/lectures/lecture-02-what-a-harness-actually-is/index.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-02-what-a-harness-actually-is/index.md diff --git a/docs/ar/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md similarity index 100% rename from docs/ar/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md diff --git a/docs/ar/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt b/courses/learn-harness-engineering/docs/ar/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt similarity index 100% rename from docs/ar/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt diff --git a/docs/ar/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts b/courses/learn-harness-engineering/docs/ar/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts similarity index 100% rename from docs/ar/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts diff --git a/docs/ar/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md similarity index 100% rename from docs/ar/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md diff --git a/docs/ar/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md similarity index 100% rename from docs/ar/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md diff --git a/docs/ar/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md similarity index 100% rename from docs/ar/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md diff --git a/docs/ar/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md similarity index 100% rename from docs/ar/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md diff --git a/docs/ar/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md similarity index 100% rename from docs/ar/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md diff --git a/docs/ar/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts b/courses/learn-harness-engineering/docs/ar/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts similarity index 100% rename from docs/ar/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts diff --git a/docs/ar/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md similarity index 100% rename from docs/ar/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md diff --git a/docs/ar/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md similarity index 100% rename from docs/ar/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md diff --git a/docs/ar/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md similarity index 100% rename from docs/ar/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md diff --git a/docs/ar/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md similarity index 100% rename from docs/ar/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md diff --git a/docs/ar/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts b/courses/learn-harness-engineering/docs/ar/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts similarity index 100% rename from docs/ar/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts diff --git a/docs/ar/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md similarity index 100% rename from docs/ar/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md diff --git a/docs/ar/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md similarity index 100% rename from docs/ar/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md diff --git a/docs/ar/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts b/courses/learn-harness-engineering/docs/ar/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts similarity index 100% rename from docs/ar/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts diff --git a/docs/ar/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh b/courses/learn-harness-engineering/docs/ar/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh similarity index 100% rename from docs/ar/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh diff --git a/docs/ar/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md similarity index 100% rename from docs/ar/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md diff --git a/docs/ar/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md similarity index 100% rename from docs/ar/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md diff --git a/docs/ar/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md similarity index 100% rename from docs/ar/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md diff --git a/docs/ar/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md similarity index 100% rename from docs/ar/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md diff --git a/docs/ar/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md similarity index 100% rename from docs/ar/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md diff --git a/docs/ar/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts b/courses/learn-harness-engineering/docs/ar/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts similarity index 100% rename from docs/ar/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts diff --git a/docs/ar/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md similarity index 100% rename from docs/ar/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md diff --git a/docs/ar/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts b/courses/learn-harness-engineering/docs/ar/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts similarity index 100% rename from docs/ar/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts diff --git a/docs/ar/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json b/courses/learn-harness-engineering/docs/ar/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json similarity index 100% rename from docs/ar/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json diff --git a/docs/ar/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md similarity index 100% rename from docs/ar/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md diff --git a/docs/ar/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md similarity index 100% rename from docs/ar/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md diff --git a/docs/ar/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md similarity index 100% rename from docs/ar/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md diff --git a/docs/ar/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md similarity index 100% rename from docs/ar/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md diff --git a/docs/ar/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md similarity index 100% rename from docs/ar/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md diff --git a/docs/ar/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts b/courses/learn-harness-engineering/docs/ar/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts similarity index 100% rename from docs/ar/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts diff --git a/docs/ar/lectures/lecture-09-why-agents-declare-victory-too-early/index.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-09-why-agents-declare-victory-too-early/index.md similarity index 100% rename from docs/ar/lectures/lecture-09-why-agents-declare-victory-too-early/index.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-09-why-agents-declare-victory-too-early/index.md diff --git a/docs/ar/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md similarity index 100% rename from docs/ar/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md diff --git a/docs/ar/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts b/courses/learn-harness-engineering/docs/ar/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts similarity index 100% rename from docs/ar/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts diff --git a/docs/ar/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md similarity index 100% rename from docs/ar/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md diff --git a/docs/ar/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md similarity index 100% rename from docs/ar/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md diff --git a/docs/ar/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md similarity index 100% rename from docs/ar/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md diff --git a/docs/ar/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md similarity index 100% rename from docs/ar/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md diff --git a/docs/ar/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md similarity index 100% rename from docs/ar/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md diff --git a/docs/ar/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts b/courses/learn-harness-engineering/docs/ar/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts similarity index 100% rename from docs/ar/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts diff --git a/docs/ar/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md similarity index 100% rename from docs/ar/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md diff --git a/docs/ar/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md similarity index 100% rename from docs/ar/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md diff --git a/docs/ar/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md similarity index 100% rename from docs/ar/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md diff --git a/docs/ar/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts b/courses/learn-harness-engineering/docs/ar/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts similarity index 100% rename from docs/ar/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts diff --git a/docs/ar/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md similarity index 100% rename from docs/ar/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md diff --git a/docs/ar/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts b/courses/learn-harness-engineering/docs/ar/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts similarity index 100% rename from docs/ar/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts diff --git a/docs/ar/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md similarity index 100% rename from docs/ar/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md diff --git a/docs/ar/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md b/courses/learn-harness-engineering/docs/ar/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md similarity index 100% rename from docs/ar/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md rename to courses/learn-harness-engineering/docs/ar/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md diff --git a/docs/ar/projects/index.md b/courses/learn-harness-engineering/docs/ar/projects/index.md similarity index 100% rename from docs/ar/projects/index.md rename to courses/learn-harness-engineering/docs/ar/projects/index.md diff --git a/docs/ar/projects/project-01-baseline-vs-minimal-harness/index.md b/courses/learn-harness-engineering/docs/ar/projects/project-01-baseline-vs-minimal-harness/index.md similarity index 100% rename from docs/ar/projects/project-01-baseline-vs-minimal-harness/index.md rename to courses/learn-harness-engineering/docs/ar/projects/project-01-baseline-vs-minimal-harness/index.md diff --git a/docs/ar/projects/project-02-agent-readable-workspace/index.md b/courses/learn-harness-engineering/docs/ar/projects/project-02-agent-readable-workspace/index.md similarity index 100% rename from docs/ar/projects/project-02-agent-readable-workspace/index.md rename to courses/learn-harness-engineering/docs/ar/projects/project-02-agent-readable-workspace/index.md diff --git a/docs/ar/projects/project-03-multi-session-continuity/index.md b/courses/learn-harness-engineering/docs/ar/projects/project-03-multi-session-continuity/index.md similarity index 100% rename from docs/ar/projects/project-03-multi-session-continuity/index.md rename to courses/learn-harness-engineering/docs/ar/projects/project-03-multi-session-continuity/index.md diff --git a/docs/ar/projects/project-04-incremental-indexing/index.md b/courses/learn-harness-engineering/docs/ar/projects/project-04-incremental-indexing/index.md similarity index 100% rename from docs/ar/projects/project-04-incremental-indexing/index.md rename to courses/learn-harness-engineering/docs/ar/projects/project-04-incremental-indexing/index.md diff --git a/docs/ar/projects/project-05-grounded-qa-verification/index.md b/courses/learn-harness-engineering/docs/ar/projects/project-05-grounded-qa-verification/index.md similarity index 100% rename from docs/ar/projects/project-05-grounded-qa-verification/index.md rename to courses/learn-harness-engineering/docs/ar/projects/project-05-grounded-qa-verification/index.md diff --git a/docs/ar/projects/project-06-runtime-observability-and-debugging/index.md b/courses/learn-harness-engineering/docs/ar/projects/project-06-runtime-observability-and-debugging/index.md similarity index 100% rename from docs/ar/projects/project-06-runtime-observability-and-debugging/index.md rename to courses/learn-harness-engineering/docs/ar/projects/project-06-runtime-observability-and-debugging/index.md diff --git a/docs/ar/resources/index.md b/courses/learn-harness-engineering/docs/ar/resources/index.md similarity index 100% rename from docs/ar/resources/index.md rename to courses/learn-harness-engineering/docs/ar/resources/index.md diff --git a/docs/ar/resources/openai-advanced/index.md b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/index.md similarity index 100% rename from docs/ar/resources/openai-advanced/index.md rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/index.md diff --git a/docs/ar/resources/openai-advanced/repo-template/AGENTS.md b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/AGENTS.md similarity index 100% rename from docs/ar/resources/openai-advanced/repo-template/AGENTS.md rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/AGENTS.md diff --git a/docs/ar/resources/openai-advanced/repo-template/ARCHITECTURE.md b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/ARCHITECTURE.md similarity index 100% rename from docs/ar/resources/openai-advanced/repo-template/ARCHITECTURE.md rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/ARCHITECTURE.md diff --git a/docs/ar/resources/openai-advanced/repo-template/docs/DESIGN.md b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/DESIGN.md similarity index 100% rename from docs/ar/resources/openai-advanced/repo-template/docs/DESIGN.md rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/DESIGN.md diff --git a/docs/ar/resources/openai-advanced/repo-template/docs/FRONTEND.md b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/FRONTEND.md similarity index 100% rename from docs/ar/resources/openai-advanced/repo-template/docs/FRONTEND.md rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/FRONTEND.md diff --git a/docs/ar/resources/openai-advanced/repo-template/docs/PLANS.md b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/PLANS.md similarity index 100% rename from docs/ar/resources/openai-advanced/repo-template/docs/PLANS.md rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/PLANS.md diff --git a/docs/ar/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md similarity index 100% rename from docs/ar/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md diff --git a/docs/ar/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md similarity index 100% rename from docs/ar/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md diff --git a/docs/ar/resources/openai-advanced/repo-template/docs/RELIABILITY.md b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/RELIABILITY.md similarity index 100% rename from docs/ar/resources/openai-advanced/repo-template/docs/RELIABILITY.md rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/RELIABILITY.md diff --git a/docs/ar/resources/openai-advanced/repo-template/docs/SECURITY.md b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/SECURITY.md similarity index 100% rename from docs/ar/resources/openai-advanced/repo-template/docs/SECURITY.md rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/SECURITY.md diff --git a/docs/ar/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md similarity index 100% rename from docs/ar/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md diff --git a/docs/ar/resources/openai-advanced/repo-template/docs/design-docs/index.md b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/design-docs/index.md similarity index 100% rename from docs/ar/resources/openai-advanced/repo-template/docs/design-docs/index.md rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/design-docs/index.md diff --git a/docs/ar/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md similarity index 100% rename from docs/ar/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md diff --git a/docs/ar/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md similarity index 100% rename from docs/ar/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md diff --git a/docs/ar/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md similarity index 100% rename from docs/ar/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md diff --git a/docs/ar/resources/openai-advanced/repo-template/docs/generated/db-schema.md b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/generated/db-schema.md similarity index 100% rename from docs/ar/resources/openai-advanced/repo-template/docs/generated/db-schema.md rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/generated/db-schema.md diff --git a/docs/ar/resources/openai-advanced/repo-template/docs/product-specs/index.md b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/product-specs/index.md similarity index 100% rename from docs/ar/resources/openai-advanced/repo-template/docs/product-specs/index.md rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/product-specs/index.md diff --git a/docs/ar/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md similarity index 100% rename from docs/ar/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md diff --git a/docs/ar/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt similarity index 100% rename from docs/ar/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt diff --git a/docs/ar/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt similarity index 100% rename from docs/ar/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt diff --git a/docs/ar/resources/openai-advanced/repo-template/docs/references/uv-llms.txt b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/references/uv-llms.txt similarity index 100% rename from docs/ar/resources/openai-advanced/repo-template/docs/references/uv-llms.txt rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/docs/references/uv-llms.txt diff --git a/docs/ar/resources/openai-advanced/repo-template/index.md b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/index.md similarity index 100% rename from docs/ar/resources/openai-advanced/repo-template/index.md rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/repo-template/index.md diff --git a/docs/ar/resources/openai-advanced/sops/chrome-devtools-validation-loop.md b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/sops/chrome-devtools-validation-loop.md similarity index 100% rename from docs/ar/resources/openai-advanced/sops/chrome-devtools-validation-loop.md rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/sops/chrome-devtools-validation-loop.md diff --git a/docs/ar/resources/openai-advanced/sops/encode-knowledge-into-repo.md b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/sops/encode-knowledge-into-repo.md similarity index 100% rename from docs/ar/resources/openai-advanced/sops/encode-knowledge-into-repo.md rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/sops/encode-knowledge-into-repo.md diff --git a/docs/ar/resources/openai-advanced/sops/index.md b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/sops/index.md similarity index 100% rename from docs/ar/resources/openai-advanced/sops/index.md rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/sops/index.md diff --git a/docs/ar/resources/openai-advanced/sops/layered-domain-architecture.md b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/sops/layered-domain-architecture.md similarity index 100% rename from docs/ar/resources/openai-advanced/sops/layered-domain-architecture.md rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/sops/layered-domain-architecture.md diff --git a/docs/ar/resources/openai-advanced/sops/observability-feedback-loop.md b/courses/learn-harness-engineering/docs/ar/resources/openai-advanced/sops/observability-feedback-loop.md similarity index 100% rename from docs/ar/resources/openai-advanced/sops/observability-feedback-loop.md rename to courses/learn-harness-engineering/docs/ar/resources/openai-advanced/sops/observability-feedback-loop.md diff --git a/docs/ar/resources/reference/coding-agent-startup-flow.md b/courses/learn-harness-engineering/docs/ar/resources/reference/coding-agent-startup-flow.md similarity index 100% rename from docs/ar/resources/reference/coding-agent-startup-flow.md rename to courses/learn-harness-engineering/docs/ar/resources/reference/coding-agent-startup-flow.md diff --git a/docs/ar/resources/reference/index.md b/courses/learn-harness-engineering/docs/ar/resources/reference/index.md similarity index 100% rename from docs/ar/resources/reference/index.md rename to courses/learn-harness-engineering/docs/ar/resources/reference/index.md diff --git a/docs/ar/resources/reference/initializer-agent-playbook.md b/courses/learn-harness-engineering/docs/ar/resources/reference/initializer-agent-playbook.md similarity index 100% rename from docs/ar/resources/reference/initializer-agent-playbook.md rename to courses/learn-harness-engineering/docs/ar/resources/reference/initializer-agent-playbook.md diff --git a/docs/ar/resources/reference/method-map.md b/courses/learn-harness-engineering/docs/ar/resources/reference/method-map.md similarity index 100% rename from docs/ar/resources/reference/method-map.md rename to courses/learn-harness-engineering/docs/ar/resources/reference/method-map.md diff --git a/docs/ar/resources/reference/prompt-calibration.md b/courses/learn-harness-engineering/docs/ar/resources/reference/prompt-calibration.md similarity index 100% rename from docs/ar/resources/reference/prompt-calibration.md rename to courses/learn-harness-engineering/docs/ar/resources/reference/prompt-calibration.md diff --git a/docs/ar/resources/templates/AGENTS.md b/courses/learn-harness-engineering/docs/ar/resources/templates/AGENTS.md similarity index 100% rename from docs/ar/resources/templates/AGENTS.md rename to courses/learn-harness-engineering/docs/ar/resources/templates/AGENTS.md diff --git a/docs/ar/resources/templates/CLAUDE.md b/courses/learn-harness-engineering/docs/ar/resources/templates/CLAUDE.md similarity index 100% rename from docs/ar/resources/templates/CLAUDE.md rename to courses/learn-harness-engineering/docs/ar/resources/templates/CLAUDE.md diff --git a/docs/ar/resources/templates/claude-progress.md b/courses/learn-harness-engineering/docs/ar/resources/templates/claude-progress.md similarity index 100% rename from docs/ar/resources/templates/claude-progress.md rename to courses/learn-harness-engineering/docs/ar/resources/templates/claude-progress.md diff --git a/docs/ar/resources/templates/clean-state-checklist.md b/courses/learn-harness-engineering/docs/ar/resources/templates/clean-state-checklist.md similarity index 100% rename from docs/ar/resources/templates/clean-state-checklist.md rename to courses/learn-harness-engineering/docs/ar/resources/templates/clean-state-checklist.md diff --git a/docs/ar/resources/templates/evaluator-rubric.md b/courses/learn-harness-engineering/docs/ar/resources/templates/evaluator-rubric.md similarity index 100% rename from docs/ar/resources/templates/evaluator-rubric.md rename to courses/learn-harness-engineering/docs/ar/resources/templates/evaluator-rubric.md diff --git a/docs/ar/resources/templates/feature_list.json b/courses/learn-harness-engineering/docs/ar/resources/templates/feature_list.json similarity index 100% rename from docs/ar/resources/templates/feature_list.json rename to courses/learn-harness-engineering/docs/ar/resources/templates/feature_list.json diff --git a/docs/ar/resources/templates/index.md b/courses/learn-harness-engineering/docs/ar/resources/templates/index.md similarity index 100% rename from docs/ar/resources/templates/index.md rename to courses/learn-harness-engineering/docs/ar/resources/templates/index.md diff --git a/docs/ar/resources/templates/init.sh b/courses/learn-harness-engineering/docs/ar/resources/templates/init.sh similarity index 100% rename from docs/ar/resources/templates/init.sh rename to courses/learn-harness-engineering/docs/ar/resources/templates/init.sh diff --git a/docs/ar/resources/templates/quality-document.md b/courses/learn-harness-engineering/docs/ar/resources/templates/quality-document.md similarity index 100% rename from docs/ar/resources/templates/quality-document.md rename to courses/learn-harness-engineering/docs/ar/resources/templates/quality-document.md diff --git a/docs/ar/resources/templates/session-handoff.md b/courses/learn-harness-engineering/docs/ar/resources/templates/session-handoff.md similarity index 100% rename from docs/ar/resources/templates/session-handoff.md rename to courses/learn-harness-engineering/docs/ar/resources/templates/session-handoff.md diff --git a/docs/ar/skills/index.md b/courses/learn-harness-engineering/docs/ar/skills/index.md similarity index 100% rename from docs/ar/skills/index.md rename to courses/learn-harness-engineering/docs/ar/skills/index.md diff --git a/docs/de/index.md b/courses/learn-harness-engineering/docs/de/index.md similarity index 100% rename from docs/de/index.md rename to courses/learn-harness-engineering/docs/de/index.md diff --git a/docs/de/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts b/courses/learn-harness-engineering/docs/de/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts similarity index 100% rename from docs/de/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts rename to courses/learn-harness-engineering/docs/de/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts diff --git a/docs/de/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md similarity index 100% rename from docs/de/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md diff --git a/docs/de/lectures/lecture-01-why-capable-agents-still-fail/code/index.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-01-why-capable-agents-still-fail/code/index.md similarity index 100% rename from docs/de/lectures/lecture-01-why-capable-agents-still-fail/code/index.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-01-why-capable-agents-still-fail/code/index.md diff --git a/docs/de/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md similarity index 100% rename from docs/de/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md diff --git a/docs/de/lectures/lecture-01-why-capable-agents-still-fail/index.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-01-why-capable-agents-still-fail/index.md similarity index 100% rename from docs/de/lectures/lecture-01-why-capable-agents-still-fail/index.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-01-why-capable-agents-still-fail/index.md diff --git a/docs/de/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md similarity index 100% rename from docs/de/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md diff --git a/docs/de/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts b/courses/learn-harness-engineering/docs/de/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts similarity index 100% rename from docs/de/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts rename to courses/learn-harness-engineering/docs/de/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts diff --git a/docs/de/lectures/lecture-02-what-a-harness-actually-is/code/index.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-02-what-a-harness-actually-is/code/index.md similarity index 100% rename from docs/de/lectures/lecture-02-what-a-harness-actually-is/code/index.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-02-what-a-harness-actually-is/code/index.md diff --git a/docs/de/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts b/courses/learn-harness-engineering/docs/de/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts similarity index 100% rename from docs/de/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts rename to courses/learn-harness-engineering/docs/de/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts diff --git a/docs/de/lectures/lecture-02-what-a-harness-actually-is/index.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-02-what-a-harness-actually-is/index.md similarity index 100% rename from docs/de/lectures/lecture-02-what-a-harness-actually-is/index.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-02-what-a-harness-actually-is/index.md diff --git a/docs/de/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md similarity index 100% rename from docs/de/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md diff --git a/docs/de/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt b/courses/learn-harness-engineering/docs/de/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt similarity index 100% rename from docs/de/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt rename to courses/learn-harness-engineering/docs/de/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt diff --git a/docs/de/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts b/courses/learn-harness-engineering/docs/de/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts similarity index 100% rename from docs/de/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts rename to courses/learn-harness-engineering/docs/de/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts diff --git a/docs/de/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md similarity index 100% rename from docs/de/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md diff --git a/docs/de/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md similarity index 100% rename from docs/de/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md diff --git a/docs/de/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md similarity index 100% rename from docs/de/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md diff --git a/docs/de/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md similarity index 100% rename from docs/de/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md diff --git a/docs/de/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md similarity index 100% rename from docs/de/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md diff --git a/docs/de/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts b/courses/learn-harness-engineering/docs/de/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts similarity index 100% rename from docs/de/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts rename to courses/learn-harness-engineering/docs/de/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts diff --git a/docs/de/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md similarity index 100% rename from docs/de/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md diff --git a/docs/de/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md similarity index 100% rename from docs/de/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md diff --git a/docs/de/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md similarity index 100% rename from docs/de/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md diff --git a/docs/de/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md similarity index 100% rename from docs/de/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md diff --git a/docs/de/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts b/courses/learn-harness-engineering/docs/de/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts similarity index 100% rename from docs/de/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts rename to courses/learn-harness-engineering/docs/de/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts diff --git a/docs/de/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md similarity index 100% rename from docs/de/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md diff --git a/docs/de/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md similarity index 100% rename from docs/de/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md diff --git a/docs/de/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts b/courses/learn-harness-engineering/docs/de/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts similarity index 100% rename from docs/de/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts rename to courses/learn-harness-engineering/docs/de/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts diff --git a/docs/de/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh b/courses/learn-harness-engineering/docs/de/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh similarity index 100% rename from docs/de/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh rename to courses/learn-harness-engineering/docs/de/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh diff --git a/docs/de/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md similarity index 100% rename from docs/de/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md diff --git a/docs/de/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md similarity index 100% rename from docs/de/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md diff --git a/docs/de/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md similarity index 100% rename from docs/de/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md diff --git a/docs/de/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md similarity index 100% rename from docs/de/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md diff --git a/docs/de/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md similarity index 100% rename from docs/de/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md diff --git a/docs/de/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts b/courses/learn-harness-engineering/docs/de/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts similarity index 100% rename from docs/de/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts rename to courses/learn-harness-engineering/docs/de/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts diff --git a/docs/de/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md similarity index 100% rename from docs/de/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md diff --git a/docs/de/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts b/courses/learn-harness-engineering/docs/de/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts similarity index 100% rename from docs/de/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts rename to courses/learn-harness-engineering/docs/de/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts diff --git a/docs/de/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json b/courses/learn-harness-engineering/docs/de/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json similarity index 100% rename from docs/de/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json rename to courses/learn-harness-engineering/docs/de/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json diff --git a/docs/de/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md similarity index 100% rename from docs/de/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md diff --git a/docs/de/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md similarity index 100% rename from docs/de/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md diff --git a/docs/de/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md similarity index 100% rename from docs/de/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md diff --git a/docs/de/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md similarity index 100% rename from docs/de/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md diff --git a/docs/de/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md similarity index 100% rename from docs/de/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md diff --git a/docs/de/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts b/courses/learn-harness-engineering/docs/de/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts similarity index 100% rename from docs/de/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts rename to courses/learn-harness-engineering/docs/de/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts diff --git a/docs/de/lectures/lecture-09-why-agents-declare-victory-too-early/index.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-09-why-agents-declare-victory-too-early/index.md similarity index 100% rename from docs/de/lectures/lecture-09-why-agents-declare-victory-too-early/index.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-09-why-agents-declare-victory-too-early/index.md diff --git a/docs/de/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md similarity index 100% rename from docs/de/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md diff --git a/docs/de/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts b/courses/learn-harness-engineering/docs/de/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts similarity index 100% rename from docs/de/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts rename to courses/learn-harness-engineering/docs/de/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts diff --git a/docs/de/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md similarity index 100% rename from docs/de/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md diff --git a/docs/de/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md similarity index 100% rename from docs/de/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md diff --git a/docs/de/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md similarity index 100% rename from docs/de/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md diff --git a/docs/de/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md similarity index 100% rename from docs/de/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md diff --git a/docs/de/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md similarity index 100% rename from docs/de/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md diff --git a/docs/de/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts b/courses/learn-harness-engineering/docs/de/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts similarity index 100% rename from docs/de/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts rename to courses/learn-harness-engineering/docs/de/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts diff --git a/docs/de/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md similarity index 100% rename from docs/de/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md diff --git a/docs/de/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md similarity index 100% rename from docs/de/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md diff --git a/docs/de/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md similarity index 100% rename from docs/de/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md diff --git a/docs/de/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts b/courses/learn-harness-engineering/docs/de/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts similarity index 100% rename from docs/de/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts rename to courses/learn-harness-engineering/docs/de/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts diff --git a/docs/de/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md similarity index 100% rename from docs/de/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md diff --git a/docs/de/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts b/courses/learn-harness-engineering/docs/de/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts similarity index 100% rename from docs/de/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts rename to courses/learn-harness-engineering/docs/de/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts diff --git a/docs/de/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md similarity index 100% rename from docs/de/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md diff --git a/docs/de/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md b/courses/learn-harness-engineering/docs/de/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md similarity index 100% rename from docs/de/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md rename to courses/learn-harness-engineering/docs/de/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md diff --git a/docs/de/projects/index.md b/courses/learn-harness-engineering/docs/de/projects/index.md similarity index 100% rename from docs/de/projects/index.md rename to courses/learn-harness-engineering/docs/de/projects/index.md diff --git a/docs/de/projects/project-01-baseline-vs-minimal-harness/index.md b/courses/learn-harness-engineering/docs/de/projects/project-01-baseline-vs-minimal-harness/index.md similarity index 100% rename from docs/de/projects/project-01-baseline-vs-minimal-harness/index.md rename to courses/learn-harness-engineering/docs/de/projects/project-01-baseline-vs-minimal-harness/index.md diff --git a/docs/de/projects/project-02-agent-readable-workspace/index.md b/courses/learn-harness-engineering/docs/de/projects/project-02-agent-readable-workspace/index.md similarity index 100% rename from docs/de/projects/project-02-agent-readable-workspace/index.md rename to courses/learn-harness-engineering/docs/de/projects/project-02-agent-readable-workspace/index.md diff --git a/docs/de/projects/project-03-multi-session-continuity/index.md b/courses/learn-harness-engineering/docs/de/projects/project-03-multi-session-continuity/index.md similarity index 100% rename from docs/de/projects/project-03-multi-session-continuity/index.md rename to courses/learn-harness-engineering/docs/de/projects/project-03-multi-session-continuity/index.md diff --git a/docs/de/projects/project-04-incremental-indexing/index.md b/courses/learn-harness-engineering/docs/de/projects/project-04-incremental-indexing/index.md similarity index 100% rename from docs/de/projects/project-04-incremental-indexing/index.md rename to courses/learn-harness-engineering/docs/de/projects/project-04-incremental-indexing/index.md diff --git a/docs/de/projects/project-05-grounded-qa-verification/index.md b/courses/learn-harness-engineering/docs/de/projects/project-05-grounded-qa-verification/index.md similarity index 100% rename from docs/de/projects/project-05-grounded-qa-verification/index.md rename to courses/learn-harness-engineering/docs/de/projects/project-05-grounded-qa-verification/index.md diff --git a/docs/de/projects/project-06-runtime-observability-and-debugging/index.md b/courses/learn-harness-engineering/docs/de/projects/project-06-runtime-observability-and-debugging/index.md similarity index 100% rename from docs/de/projects/project-06-runtime-observability-and-debugging/index.md rename to courses/learn-harness-engineering/docs/de/projects/project-06-runtime-observability-and-debugging/index.md diff --git a/docs/de/resources/index.md b/courses/learn-harness-engineering/docs/de/resources/index.md similarity index 100% rename from docs/de/resources/index.md rename to courses/learn-harness-engineering/docs/de/resources/index.md diff --git a/docs/de/resources/openai-advanced/index.md b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/index.md similarity index 100% rename from docs/de/resources/openai-advanced/index.md rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/index.md diff --git a/docs/de/resources/openai-advanced/repo-template/AGENTS.md b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/AGENTS.md similarity index 100% rename from docs/de/resources/openai-advanced/repo-template/AGENTS.md rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/AGENTS.md diff --git a/docs/de/resources/openai-advanced/repo-template/ARCHITECTURE.md b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/ARCHITECTURE.md similarity index 100% rename from docs/de/resources/openai-advanced/repo-template/ARCHITECTURE.md rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/ARCHITECTURE.md diff --git a/docs/de/resources/openai-advanced/repo-template/docs/DESIGN.md b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/DESIGN.md similarity index 100% rename from docs/de/resources/openai-advanced/repo-template/docs/DESIGN.md rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/DESIGN.md diff --git a/docs/de/resources/openai-advanced/repo-template/docs/FRONTEND.md b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/FRONTEND.md similarity index 100% rename from docs/de/resources/openai-advanced/repo-template/docs/FRONTEND.md rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/FRONTEND.md diff --git a/docs/de/resources/openai-advanced/repo-template/docs/PLANS.md b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/PLANS.md similarity index 100% rename from docs/de/resources/openai-advanced/repo-template/docs/PLANS.md rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/PLANS.md diff --git a/docs/de/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md similarity index 100% rename from docs/de/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md diff --git a/docs/de/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md similarity index 100% rename from docs/de/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md diff --git a/docs/de/resources/openai-advanced/repo-template/docs/RELIABILITY.md b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/RELIABILITY.md similarity index 100% rename from docs/de/resources/openai-advanced/repo-template/docs/RELIABILITY.md rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/RELIABILITY.md diff --git a/docs/de/resources/openai-advanced/repo-template/docs/SECURITY.md b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/SECURITY.md similarity index 100% rename from docs/de/resources/openai-advanced/repo-template/docs/SECURITY.md rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/SECURITY.md diff --git a/docs/de/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md similarity index 100% rename from docs/de/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md diff --git a/docs/de/resources/openai-advanced/repo-template/docs/design-docs/index.md b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/design-docs/index.md similarity index 100% rename from docs/de/resources/openai-advanced/repo-template/docs/design-docs/index.md rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/design-docs/index.md diff --git a/docs/de/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md similarity index 100% rename from docs/de/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md diff --git a/docs/de/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md similarity index 100% rename from docs/de/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md diff --git a/docs/de/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md similarity index 100% rename from docs/de/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md diff --git a/docs/de/resources/openai-advanced/repo-template/docs/generated/db-schema.md b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/generated/db-schema.md similarity index 100% rename from docs/de/resources/openai-advanced/repo-template/docs/generated/db-schema.md rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/generated/db-schema.md diff --git a/docs/de/resources/openai-advanced/repo-template/docs/product-specs/index.md b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/product-specs/index.md similarity index 100% rename from docs/de/resources/openai-advanced/repo-template/docs/product-specs/index.md rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/product-specs/index.md diff --git a/docs/de/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md similarity index 100% rename from docs/de/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md diff --git a/docs/de/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt similarity index 100% rename from docs/de/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt diff --git a/docs/de/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt similarity index 100% rename from docs/de/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt diff --git a/docs/de/resources/openai-advanced/repo-template/docs/references/uv-llms.txt b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/references/uv-llms.txt similarity index 100% rename from docs/de/resources/openai-advanced/repo-template/docs/references/uv-llms.txt rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/docs/references/uv-llms.txt diff --git a/docs/de/resources/openai-advanced/repo-template/index.md b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/index.md similarity index 100% rename from docs/de/resources/openai-advanced/repo-template/index.md rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/repo-template/index.md diff --git a/docs/de/resources/openai-advanced/sops/chrome-devtools-validation-loop.md b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/sops/chrome-devtools-validation-loop.md similarity index 100% rename from docs/de/resources/openai-advanced/sops/chrome-devtools-validation-loop.md rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/sops/chrome-devtools-validation-loop.md diff --git a/docs/de/resources/openai-advanced/sops/encode-knowledge-into-repo.md b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/sops/encode-knowledge-into-repo.md similarity index 100% rename from docs/de/resources/openai-advanced/sops/encode-knowledge-into-repo.md rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/sops/encode-knowledge-into-repo.md diff --git a/docs/de/resources/openai-advanced/sops/index.md b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/sops/index.md similarity index 100% rename from docs/de/resources/openai-advanced/sops/index.md rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/sops/index.md diff --git a/docs/de/resources/openai-advanced/sops/layered-domain-architecture.md b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/sops/layered-domain-architecture.md similarity index 100% rename from docs/de/resources/openai-advanced/sops/layered-domain-architecture.md rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/sops/layered-domain-architecture.md diff --git a/docs/de/resources/openai-advanced/sops/observability-feedback-loop.md b/courses/learn-harness-engineering/docs/de/resources/openai-advanced/sops/observability-feedback-loop.md similarity index 100% rename from docs/de/resources/openai-advanced/sops/observability-feedback-loop.md rename to courses/learn-harness-engineering/docs/de/resources/openai-advanced/sops/observability-feedback-loop.md diff --git a/docs/de/resources/reference/coding-agent-startup-flow.md b/courses/learn-harness-engineering/docs/de/resources/reference/coding-agent-startup-flow.md similarity index 100% rename from docs/de/resources/reference/coding-agent-startup-flow.md rename to courses/learn-harness-engineering/docs/de/resources/reference/coding-agent-startup-flow.md diff --git a/docs/de/resources/reference/index.md b/courses/learn-harness-engineering/docs/de/resources/reference/index.md similarity index 100% rename from docs/de/resources/reference/index.md rename to courses/learn-harness-engineering/docs/de/resources/reference/index.md diff --git a/docs/de/resources/reference/initializer-agent-playbook.md b/courses/learn-harness-engineering/docs/de/resources/reference/initializer-agent-playbook.md similarity index 100% rename from docs/de/resources/reference/initializer-agent-playbook.md rename to courses/learn-harness-engineering/docs/de/resources/reference/initializer-agent-playbook.md diff --git a/docs/de/resources/reference/method-map.md b/courses/learn-harness-engineering/docs/de/resources/reference/method-map.md similarity index 100% rename from docs/de/resources/reference/method-map.md rename to courses/learn-harness-engineering/docs/de/resources/reference/method-map.md diff --git a/docs/de/resources/reference/prompt-calibration.md b/courses/learn-harness-engineering/docs/de/resources/reference/prompt-calibration.md similarity index 100% rename from docs/de/resources/reference/prompt-calibration.md rename to courses/learn-harness-engineering/docs/de/resources/reference/prompt-calibration.md diff --git a/docs/de/resources/templates/AGENTS.md b/courses/learn-harness-engineering/docs/de/resources/templates/AGENTS.md similarity index 100% rename from docs/de/resources/templates/AGENTS.md rename to courses/learn-harness-engineering/docs/de/resources/templates/AGENTS.md diff --git a/docs/de/resources/templates/CLAUDE.md b/courses/learn-harness-engineering/docs/de/resources/templates/CLAUDE.md similarity index 100% rename from docs/de/resources/templates/CLAUDE.md rename to courses/learn-harness-engineering/docs/de/resources/templates/CLAUDE.md diff --git a/docs/de/resources/templates/claude-progress.md b/courses/learn-harness-engineering/docs/de/resources/templates/claude-progress.md similarity index 100% rename from docs/de/resources/templates/claude-progress.md rename to courses/learn-harness-engineering/docs/de/resources/templates/claude-progress.md diff --git a/docs/de/resources/templates/clean-state-checklist.md b/courses/learn-harness-engineering/docs/de/resources/templates/clean-state-checklist.md similarity index 100% rename from docs/de/resources/templates/clean-state-checklist.md rename to courses/learn-harness-engineering/docs/de/resources/templates/clean-state-checklist.md diff --git a/docs/de/resources/templates/evaluator-rubric.md b/courses/learn-harness-engineering/docs/de/resources/templates/evaluator-rubric.md similarity index 100% rename from docs/de/resources/templates/evaluator-rubric.md rename to courses/learn-harness-engineering/docs/de/resources/templates/evaluator-rubric.md diff --git a/docs/de/resources/templates/feature_list.json b/courses/learn-harness-engineering/docs/de/resources/templates/feature_list.json similarity index 100% rename from docs/de/resources/templates/feature_list.json rename to courses/learn-harness-engineering/docs/de/resources/templates/feature_list.json diff --git a/docs/de/resources/templates/index.md b/courses/learn-harness-engineering/docs/de/resources/templates/index.md similarity index 100% rename from docs/de/resources/templates/index.md rename to courses/learn-harness-engineering/docs/de/resources/templates/index.md diff --git a/docs/de/resources/templates/init.sh b/courses/learn-harness-engineering/docs/de/resources/templates/init.sh similarity index 100% rename from docs/de/resources/templates/init.sh rename to courses/learn-harness-engineering/docs/de/resources/templates/init.sh diff --git a/docs/de/resources/templates/quality-document.md b/courses/learn-harness-engineering/docs/de/resources/templates/quality-document.md similarity index 100% rename from docs/de/resources/templates/quality-document.md rename to courses/learn-harness-engineering/docs/de/resources/templates/quality-document.md diff --git a/docs/de/resources/templates/session-handoff.md b/courses/learn-harness-engineering/docs/de/resources/templates/session-handoff.md similarity index 100% rename from docs/de/resources/templates/session-handoff.md rename to courses/learn-harness-engineering/docs/de/resources/templates/session-handoff.md diff --git a/docs/de/skills/index.md b/courses/learn-harness-engineering/docs/de/skills/index.md similarity index 100% rename from docs/de/skills/index.md rename to courses/learn-harness-engineering/docs/de/skills/index.md diff --git a/docs/ko/index.md b/courses/learn-harness-engineering/docs/en/index.md similarity index 100% rename from docs/ko/index.md rename to courses/learn-harness-engineering/docs/en/index.md diff --git a/docs/en/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts b/courses/learn-harness-engineering/docs/en/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts similarity index 100% rename from docs/en/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts rename to courses/learn-harness-engineering/docs/en/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts diff --git a/docs/en/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md similarity index 100% rename from docs/en/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md diff --git a/docs/en/lectures/lecture-01-why-capable-agents-still-fail/code/index.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-01-why-capable-agents-still-fail/code/index.md similarity index 100% rename from docs/en/lectures/lecture-01-why-capable-agents-still-fail/code/index.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-01-why-capable-agents-still-fail/code/index.md diff --git a/docs/en/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md similarity index 100% rename from docs/en/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md diff --git a/docs/en/lectures/lecture-01-why-capable-agents-still-fail/index.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-01-why-capable-agents-still-fail/index.md similarity index 100% rename from docs/en/lectures/lecture-01-why-capable-agents-still-fail/index.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-01-why-capable-agents-still-fail/index.md diff --git a/docs/en/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md similarity index 100% rename from docs/en/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md diff --git a/docs/en/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts b/courses/learn-harness-engineering/docs/en/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts similarity index 100% rename from docs/en/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts rename to courses/learn-harness-engineering/docs/en/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts diff --git a/docs/en/lectures/lecture-02-what-a-harness-actually-is/code/index.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-02-what-a-harness-actually-is/code/index.md similarity index 100% rename from docs/en/lectures/lecture-02-what-a-harness-actually-is/code/index.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-02-what-a-harness-actually-is/code/index.md diff --git a/docs/en/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts b/courses/learn-harness-engineering/docs/en/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts similarity index 100% rename from docs/en/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts rename to courses/learn-harness-engineering/docs/en/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts diff --git a/docs/en/lectures/lecture-02-what-a-harness-actually-is/index.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-02-what-a-harness-actually-is/index.md similarity index 100% rename from docs/en/lectures/lecture-02-what-a-harness-actually-is/index.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-02-what-a-harness-actually-is/index.md diff --git a/docs/en/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md similarity index 100% rename from docs/en/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md diff --git a/docs/en/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt b/courses/learn-harness-engineering/docs/en/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt similarity index 100% rename from docs/en/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt rename to courses/learn-harness-engineering/docs/en/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt diff --git a/docs/en/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts b/courses/learn-harness-engineering/docs/en/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts similarity index 100% rename from docs/en/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts rename to courses/learn-harness-engineering/docs/en/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts diff --git a/docs/en/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md similarity index 100% rename from docs/en/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md diff --git a/docs/en/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md similarity index 100% rename from docs/en/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md diff --git a/docs/en/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md similarity index 100% rename from docs/en/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md diff --git a/docs/en/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md similarity index 100% rename from docs/en/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md diff --git a/docs/en/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md similarity index 100% rename from docs/en/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md diff --git a/docs/en/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts b/courses/learn-harness-engineering/docs/en/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts similarity index 100% rename from docs/en/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts rename to courses/learn-harness-engineering/docs/en/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts diff --git a/docs/en/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md similarity index 100% rename from docs/en/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md diff --git a/docs/en/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md similarity index 100% rename from docs/en/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md diff --git a/docs/en/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md similarity index 100% rename from docs/en/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md diff --git a/docs/en/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md similarity index 100% rename from docs/en/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md diff --git a/docs/en/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts b/courses/learn-harness-engineering/docs/en/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts similarity index 100% rename from docs/en/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts rename to courses/learn-harness-engineering/docs/en/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts diff --git a/docs/en/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md similarity index 100% rename from docs/en/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md diff --git a/docs/en/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md similarity index 100% rename from docs/en/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md diff --git a/docs/en/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts b/courses/learn-harness-engineering/docs/en/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts similarity index 100% rename from docs/en/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts rename to courses/learn-harness-engineering/docs/en/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts diff --git a/docs/en/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh b/courses/learn-harness-engineering/docs/en/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh similarity index 100% rename from docs/en/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh rename to courses/learn-harness-engineering/docs/en/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh diff --git a/docs/en/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md similarity index 100% rename from docs/en/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md diff --git a/docs/en/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md similarity index 100% rename from docs/en/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md diff --git a/docs/en/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md similarity index 100% rename from docs/en/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md diff --git a/docs/en/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md similarity index 100% rename from docs/en/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md diff --git a/docs/en/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md similarity index 100% rename from docs/en/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md diff --git a/docs/en/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts b/courses/learn-harness-engineering/docs/en/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts similarity index 100% rename from docs/en/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts rename to courses/learn-harness-engineering/docs/en/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts diff --git a/docs/en/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md similarity index 100% rename from docs/en/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md diff --git a/docs/en/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts b/courses/learn-harness-engineering/docs/en/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts similarity index 100% rename from docs/en/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts rename to courses/learn-harness-engineering/docs/en/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts diff --git a/docs/en/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json b/courses/learn-harness-engineering/docs/en/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json similarity index 100% rename from docs/en/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json rename to courses/learn-harness-engineering/docs/en/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json diff --git a/docs/en/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md similarity index 100% rename from docs/en/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md diff --git a/docs/en/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md similarity index 100% rename from docs/en/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md diff --git a/docs/en/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md similarity index 100% rename from docs/en/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md diff --git a/docs/en/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md similarity index 100% rename from docs/en/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md diff --git a/docs/en/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md similarity index 100% rename from docs/en/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md diff --git a/docs/en/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts b/courses/learn-harness-engineering/docs/en/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts similarity index 100% rename from docs/en/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts rename to courses/learn-harness-engineering/docs/en/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts diff --git a/docs/en/lectures/lecture-09-why-agents-declare-victory-too-early/index.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-09-why-agents-declare-victory-too-early/index.md similarity index 100% rename from docs/en/lectures/lecture-09-why-agents-declare-victory-too-early/index.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-09-why-agents-declare-victory-too-early/index.md diff --git a/docs/en/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md similarity index 100% rename from docs/en/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md diff --git a/docs/en/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts b/courses/learn-harness-engineering/docs/en/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts similarity index 100% rename from docs/en/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts rename to courses/learn-harness-engineering/docs/en/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts diff --git a/docs/en/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md similarity index 100% rename from docs/en/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md diff --git a/docs/en/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md similarity index 100% rename from docs/en/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md diff --git a/docs/en/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md similarity index 100% rename from docs/en/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md diff --git a/docs/en/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md similarity index 100% rename from docs/en/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md diff --git a/docs/en/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md similarity index 100% rename from docs/en/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md diff --git a/docs/en/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts b/courses/learn-harness-engineering/docs/en/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts similarity index 100% rename from docs/en/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts rename to courses/learn-harness-engineering/docs/en/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts diff --git a/docs/en/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md similarity index 100% rename from docs/en/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md diff --git a/docs/en/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md similarity index 100% rename from docs/en/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md diff --git a/docs/en/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md similarity index 100% rename from docs/en/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md diff --git a/docs/en/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts b/courses/learn-harness-engineering/docs/en/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts similarity index 100% rename from docs/en/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts rename to courses/learn-harness-engineering/docs/en/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts diff --git a/docs/en/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md similarity index 100% rename from docs/en/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md diff --git a/docs/en/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts b/courses/learn-harness-engineering/docs/en/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts similarity index 100% rename from docs/en/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts rename to courses/learn-harness-engineering/docs/en/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts diff --git a/docs/en/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md similarity index 100% rename from docs/en/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md diff --git a/docs/en/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md b/courses/learn-harness-engineering/docs/en/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md similarity index 100% rename from docs/en/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md rename to courses/learn-harness-engineering/docs/en/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md diff --git a/docs/en/projects/index.md b/courses/learn-harness-engineering/docs/en/projects/index.md similarity index 100% rename from docs/en/projects/index.md rename to courses/learn-harness-engineering/docs/en/projects/index.md diff --git a/docs/en/projects/project-01-baseline-vs-minimal-harness/index.md b/courses/learn-harness-engineering/docs/en/projects/project-01-baseline-vs-minimal-harness/index.md similarity index 100% rename from docs/en/projects/project-01-baseline-vs-minimal-harness/index.md rename to courses/learn-harness-engineering/docs/en/projects/project-01-baseline-vs-minimal-harness/index.md diff --git a/docs/en/projects/project-02-agent-readable-workspace/index.md b/courses/learn-harness-engineering/docs/en/projects/project-02-agent-readable-workspace/index.md similarity index 100% rename from docs/en/projects/project-02-agent-readable-workspace/index.md rename to courses/learn-harness-engineering/docs/en/projects/project-02-agent-readable-workspace/index.md diff --git a/docs/en/projects/project-03-multi-session-continuity/index.md b/courses/learn-harness-engineering/docs/en/projects/project-03-multi-session-continuity/index.md similarity index 100% rename from docs/en/projects/project-03-multi-session-continuity/index.md rename to courses/learn-harness-engineering/docs/en/projects/project-03-multi-session-continuity/index.md diff --git a/docs/en/projects/project-04-incremental-indexing/index.md b/courses/learn-harness-engineering/docs/en/projects/project-04-incremental-indexing/index.md similarity index 100% rename from docs/en/projects/project-04-incremental-indexing/index.md rename to courses/learn-harness-engineering/docs/en/projects/project-04-incremental-indexing/index.md diff --git a/docs/en/projects/project-05-grounded-qa-verification/index.md b/courses/learn-harness-engineering/docs/en/projects/project-05-grounded-qa-verification/index.md similarity index 100% rename from docs/en/projects/project-05-grounded-qa-verification/index.md rename to courses/learn-harness-engineering/docs/en/projects/project-05-grounded-qa-verification/index.md diff --git a/docs/en/projects/project-06-runtime-observability-and-debugging/index.md b/courses/learn-harness-engineering/docs/en/projects/project-06-runtime-observability-and-debugging/index.md similarity index 100% rename from docs/en/projects/project-06-runtime-observability-and-debugging/index.md rename to courses/learn-harness-engineering/docs/en/projects/project-06-runtime-observability-and-debugging/index.md diff --git a/docs/en/resources/index.md b/courses/learn-harness-engineering/docs/en/resources/index.md similarity index 100% rename from docs/en/resources/index.md rename to courses/learn-harness-engineering/docs/en/resources/index.md diff --git a/docs/en/resources/openai-advanced/index.md b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/index.md similarity index 100% rename from docs/en/resources/openai-advanced/index.md rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/index.md diff --git a/docs/en/resources/openai-advanced/repo-template/AGENTS.md b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/AGENTS.md similarity index 100% rename from docs/en/resources/openai-advanced/repo-template/AGENTS.md rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/AGENTS.md diff --git a/docs/en/resources/openai-advanced/repo-template/ARCHITECTURE.md b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/ARCHITECTURE.md similarity index 100% rename from docs/en/resources/openai-advanced/repo-template/ARCHITECTURE.md rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/ARCHITECTURE.md diff --git a/docs/en/resources/openai-advanced/repo-template/docs/DESIGN.md b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/DESIGN.md similarity index 100% rename from docs/en/resources/openai-advanced/repo-template/docs/DESIGN.md rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/DESIGN.md diff --git a/docs/en/resources/openai-advanced/repo-template/docs/FRONTEND.md b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/FRONTEND.md similarity index 100% rename from docs/en/resources/openai-advanced/repo-template/docs/FRONTEND.md rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/FRONTEND.md diff --git a/docs/en/resources/openai-advanced/repo-template/docs/PLANS.md b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/PLANS.md similarity index 100% rename from docs/en/resources/openai-advanced/repo-template/docs/PLANS.md rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/PLANS.md diff --git a/docs/en/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md similarity index 100% rename from docs/en/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md diff --git a/docs/en/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md similarity index 100% rename from docs/en/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md diff --git a/docs/en/resources/openai-advanced/repo-template/docs/RELIABILITY.md b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/RELIABILITY.md similarity index 100% rename from docs/en/resources/openai-advanced/repo-template/docs/RELIABILITY.md rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/RELIABILITY.md diff --git a/docs/en/resources/openai-advanced/repo-template/docs/SECURITY.md b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/SECURITY.md similarity index 100% rename from docs/en/resources/openai-advanced/repo-template/docs/SECURITY.md rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/SECURITY.md diff --git a/docs/en/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md similarity index 100% rename from docs/en/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md diff --git a/docs/en/resources/openai-advanced/repo-template/docs/design-docs/index.md b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/design-docs/index.md similarity index 100% rename from docs/en/resources/openai-advanced/repo-template/docs/design-docs/index.md rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/design-docs/index.md diff --git a/docs/en/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md similarity index 100% rename from docs/en/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md diff --git a/docs/en/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md similarity index 100% rename from docs/en/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md diff --git a/docs/en/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md similarity index 100% rename from docs/en/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md diff --git a/docs/en/resources/openai-advanced/repo-template/docs/generated/db-schema.md b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/generated/db-schema.md similarity index 100% rename from docs/en/resources/openai-advanced/repo-template/docs/generated/db-schema.md rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/generated/db-schema.md diff --git a/docs/en/resources/openai-advanced/repo-template/docs/product-specs/index.md b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/product-specs/index.md similarity index 100% rename from docs/en/resources/openai-advanced/repo-template/docs/product-specs/index.md rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/product-specs/index.md diff --git a/docs/en/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md similarity index 100% rename from docs/en/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md diff --git a/docs/en/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt similarity index 100% rename from docs/en/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt diff --git a/docs/en/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt similarity index 100% rename from docs/en/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt diff --git a/docs/en/resources/openai-advanced/repo-template/docs/references/uv-llms.txt b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/references/uv-llms.txt similarity index 100% rename from docs/en/resources/openai-advanced/repo-template/docs/references/uv-llms.txt rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/docs/references/uv-llms.txt diff --git a/docs/en/resources/openai-advanced/repo-template/index.md b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/index.md similarity index 100% rename from docs/en/resources/openai-advanced/repo-template/index.md rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/repo-template/index.md diff --git a/docs/en/resources/openai-advanced/sops/chrome-devtools-validation-loop.md b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/sops/chrome-devtools-validation-loop.md similarity index 100% rename from docs/en/resources/openai-advanced/sops/chrome-devtools-validation-loop.md rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/sops/chrome-devtools-validation-loop.md diff --git a/docs/en/resources/openai-advanced/sops/encode-knowledge-into-repo.md b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/sops/encode-knowledge-into-repo.md similarity index 100% rename from docs/en/resources/openai-advanced/sops/encode-knowledge-into-repo.md rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/sops/encode-knowledge-into-repo.md diff --git a/docs/en/resources/openai-advanced/sops/index.md b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/sops/index.md similarity index 100% rename from docs/en/resources/openai-advanced/sops/index.md rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/sops/index.md diff --git a/docs/en/resources/openai-advanced/sops/layered-domain-architecture.md b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/sops/layered-domain-architecture.md similarity index 100% rename from docs/en/resources/openai-advanced/sops/layered-domain-architecture.md rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/sops/layered-domain-architecture.md diff --git a/docs/en/resources/openai-advanced/sops/observability-feedback-loop.md b/courses/learn-harness-engineering/docs/en/resources/openai-advanced/sops/observability-feedback-loop.md similarity index 100% rename from docs/en/resources/openai-advanced/sops/observability-feedback-loop.md rename to courses/learn-harness-engineering/docs/en/resources/openai-advanced/sops/observability-feedback-loop.md diff --git a/docs/en/resources/reference/coding-agent-startup-flow.md b/courses/learn-harness-engineering/docs/en/resources/reference/coding-agent-startup-flow.md similarity index 100% rename from docs/en/resources/reference/coding-agent-startup-flow.md rename to courses/learn-harness-engineering/docs/en/resources/reference/coding-agent-startup-flow.md diff --git a/docs/en/resources/reference/index.md b/courses/learn-harness-engineering/docs/en/resources/reference/index.md similarity index 100% rename from docs/en/resources/reference/index.md rename to courses/learn-harness-engineering/docs/en/resources/reference/index.md diff --git a/docs/en/resources/reference/initializer-agent-playbook.md b/courses/learn-harness-engineering/docs/en/resources/reference/initializer-agent-playbook.md similarity index 100% rename from docs/en/resources/reference/initializer-agent-playbook.md rename to courses/learn-harness-engineering/docs/en/resources/reference/initializer-agent-playbook.md diff --git a/docs/en/resources/reference/method-map.md b/courses/learn-harness-engineering/docs/en/resources/reference/method-map.md similarity index 100% rename from docs/en/resources/reference/method-map.md rename to courses/learn-harness-engineering/docs/en/resources/reference/method-map.md diff --git a/docs/en/resources/reference/prompt-calibration.md b/courses/learn-harness-engineering/docs/en/resources/reference/prompt-calibration.md similarity index 100% rename from docs/en/resources/reference/prompt-calibration.md rename to courses/learn-harness-engineering/docs/en/resources/reference/prompt-calibration.md diff --git a/docs/en/resources/templates/AGENTS.md b/courses/learn-harness-engineering/docs/en/resources/templates/AGENTS.md similarity index 100% rename from docs/en/resources/templates/AGENTS.md rename to courses/learn-harness-engineering/docs/en/resources/templates/AGENTS.md diff --git a/docs/en/resources/templates/CLAUDE.md b/courses/learn-harness-engineering/docs/en/resources/templates/CLAUDE.md similarity index 100% rename from docs/en/resources/templates/CLAUDE.md rename to courses/learn-harness-engineering/docs/en/resources/templates/CLAUDE.md diff --git a/docs/en/resources/templates/claude-progress.md b/courses/learn-harness-engineering/docs/en/resources/templates/claude-progress.md similarity index 100% rename from docs/en/resources/templates/claude-progress.md rename to courses/learn-harness-engineering/docs/en/resources/templates/claude-progress.md diff --git a/docs/en/resources/templates/clean-state-checklist.md b/courses/learn-harness-engineering/docs/en/resources/templates/clean-state-checklist.md similarity index 100% rename from docs/en/resources/templates/clean-state-checklist.md rename to courses/learn-harness-engineering/docs/en/resources/templates/clean-state-checklist.md diff --git a/docs/en/resources/templates/evaluator-rubric.md b/courses/learn-harness-engineering/docs/en/resources/templates/evaluator-rubric.md similarity index 100% rename from docs/en/resources/templates/evaluator-rubric.md rename to courses/learn-harness-engineering/docs/en/resources/templates/evaluator-rubric.md diff --git a/docs/en/resources/templates/feature_list.json b/courses/learn-harness-engineering/docs/en/resources/templates/feature_list.json similarity index 100% rename from docs/en/resources/templates/feature_list.json rename to courses/learn-harness-engineering/docs/en/resources/templates/feature_list.json diff --git a/docs/en/resources/templates/index.md b/courses/learn-harness-engineering/docs/en/resources/templates/index.md similarity index 100% rename from docs/en/resources/templates/index.md rename to courses/learn-harness-engineering/docs/en/resources/templates/index.md diff --git a/docs/en/resources/templates/init.sh b/courses/learn-harness-engineering/docs/en/resources/templates/init.sh similarity index 100% rename from docs/en/resources/templates/init.sh rename to courses/learn-harness-engineering/docs/en/resources/templates/init.sh diff --git a/docs/en/resources/templates/quality-document.md b/courses/learn-harness-engineering/docs/en/resources/templates/quality-document.md similarity index 100% rename from docs/en/resources/templates/quality-document.md rename to courses/learn-harness-engineering/docs/en/resources/templates/quality-document.md diff --git a/docs/en/resources/templates/session-handoff.md b/courses/learn-harness-engineering/docs/en/resources/templates/session-handoff.md similarity index 100% rename from docs/en/resources/templates/session-handoff.md rename to courses/learn-harness-engineering/docs/en/resources/templates/session-handoff.md diff --git a/docs/en/skills/index.md b/courses/learn-harness-engineering/docs/en/skills/index.md similarity index 100% rename from docs/en/skills/index.md rename to courses/learn-harness-engineering/docs/en/skills/index.md diff --git a/docs/es/index.md b/courses/learn-harness-engineering/docs/es/index.md similarity index 100% rename from docs/es/index.md rename to courses/learn-harness-engineering/docs/es/index.md diff --git a/docs/es/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts b/courses/learn-harness-engineering/docs/es/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts similarity index 100% rename from docs/es/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts rename to courses/learn-harness-engineering/docs/es/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts diff --git a/docs/es/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md similarity index 100% rename from docs/es/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md diff --git a/docs/es/lectures/lecture-01-why-capable-agents-still-fail/code/index.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-01-why-capable-agents-still-fail/code/index.md similarity index 100% rename from docs/es/lectures/lecture-01-why-capable-agents-still-fail/code/index.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-01-why-capable-agents-still-fail/code/index.md diff --git a/docs/es/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md similarity index 100% rename from docs/es/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md diff --git a/docs/es/lectures/lecture-01-why-capable-agents-still-fail/index.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-01-why-capable-agents-still-fail/index.md similarity index 100% rename from docs/es/lectures/lecture-01-why-capable-agents-still-fail/index.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-01-why-capable-agents-still-fail/index.md diff --git a/docs/es/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md similarity index 100% rename from docs/es/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md diff --git a/docs/es/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts b/courses/learn-harness-engineering/docs/es/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts similarity index 100% rename from docs/es/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts rename to courses/learn-harness-engineering/docs/es/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts diff --git a/docs/es/lectures/lecture-02-what-a-harness-actually-is/code/index.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-02-what-a-harness-actually-is/code/index.md similarity index 100% rename from docs/es/lectures/lecture-02-what-a-harness-actually-is/code/index.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-02-what-a-harness-actually-is/code/index.md diff --git a/docs/es/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts b/courses/learn-harness-engineering/docs/es/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts similarity index 100% rename from docs/es/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts rename to courses/learn-harness-engineering/docs/es/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts diff --git a/docs/es/lectures/lecture-02-what-a-harness-actually-is/index.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-02-what-a-harness-actually-is/index.md similarity index 100% rename from docs/es/lectures/lecture-02-what-a-harness-actually-is/index.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-02-what-a-harness-actually-is/index.md diff --git a/docs/es/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md similarity index 100% rename from docs/es/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md diff --git a/docs/es/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt b/courses/learn-harness-engineering/docs/es/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt similarity index 100% rename from docs/es/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt rename to courses/learn-harness-engineering/docs/es/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt diff --git a/docs/es/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts b/courses/learn-harness-engineering/docs/es/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts similarity index 100% rename from docs/es/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts rename to courses/learn-harness-engineering/docs/es/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts diff --git a/docs/es/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md similarity index 100% rename from docs/es/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md diff --git a/docs/es/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md similarity index 100% rename from docs/es/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md diff --git a/docs/es/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md similarity index 100% rename from docs/es/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md diff --git a/docs/es/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md similarity index 100% rename from docs/es/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md diff --git a/docs/es/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md similarity index 100% rename from docs/es/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md diff --git a/docs/es/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts b/courses/learn-harness-engineering/docs/es/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts similarity index 100% rename from docs/es/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts rename to courses/learn-harness-engineering/docs/es/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts diff --git a/docs/es/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md similarity index 100% rename from docs/es/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md diff --git a/docs/es/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md similarity index 100% rename from docs/es/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md diff --git a/docs/es/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md similarity index 100% rename from docs/es/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md diff --git a/docs/es/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md similarity index 100% rename from docs/es/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md diff --git a/docs/es/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts b/courses/learn-harness-engineering/docs/es/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts similarity index 100% rename from docs/es/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts rename to courses/learn-harness-engineering/docs/es/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts diff --git a/docs/es/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md similarity index 100% rename from docs/es/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md diff --git a/docs/es/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md similarity index 100% rename from docs/es/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md diff --git a/docs/es/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts b/courses/learn-harness-engineering/docs/es/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts similarity index 100% rename from docs/es/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts rename to courses/learn-harness-engineering/docs/es/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts diff --git a/docs/es/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh b/courses/learn-harness-engineering/docs/es/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh similarity index 100% rename from docs/es/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh rename to courses/learn-harness-engineering/docs/es/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh diff --git a/docs/es/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md similarity index 100% rename from docs/es/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md diff --git a/docs/es/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md similarity index 100% rename from docs/es/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md diff --git a/docs/es/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md similarity index 100% rename from docs/es/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md diff --git a/docs/es/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md similarity index 100% rename from docs/es/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md diff --git a/docs/es/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md similarity index 100% rename from docs/es/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md diff --git a/docs/es/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts b/courses/learn-harness-engineering/docs/es/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts similarity index 100% rename from docs/es/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts rename to courses/learn-harness-engineering/docs/es/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts diff --git a/docs/es/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md similarity index 100% rename from docs/es/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md diff --git a/docs/es/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts b/courses/learn-harness-engineering/docs/es/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts similarity index 100% rename from docs/es/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts rename to courses/learn-harness-engineering/docs/es/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts diff --git a/docs/es/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json b/courses/learn-harness-engineering/docs/es/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json similarity index 100% rename from docs/es/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json rename to courses/learn-harness-engineering/docs/es/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json diff --git a/docs/es/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md similarity index 100% rename from docs/es/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md diff --git a/docs/es/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md similarity index 100% rename from docs/es/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md diff --git a/docs/es/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md similarity index 100% rename from docs/es/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md diff --git a/docs/es/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md similarity index 100% rename from docs/es/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md diff --git a/docs/es/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md similarity index 100% rename from docs/es/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md diff --git a/docs/es/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts b/courses/learn-harness-engineering/docs/es/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts similarity index 100% rename from docs/es/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts rename to courses/learn-harness-engineering/docs/es/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts diff --git a/docs/es/lectures/lecture-09-why-agents-declare-victory-too-early/index.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-09-why-agents-declare-victory-too-early/index.md similarity index 100% rename from docs/es/lectures/lecture-09-why-agents-declare-victory-too-early/index.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-09-why-agents-declare-victory-too-early/index.md diff --git a/docs/es/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md similarity index 100% rename from docs/es/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md diff --git a/docs/es/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts b/courses/learn-harness-engineering/docs/es/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts similarity index 100% rename from docs/es/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts rename to courses/learn-harness-engineering/docs/es/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts diff --git a/docs/es/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md similarity index 100% rename from docs/es/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md diff --git a/docs/es/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md similarity index 100% rename from docs/es/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md diff --git a/docs/es/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md similarity index 100% rename from docs/es/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md diff --git a/docs/es/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md similarity index 100% rename from docs/es/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md diff --git a/docs/es/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md similarity index 100% rename from docs/es/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md diff --git a/docs/es/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts b/courses/learn-harness-engineering/docs/es/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts similarity index 100% rename from docs/es/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts rename to courses/learn-harness-engineering/docs/es/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts diff --git a/docs/es/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md similarity index 100% rename from docs/es/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md diff --git a/docs/es/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md similarity index 100% rename from docs/es/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md diff --git a/docs/es/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md similarity index 100% rename from docs/es/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md diff --git a/docs/es/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts b/courses/learn-harness-engineering/docs/es/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts similarity index 100% rename from docs/es/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts rename to courses/learn-harness-engineering/docs/es/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts diff --git a/docs/es/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md similarity index 100% rename from docs/es/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md diff --git a/docs/es/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts b/courses/learn-harness-engineering/docs/es/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts similarity index 100% rename from docs/es/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts rename to courses/learn-harness-engineering/docs/es/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts diff --git a/docs/es/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md similarity index 100% rename from docs/es/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md diff --git a/docs/es/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md b/courses/learn-harness-engineering/docs/es/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md similarity index 100% rename from docs/es/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md rename to courses/learn-harness-engineering/docs/es/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md diff --git a/docs/es/projects/index.md b/courses/learn-harness-engineering/docs/es/projects/index.md similarity index 100% rename from docs/es/projects/index.md rename to courses/learn-harness-engineering/docs/es/projects/index.md diff --git a/docs/es/projects/project-01-baseline-vs-minimal-harness/index.md b/courses/learn-harness-engineering/docs/es/projects/project-01-baseline-vs-minimal-harness/index.md similarity index 100% rename from docs/es/projects/project-01-baseline-vs-minimal-harness/index.md rename to courses/learn-harness-engineering/docs/es/projects/project-01-baseline-vs-minimal-harness/index.md diff --git a/docs/es/projects/project-02-agent-readable-workspace/index.md b/courses/learn-harness-engineering/docs/es/projects/project-02-agent-readable-workspace/index.md similarity index 100% rename from docs/es/projects/project-02-agent-readable-workspace/index.md rename to courses/learn-harness-engineering/docs/es/projects/project-02-agent-readable-workspace/index.md diff --git a/docs/es/projects/project-03-multi-session-continuity/index.md b/courses/learn-harness-engineering/docs/es/projects/project-03-multi-session-continuity/index.md similarity index 100% rename from docs/es/projects/project-03-multi-session-continuity/index.md rename to courses/learn-harness-engineering/docs/es/projects/project-03-multi-session-continuity/index.md diff --git a/docs/es/projects/project-04-incremental-indexing/index.md b/courses/learn-harness-engineering/docs/es/projects/project-04-incremental-indexing/index.md similarity index 100% rename from docs/es/projects/project-04-incremental-indexing/index.md rename to courses/learn-harness-engineering/docs/es/projects/project-04-incremental-indexing/index.md diff --git a/docs/es/projects/project-05-grounded-qa-verification/index.md b/courses/learn-harness-engineering/docs/es/projects/project-05-grounded-qa-verification/index.md similarity index 100% rename from docs/es/projects/project-05-grounded-qa-verification/index.md rename to courses/learn-harness-engineering/docs/es/projects/project-05-grounded-qa-verification/index.md diff --git a/docs/es/projects/project-06-runtime-observability-and-debugging/index.md b/courses/learn-harness-engineering/docs/es/projects/project-06-runtime-observability-and-debugging/index.md similarity index 100% rename from docs/es/projects/project-06-runtime-observability-and-debugging/index.md rename to courses/learn-harness-engineering/docs/es/projects/project-06-runtime-observability-and-debugging/index.md diff --git a/docs/es/resources/index.md b/courses/learn-harness-engineering/docs/es/resources/index.md similarity index 100% rename from docs/es/resources/index.md rename to courses/learn-harness-engineering/docs/es/resources/index.md diff --git a/docs/es/resources/openai-advanced/index.md b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/index.md similarity index 100% rename from docs/es/resources/openai-advanced/index.md rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/index.md diff --git a/docs/es/resources/openai-advanced/repo-template/AGENTS.md b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/AGENTS.md similarity index 100% rename from docs/es/resources/openai-advanced/repo-template/AGENTS.md rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/AGENTS.md diff --git a/docs/es/resources/openai-advanced/repo-template/ARCHITECTURE.md b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/ARCHITECTURE.md similarity index 100% rename from docs/es/resources/openai-advanced/repo-template/ARCHITECTURE.md rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/ARCHITECTURE.md diff --git a/docs/es/resources/openai-advanced/repo-template/docs/DESIGN.md b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/DESIGN.md similarity index 100% rename from docs/es/resources/openai-advanced/repo-template/docs/DESIGN.md rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/DESIGN.md diff --git a/docs/es/resources/openai-advanced/repo-template/docs/FRONTEND.md b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/FRONTEND.md similarity index 100% rename from docs/es/resources/openai-advanced/repo-template/docs/FRONTEND.md rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/FRONTEND.md diff --git a/docs/es/resources/openai-advanced/repo-template/docs/PLANS.md b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/PLANS.md similarity index 100% rename from docs/es/resources/openai-advanced/repo-template/docs/PLANS.md rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/PLANS.md diff --git a/docs/es/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md similarity index 100% rename from docs/es/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md diff --git a/docs/es/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md similarity index 100% rename from docs/es/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md diff --git a/docs/es/resources/openai-advanced/repo-template/docs/RELIABILITY.md b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/RELIABILITY.md similarity index 100% rename from docs/es/resources/openai-advanced/repo-template/docs/RELIABILITY.md rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/RELIABILITY.md diff --git a/docs/es/resources/openai-advanced/repo-template/docs/SECURITY.md b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/SECURITY.md similarity index 100% rename from docs/es/resources/openai-advanced/repo-template/docs/SECURITY.md rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/SECURITY.md diff --git a/docs/es/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md similarity index 100% rename from docs/es/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md diff --git a/docs/es/resources/openai-advanced/repo-template/docs/design-docs/index.md b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/design-docs/index.md similarity index 100% rename from docs/es/resources/openai-advanced/repo-template/docs/design-docs/index.md rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/design-docs/index.md diff --git a/docs/es/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md similarity index 100% rename from docs/es/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md diff --git a/docs/es/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md similarity index 100% rename from docs/es/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md diff --git a/docs/es/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md similarity index 100% rename from docs/es/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md diff --git a/docs/es/resources/openai-advanced/repo-template/docs/generated/db-schema.md b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/generated/db-schema.md similarity index 100% rename from docs/es/resources/openai-advanced/repo-template/docs/generated/db-schema.md rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/generated/db-schema.md diff --git a/docs/es/resources/openai-advanced/repo-template/docs/product-specs/index.md b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/product-specs/index.md similarity index 100% rename from docs/es/resources/openai-advanced/repo-template/docs/product-specs/index.md rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/product-specs/index.md diff --git a/docs/es/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md similarity index 100% rename from docs/es/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md diff --git a/docs/es/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt similarity index 100% rename from docs/es/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt diff --git a/docs/es/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt similarity index 100% rename from docs/es/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt diff --git a/docs/es/resources/openai-advanced/repo-template/docs/references/uv-llms.txt b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/references/uv-llms.txt similarity index 100% rename from docs/es/resources/openai-advanced/repo-template/docs/references/uv-llms.txt rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/docs/references/uv-llms.txt diff --git a/docs/es/resources/openai-advanced/repo-template/index.md b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/index.md similarity index 100% rename from docs/es/resources/openai-advanced/repo-template/index.md rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/repo-template/index.md diff --git a/docs/es/resources/openai-advanced/sops/chrome-devtools-validation-loop.md b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/sops/chrome-devtools-validation-loop.md similarity index 100% rename from docs/es/resources/openai-advanced/sops/chrome-devtools-validation-loop.md rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/sops/chrome-devtools-validation-loop.md diff --git a/docs/es/resources/openai-advanced/sops/encode-knowledge-into-repo.md b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/sops/encode-knowledge-into-repo.md similarity index 100% rename from docs/es/resources/openai-advanced/sops/encode-knowledge-into-repo.md rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/sops/encode-knowledge-into-repo.md diff --git a/docs/es/resources/openai-advanced/sops/index.md b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/sops/index.md similarity index 100% rename from docs/es/resources/openai-advanced/sops/index.md rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/sops/index.md diff --git a/docs/es/resources/openai-advanced/sops/layered-domain-architecture.md b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/sops/layered-domain-architecture.md similarity index 100% rename from docs/es/resources/openai-advanced/sops/layered-domain-architecture.md rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/sops/layered-domain-architecture.md diff --git a/docs/es/resources/openai-advanced/sops/observability-feedback-loop.md b/courses/learn-harness-engineering/docs/es/resources/openai-advanced/sops/observability-feedback-loop.md similarity index 100% rename from docs/es/resources/openai-advanced/sops/observability-feedback-loop.md rename to courses/learn-harness-engineering/docs/es/resources/openai-advanced/sops/observability-feedback-loop.md diff --git a/docs/es/resources/reference/coding-agent-startup-flow.md b/courses/learn-harness-engineering/docs/es/resources/reference/coding-agent-startup-flow.md similarity index 100% rename from docs/es/resources/reference/coding-agent-startup-flow.md rename to courses/learn-harness-engineering/docs/es/resources/reference/coding-agent-startup-flow.md diff --git a/docs/es/resources/reference/index.md b/courses/learn-harness-engineering/docs/es/resources/reference/index.md similarity index 100% rename from docs/es/resources/reference/index.md rename to courses/learn-harness-engineering/docs/es/resources/reference/index.md diff --git a/docs/es/resources/reference/initializer-agent-playbook.md b/courses/learn-harness-engineering/docs/es/resources/reference/initializer-agent-playbook.md similarity index 100% rename from docs/es/resources/reference/initializer-agent-playbook.md rename to courses/learn-harness-engineering/docs/es/resources/reference/initializer-agent-playbook.md diff --git a/docs/es/resources/reference/method-map.md b/courses/learn-harness-engineering/docs/es/resources/reference/method-map.md similarity index 100% rename from docs/es/resources/reference/method-map.md rename to courses/learn-harness-engineering/docs/es/resources/reference/method-map.md diff --git a/docs/es/resources/reference/prompt-calibration.md b/courses/learn-harness-engineering/docs/es/resources/reference/prompt-calibration.md similarity index 100% rename from docs/es/resources/reference/prompt-calibration.md rename to courses/learn-harness-engineering/docs/es/resources/reference/prompt-calibration.md diff --git a/docs/es/resources/templates/AGENTS.md b/courses/learn-harness-engineering/docs/es/resources/templates/AGENTS.md similarity index 100% rename from docs/es/resources/templates/AGENTS.md rename to courses/learn-harness-engineering/docs/es/resources/templates/AGENTS.md diff --git a/docs/es/resources/templates/CLAUDE.md b/courses/learn-harness-engineering/docs/es/resources/templates/CLAUDE.md similarity index 100% rename from docs/es/resources/templates/CLAUDE.md rename to courses/learn-harness-engineering/docs/es/resources/templates/CLAUDE.md diff --git a/docs/es/resources/templates/claude-progress.md b/courses/learn-harness-engineering/docs/es/resources/templates/claude-progress.md similarity index 100% rename from docs/es/resources/templates/claude-progress.md rename to courses/learn-harness-engineering/docs/es/resources/templates/claude-progress.md diff --git a/docs/es/resources/templates/clean-state-checklist.md b/courses/learn-harness-engineering/docs/es/resources/templates/clean-state-checklist.md similarity index 100% rename from docs/es/resources/templates/clean-state-checklist.md rename to courses/learn-harness-engineering/docs/es/resources/templates/clean-state-checklist.md diff --git a/docs/es/resources/templates/evaluator-rubric.md b/courses/learn-harness-engineering/docs/es/resources/templates/evaluator-rubric.md similarity index 100% rename from docs/es/resources/templates/evaluator-rubric.md rename to courses/learn-harness-engineering/docs/es/resources/templates/evaluator-rubric.md diff --git a/docs/es/resources/templates/feature_list.json b/courses/learn-harness-engineering/docs/es/resources/templates/feature_list.json similarity index 100% rename from docs/es/resources/templates/feature_list.json rename to courses/learn-harness-engineering/docs/es/resources/templates/feature_list.json diff --git a/docs/es/resources/templates/index.md b/courses/learn-harness-engineering/docs/es/resources/templates/index.md similarity index 100% rename from docs/es/resources/templates/index.md rename to courses/learn-harness-engineering/docs/es/resources/templates/index.md diff --git a/docs/es/resources/templates/init.sh b/courses/learn-harness-engineering/docs/es/resources/templates/init.sh similarity index 100% rename from docs/es/resources/templates/init.sh rename to courses/learn-harness-engineering/docs/es/resources/templates/init.sh diff --git a/docs/es/resources/templates/quality-document.md b/courses/learn-harness-engineering/docs/es/resources/templates/quality-document.md similarity index 100% rename from docs/es/resources/templates/quality-document.md rename to courses/learn-harness-engineering/docs/es/resources/templates/quality-document.md diff --git a/docs/es/resources/templates/session-handoff.md b/courses/learn-harness-engineering/docs/es/resources/templates/session-handoff.md similarity index 100% rename from docs/es/resources/templates/session-handoff.md rename to courses/learn-harness-engineering/docs/es/resources/templates/session-handoff.md diff --git a/docs/es/skills/index.md b/courses/learn-harness-engineering/docs/es/skills/index.md similarity index 100% rename from docs/es/skills/index.md rename to courses/learn-harness-engineering/docs/es/skills/index.md diff --git a/docs/fr/index.md b/courses/learn-harness-engineering/docs/fr/index.md similarity index 100% rename from docs/fr/index.md rename to courses/learn-harness-engineering/docs/fr/index.md diff --git a/docs/fr/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts b/courses/learn-harness-engineering/docs/fr/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts similarity index 100% rename from docs/fr/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts diff --git a/docs/fr/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md similarity index 100% rename from docs/fr/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md diff --git a/docs/fr/lectures/lecture-01-why-capable-agents-still-fail/code/index.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-01-why-capable-agents-still-fail/code/index.md similarity index 100% rename from docs/fr/lectures/lecture-01-why-capable-agents-still-fail/code/index.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-01-why-capable-agents-still-fail/code/index.md diff --git a/docs/fr/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md similarity index 100% rename from docs/fr/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md diff --git a/docs/fr/lectures/lecture-01-why-capable-agents-still-fail/index.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-01-why-capable-agents-still-fail/index.md similarity index 100% rename from docs/fr/lectures/lecture-01-why-capable-agents-still-fail/index.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-01-why-capable-agents-still-fail/index.md diff --git a/docs/fr/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md similarity index 100% rename from docs/fr/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md diff --git a/docs/fr/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts b/courses/learn-harness-engineering/docs/fr/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts similarity index 100% rename from docs/fr/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts diff --git a/docs/fr/lectures/lecture-02-what-a-harness-actually-is/code/index.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-02-what-a-harness-actually-is/code/index.md similarity index 100% rename from docs/fr/lectures/lecture-02-what-a-harness-actually-is/code/index.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-02-what-a-harness-actually-is/code/index.md diff --git a/docs/fr/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts b/courses/learn-harness-engineering/docs/fr/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts similarity index 100% rename from docs/fr/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts diff --git a/docs/fr/lectures/lecture-02-what-a-harness-actually-is/index.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-02-what-a-harness-actually-is/index.md similarity index 100% rename from docs/fr/lectures/lecture-02-what-a-harness-actually-is/index.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-02-what-a-harness-actually-is/index.md diff --git a/docs/fr/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md similarity index 100% rename from docs/fr/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md diff --git a/docs/fr/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt b/courses/learn-harness-engineering/docs/fr/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt similarity index 100% rename from docs/fr/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt diff --git a/docs/fr/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts b/courses/learn-harness-engineering/docs/fr/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts similarity index 100% rename from docs/fr/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts diff --git a/docs/fr/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md similarity index 100% rename from docs/fr/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md diff --git a/docs/fr/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md similarity index 100% rename from docs/fr/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md diff --git a/docs/fr/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md similarity index 100% rename from docs/fr/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md diff --git a/docs/fr/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md similarity index 100% rename from docs/fr/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md diff --git a/docs/fr/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md similarity index 100% rename from docs/fr/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md diff --git a/docs/fr/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts b/courses/learn-harness-engineering/docs/fr/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts similarity index 100% rename from docs/fr/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts diff --git a/docs/fr/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md similarity index 100% rename from docs/fr/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md diff --git a/docs/fr/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md similarity index 100% rename from docs/fr/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md diff --git a/docs/fr/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md similarity index 100% rename from docs/fr/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md diff --git a/docs/fr/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md similarity index 100% rename from docs/fr/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md diff --git a/docs/fr/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts b/courses/learn-harness-engineering/docs/fr/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts similarity index 100% rename from docs/fr/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts diff --git a/docs/fr/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md similarity index 100% rename from docs/fr/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md diff --git a/docs/fr/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md similarity index 100% rename from docs/fr/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md diff --git a/docs/fr/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts b/courses/learn-harness-engineering/docs/fr/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts similarity index 100% rename from docs/fr/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts diff --git a/docs/fr/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh b/courses/learn-harness-engineering/docs/fr/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh similarity index 100% rename from docs/fr/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh diff --git a/docs/fr/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md similarity index 100% rename from docs/fr/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md diff --git a/docs/fr/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md similarity index 100% rename from docs/fr/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md diff --git a/docs/fr/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md similarity index 100% rename from docs/fr/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md diff --git a/docs/fr/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md similarity index 100% rename from docs/fr/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md diff --git a/docs/fr/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md similarity index 100% rename from docs/fr/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md diff --git a/docs/fr/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts b/courses/learn-harness-engineering/docs/fr/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts similarity index 100% rename from docs/fr/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts diff --git a/docs/fr/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md similarity index 100% rename from docs/fr/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md diff --git a/docs/fr/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts b/courses/learn-harness-engineering/docs/fr/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts similarity index 100% rename from docs/fr/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts diff --git a/docs/fr/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json b/courses/learn-harness-engineering/docs/fr/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json similarity index 100% rename from docs/fr/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json diff --git a/docs/fr/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md similarity index 100% rename from docs/fr/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md diff --git a/docs/fr/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md similarity index 100% rename from docs/fr/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md diff --git a/docs/fr/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md similarity index 100% rename from docs/fr/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md diff --git a/docs/fr/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md similarity index 100% rename from docs/fr/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md diff --git a/docs/fr/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md similarity index 100% rename from docs/fr/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md diff --git a/docs/fr/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts b/courses/learn-harness-engineering/docs/fr/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts similarity index 100% rename from docs/fr/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts diff --git a/docs/fr/lectures/lecture-09-why-agents-declare-victory-too-early/index.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-09-why-agents-declare-victory-too-early/index.md similarity index 100% rename from docs/fr/lectures/lecture-09-why-agents-declare-victory-too-early/index.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-09-why-agents-declare-victory-too-early/index.md diff --git a/docs/fr/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md similarity index 100% rename from docs/fr/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md diff --git a/docs/fr/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts b/courses/learn-harness-engineering/docs/fr/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts similarity index 100% rename from docs/fr/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts diff --git a/docs/fr/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md similarity index 100% rename from docs/fr/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md diff --git a/docs/fr/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md similarity index 100% rename from docs/fr/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md diff --git a/docs/fr/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md similarity index 100% rename from docs/fr/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md diff --git a/docs/fr/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md similarity index 100% rename from docs/fr/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md diff --git a/docs/fr/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md similarity index 100% rename from docs/fr/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md diff --git a/docs/fr/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts b/courses/learn-harness-engineering/docs/fr/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts similarity index 100% rename from docs/fr/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts diff --git a/docs/fr/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md similarity index 100% rename from docs/fr/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md diff --git a/docs/fr/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md similarity index 100% rename from docs/fr/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md diff --git a/docs/fr/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md similarity index 100% rename from docs/fr/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md diff --git a/docs/fr/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts b/courses/learn-harness-engineering/docs/fr/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts similarity index 100% rename from docs/fr/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts diff --git a/docs/fr/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md similarity index 100% rename from docs/fr/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md diff --git a/docs/fr/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts b/courses/learn-harness-engineering/docs/fr/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts similarity index 100% rename from docs/fr/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts diff --git a/docs/fr/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md similarity index 100% rename from docs/fr/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md diff --git a/docs/fr/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md b/courses/learn-harness-engineering/docs/fr/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md similarity index 100% rename from docs/fr/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md rename to courses/learn-harness-engineering/docs/fr/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md diff --git a/docs/fr/projects/index.md b/courses/learn-harness-engineering/docs/fr/projects/index.md similarity index 100% rename from docs/fr/projects/index.md rename to courses/learn-harness-engineering/docs/fr/projects/index.md diff --git a/docs/fr/projects/project-01-baseline-vs-minimal-harness/index.md b/courses/learn-harness-engineering/docs/fr/projects/project-01-baseline-vs-minimal-harness/index.md similarity index 100% rename from docs/fr/projects/project-01-baseline-vs-minimal-harness/index.md rename to courses/learn-harness-engineering/docs/fr/projects/project-01-baseline-vs-minimal-harness/index.md diff --git a/docs/fr/projects/project-02-agent-readable-workspace/index.md b/courses/learn-harness-engineering/docs/fr/projects/project-02-agent-readable-workspace/index.md similarity index 100% rename from docs/fr/projects/project-02-agent-readable-workspace/index.md rename to courses/learn-harness-engineering/docs/fr/projects/project-02-agent-readable-workspace/index.md diff --git a/docs/fr/projects/project-03-multi-session-continuity/index.md b/courses/learn-harness-engineering/docs/fr/projects/project-03-multi-session-continuity/index.md similarity index 100% rename from docs/fr/projects/project-03-multi-session-continuity/index.md rename to courses/learn-harness-engineering/docs/fr/projects/project-03-multi-session-continuity/index.md diff --git a/docs/fr/projects/project-04-incremental-indexing/index.md b/courses/learn-harness-engineering/docs/fr/projects/project-04-incremental-indexing/index.md similarity index 100% rename from docs/fr/projects/project-04-incremental-indexing/index.md rename to courses/learn-harness-engineering/docs/fr/projects/project-04-incremental-indexing/index.md diff --git a/docs/fr/projects/project-05-grounded-qa-verification/index.md b/courses/learn-harness-engineering/docs/fr/projects/project-05-grounded-qa-verification/index.md similarity index 100% rename from docs/fr/projects/project-05-grounded-qa-verification/index.md rename to courses/learn-harness-engineering/docs/fr/projects/project-05-grounded-qa-verification/index.md diff --git a/docs/fr/projects/project-06-runtime-observability-and-debugging/index.md b/courses/learn-harness-engineering/docs/fr/projects/project-06-runtime-observability-and-debugging/index.md similarity index 100% rename from docs/fr/projects/project-06-runtime-observability-and-debugging/index.md rename to courses/learn-harness-engineering/docs/fr/projects/project-06-runtime-observability-and-debugging/index.md diff --git a/docs/fr/resources/index.md b/courses/learn-harness-engineering/docs/fr/resources/index.md similarity index 100% rename from docs/fr/resources/index.md rename to courses/learn-harness-engineering/docs/fr/resources/index.md diff --git a/docs/fr/resources/openai-advanced/index.md b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/index.md similarity index 100% rename from docs/fr/resources/openai-advanced/index.md rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/index.md diff --git a/docs/fr/resources/openai-advanced/repo-template/AGENTS.md b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/AGENTS.md similarity index 100% rename from docs/fr/resources/openai-advanced/repo-template/AGENTS.md rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/AGENTS.md diff --git a/docs/fr/resources/openai-advanced/repo-template/ARCHITECTURE.md b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/ARCHITECTURE.md similarity index 100% rename from docs/fr/resources/openai-advanced/repo-template/ARCHITECTURE.md rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/ARCHITECTURE.md diff --git a/docs/fr/resources/openai-advanced/repo-template/docs/DESIGN.md b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/DESIGN.md similarity index 100% rename from docs/fr/resources/openai-advanced/repo-template/docs/DESIGN.md rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/DESIGN.md diff --git a/docs/fr/resources/openai-advanced/repo-template/docs/FRONTEND.md b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/FRONTEND.md similarity index 100% rename from docs/fr/resources/openai-advanced/repo-template/docs/FRONTEND.md rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/FRONTEND.md diff --git a/docs/fr/resources/openai-advanced/repo-template/docs/PLANS.md b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/PLANS.md similarity index 100% rename from docs/fr/resources/openai-advanced/repo-template/docs/PLANS.md rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/PLANS.md diff --git a/docs/fr/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md similarity index 100% rename from docs/fr/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md diff --git a/docs/fr/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md similarity index 100% rename from docs/fr/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md diff --git a/docs/fr/resources/openai-advanced/repo-template/docs/RELIABILITY.md b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/RELIABILITY.md similarity index 100% rename from docs/fr/resources/openai-advanced/repo-template/docs/RELIABILITY.md rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/RELIABILITY.md diff --git a/docs/fr/resources/openai-advanced/repo-template/docs/SECURITY.md b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/SECURITY.md similarity index 100% rename from docs/fr/resources/openai-advanced/repo-template/docs/SECURITY.md rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/SECURITY.md diff --git a/docs/fr/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md similarity index 100% rename from docs/fr/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md diff --git a/docs/fr/resources/openai-advanced/repo-template/docs/design-docs/index.md b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/design-docs/index.md similarity index 100% rename from docs/fr/resources/openai-advanced/repo-template/docs/design-docs/index.md rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/design-docs/index.md diff --git a/docs/fr/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md similarity index 100% rename from docs/fr/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md diff --git a/docs/fr/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md similarity index 100% rename from docs/fr/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md diff --git a/docs/fr/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md similarity index 100% rename from docs/fr/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md diff --git a/docs/fr/resources/openai-advanced/repo-template/docs/generated/db-schema.md b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/generated/db-schema.md similarity index 100% rename from docs/fr/resources/openai-advanced/repo-template/docs/generated/db-schema.md rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/generated/db-schema.md diff --git a/docs/fr/resources/openai-advanced/repo-template/docs/product-specs/index.md b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/product-specs/index.md similarity index 100% rename from docs/fr/resources/openai-advanced/repo-template/docs/product-specs/index.md rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/product-specs/index.md diff --git a/docs/fr/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md similarity index 100% rename from docs/fr/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md diff --git a/docs/fr/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt similarity index 100% rename from docs/fr/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt diff --git a/docs/fr/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt similarity index 100% rename from docs/fr/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt diff --git a/docs/fr/resources/openai-advanced/repo-template/docs/references/uv-llms.txt b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/references/uv-llms.txt similarity index 100% rename from docs/fr/resources/openai-advanced/repo-template/docs/references/uv-llms.txt rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/docs/references/uv-llms.txt diff --git a/docs/fr/resources/openai-advanced/repo-template/index.md b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/index.md similarity index 100% rename from docs/fr/resources/openai-advanced/repo-template/index.md rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/repo-template/index.md diff --git a/docs/fr/resources/openai-advanced/sops/chrome-devtools-validation-loop.md b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/sops/chrome-devtools-validation-loop.md similarity index 100% rename from docs/fr/resources/openai-advanced/sops/chrome-devtools-validation-loop.md rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/sops/chrome-devtools-validation-loop.md diff --git a/docs/fr/resources/openai-advanced/sops/encode-knowledge-into-repo.md b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/sops/encode-knowledge-into-repo.md similarity index 100% rename from docs/fr/resources/openai-advanced/sops/encode-knowledge-into-repo.md rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/sops/encode-knowledge-into-repo.md diff --git a/docs/fr/resources/openai-advanced/sops/index.md b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/sops/index.md similarity index 100% rename from docs/fr/resources/openai-advanced/sops/index.md rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/sops/index.md diff --git a/docs/fr/resources/openai-advanced/sops/layered-domain-architecture.md b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/sops/layered-domain-architecture.md similarity index 100% rename from docs/fr/resources/openai-advanced/sops/layered-domain-architecture.md rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/sops/layered-domain-architecture.md diff --git a/docs/fr/resources/openai-advanced/sops/observability-feedback-loop.md b/courses/learn-harness-engineering/docs/fr/resources/openai-advanced/sops/observability-feedback-loop.md similarity index 100% rename from docs/fr/resources/openai-advanced/sops/observability-feedback-loop.md rename to courses/learn-harness-engineering/docs/fr/resources/openai-advanced/sops/observability-feedback-loop.md diff --git a/docs/fr/resources/reference/coding-agent-startup-flow.md b/courses/learn-harness-engineering/docs/fr/resources/reference/coding-agent-startup-flow.md similarity index 100% rename from docs/fr/resources/reference/coding-agent-startup-flow.md rename to courses/learn-harness-engineering/docs/fr/resources/reference/coding-agent-startup-flow.md diff --git a/docs/fr/resources/reference/index.md b/courses/learn-harness-engineering/docs/fr/resources/reference/index.md similarity index 100% rename from docs/fr/resources/reference/index.md rename to courses/learn-harness-engineering/docs/fr/resources/reference/index.md diff --git a/docs/fr/resources/reference/initializer-agent-playbook.md b/courses/learn-harness-engineering/docs/fr/resources/reference/initializer-agent-playbook.md similarity index 100% rename from docs/fr/resources/reference/initializer-agent-playbook.md rename to courses/learn-harness-engineering/docs/fr/resources/reference/initializer-agent-playbook.md diff --git a/docs/fr/resources/reference/method-map.md b/courses/learn-harness-engineering/docs/fr/resources/reference/method-map.md similarity index 100% rename from docs/fr/resources/reference/method-map.md rename to courses/learn-harness-engineering/docs/fr/resources/reference/method-map.md diff --git a/docs/fr/resources/reference/prompt-calibration.md b/courses/learn-harness-engineering/docs/fr/resources/reference/prompt-calibration.md similarity index 100% rename from docs/fr/resources/reference/prompt-calibration.md rename to courses/learn-harness-engineering/docs/fr/resources/reference/prompt-calibration.md diff --git a/docs/fr/resources/templates/AGENTS.md b/courses/learn-harness-engineering/docs/fr/resources/templates/AGENTS.md similarity index 100% rename from docs/fr/resources/templates/AGENTS.md rename to courses/learn-harness-engineering/docs/fr/resources/templates/AGENTS.md diff --git a/docs/fr/resources/templates/CLAUDE.md b/courses/learn-harness-engineering/docs/fr/resources/templates/CLAUDE.md similarity index 100% rename from docs/fr/resources/templates/CLAUDE.md rename to courses/learn-harness-engineering/docs/fr/resources/templates/CLAUDE.md diff --git a/docs/fr/resources/templates/claude-progress.md b/courses/learn-harness-engineering/docs/fr/resources/templates/claude-progress.md similarity index 100% rename from docs/fr/resources/templates/claude-progress.md rename to courses/learn-harness-engineering/docs/fr/resources/templates/claude-progress.md diff --git a/docs/fr/resources/templates/clean-state-checklist.md b/courses/learn-harness-engineering/docs/fr/resources/templates/clean-state-checklist.md similarity index 100% rename from docs/fr/resources/templates/clean-state-checklist.md rename to courses/learn-harness-engineering/docs/fr/resources/templates/clean-state-checklist.md diff --git a/docs/fr/resources/templates/evaluator-rubric.md b/courses/learn-harness-engineering/docs/fr/resources/templates/evaluator-rubric.md similarity index 100% rename from docs/fr/resources/templates/evaluator-rubric.md rename to courses/learn-harness-engineering/docs/fr/resources/templates/evaluator-rubric.md diff --git a/docs/fr/resources/templates/feature_list.json b/courses/learn-harness-engineering/docs/fr/resources/templates/feature_list.json similarity index 100% rename from docs/fr/resources/templates/feature_list.json rename to courses/learn-harness-engineering/docs/fr/resources/templates/feature_list.json diff --git a/docs/fr/resources/templates/index.md b/courses/learn-harness-engineering/docs/fr/resources/templates/index.md similarity index 100% rename from docs/fr/resources/templates/index.md rename to courses/learn-harness-engineering/docs/fr/resources/templates/index.md diff --git a/docs/fr/resources/templates/init.sh b/courses/learn-harness-engineering/docs/fr/resources/templates/init.sh similarity index 100% rename from docs/fr/resources/templates/init.sh rename to courses/learn-harness-engineering/docs/fr/resources/templates/init.sh diff --git a/docs/fr/resources/templates/quality-document.md b/courses/learn-harness-engineering/docs/fr/resources/templates/quality-document.md similarity index 100% rename from docs/fr/resources/templates/quality-document.md rename to courses/learn-harness-engineering/docs/fr/resources/templates/quality-document.md diff --git a/docs/fr/resources/templates/session-handoff.md b/courses/learn-harness-engineering/docs/fr/resources/templates/session-handoff.md similarity index 100% rename from docs/fr/resources/templates/session-handoff.md rename to courses/learn-harness-engineering/docs/fr/resources/templates/session-handoff.md diff --git a/docs/fr/skills/index.md b/courses/learn-harness-engineering/docs/fr/skills/index.md similarity index 100% rename from docs/fr/skills/index.md rename to courses/learn-harness-engineering/docs/fr/skills/index.md diff --git a/docs/index.md b/courses/learn-harness-engineering/docs/index.md similarity index 100% rename from docs/index.md rename to courses/learn-harness-engineering/docs/index.md diff --git a/docs/ja/index.md b/courses/learn-harness-engineering/docs/ja/index.md similarity index 100% rename from docs/ja/index.md rename to courses/learn-harness-engineering/docs/ja/index.md diff --git a/docs/ja/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts b/courses/learn-harness-engineering/docs/ja/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts similarity index 100% rename from docs/ja/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts diff --git a/docs/ja/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md similarity index 100% rename from docs/ja/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md diff --git a/docs/ja/lectures/lecture-01-why-capable-agents-still-fail/code/index.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-01-why-capable-agents-still-fail/code/index.md similarity index 100% rename from docs/ja/lectures/lecture-01-why-capable-agents-still-fail/code/index.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-01-why-capable-agents-still-fail/code/index.md diff --git a/docs/ja/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md similarity index 100% rename from docs/ja/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md diff --git a/docs/ja/lectures/lecture-01-why-capable-agents-still-fail/index.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-01-why-capable-agents-still-fail/index.md similarity index 100% rename from docs/ja/lectures/lecture-01-why-capable-agents-still-fail/index.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-01-why-capable-agents-still-fail/index.md diff --git a/docs/ja/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md similarity index 100% rename from docs/ja/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md diff --git a/docs/ja/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts b/courses/learn-harness-engineering/docs/ja/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts similarity index 100% rename from docs/ja/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts diff --git a/docs/ja/lectures/lecture-02-what-a-harness-actually-is/code/index.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-02-what-a-harness-actually-is/code/index.md similarity index 100% rename from docs/ja/lectures/lecture-02-what-a-harness-actually-is/code/index.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-02-what-a-harness-actually-is/code/index.md diff --git a/docs/ja/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts b/courses/learn-harness-engineering/docs/ja/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts similarity index 100% rename from docs/ja/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts diff --git a/docs/ja/lectures/lecture-02-what-a-harness-actually-is/index.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-02-what-a-harness-actually-is/index.md similarity index 100% rename from docs/ja/lectures/lecture-02-what-a-harness-actually-is/index.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-02-what-a-harness-actually-is/index.md diff --git a/docs/ja/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md similarity index 100% rename from docs/ja/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md diff --git a/docs/ja/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt b/courses/learn-harness-engineering/docs/ja/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt similarity index 100% rename from docs/ja/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt diff --git a/docs/ja/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts b/courses/learn-harness-engineering/docs/ja/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts similarity index 100% rename from docs/ja/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts diff --git a/docs/ja/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md similarity index 100% rename from docs/ja/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md diff --git a/docs/ja/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md similarity index 100% rename from docs/ja/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md diff --git a/docs/ja/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md similarity index 100% rename from docs/ja/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md diff --git a/docs/ja/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md similarity index 100% rename from docs/ja/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md diff --git a/docs/ja/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md similarity index 100% rename from docs/ja/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md diff --git a/docs/ja/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts b/courses/learn-harness-engineering/docs/ja/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts similarity index 100% rename from docs/ja/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts diff --git a/docs/ja/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md similarity index 100% rename from docs/ja/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md diff --git a/docs/ja/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md similarity index 100% rename from docs/ja/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md diff --git a/docs/ja/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md similarity index 100% rename from docs/ja/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md diff --git a/docs/ja/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md similarity index 100% rename from docs/ja/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md diff --git a/docs/ja/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts b/courses/learn-harness-engineering/docs/ja/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts similarity index 100% rename from docs/ja/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts diff --git a/docs/ja/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md similarity index 100% rename from docs/ja/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md diff --git a/docs/ja/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md similarity index 100% rename from docs/ja/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md diff --git a/docs/ja/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts b/courses/learn-harness-engineering/docs/ja/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts similarity index 100% rename from docs/ja/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts diff --git a/docs/ja/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh b/courses/learn-harness-engineering/docs/ja/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh similarity index 100% rename from docs/ja/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh diff --git a/docs/ja/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md similarity index 100% rename from docs/ja/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md diff --git a/docs/ja/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md similarity index 100% rename from docs/ja/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md diff --git a/docs/ja/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md similarity index 100% rename from docs/ja/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md diff --git a/docs/ja/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md similarity index 100% rename from docs/ja/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md diff --git a/docs/ja/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md similarity index 100% rename from docs/ja/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md diff --git a/docs/ja/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts b/courses/learn-harness-engineering/docs/ja/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts similarity index 100% rename from docs/ja/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts diff --git a/docs/ja/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md similarity index 100% rename from docs/ja/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md diff --git a/docs/ja/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts b/courses/learn-harness-engineering/docs/ja/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts similarity index 100% rename from docs/ja/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts diff --git a/docs/ja/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json b/courses/learn-harness-engineering/docs/ja/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json similarity index 100% rename from docs/ja/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json diff --git a/docs/ja/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md similarity index 100% rename from docs/ja/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md diff --git a/docs/ja/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md similarity index 100% rename from docs/ja/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md diff --git a/docs/ja/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md similarity index 100% rename from docs/ja/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md diff --git a/docs/ja/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md similarity index 100% rename from docs/ja/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md diff --git a/docs/ja/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md similarity index 100% rename from docs/ja/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md diff --git a/docs/ja/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts b/courses/learn-harness-engineering/docs/ja/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts similarity index 100% rename from docs/ja/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts diff --git a/docs/ja/lectures/lecture-09-why-agents-declare-victory-too-early/index.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-09-why-agents-declare-victory-too-early/index.md similarity index 100% rename from docs/ja/lectures/lecture-09-why-agents-declare-victory-too-early/index.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-09-why-agents-declare-victory-too-early/index.md diff --git a/docs/ja/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md similarity index 100% rename from docs/ja/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md diff --git a/docs/ja/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts b/courses/learn-harness-engineering/docs/ja/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts similarity index 100% rename from docs/ja/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts diff --git a/docs/ja/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md similarity index 100% rename from docs/ja/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md diff --git a/docs/ja/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md similarity index 100% rename from docs/ja/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md diff --git a/docs/ja/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md similarity index 100% rename from docs/ja/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md diff --git a/docs/ja/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md similarity index 100% rename from docs/ja/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md diff --git a/docs/ja/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md similarity index 100% rename from docs/ja/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md diff --git a/docs/ja/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts b/courses/learn-harness-engineering/docs/ja/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts similarity index 100% rename from docs/ja/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts diff --git a/docs/ja/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md similarity index 100% rename from docs/ja/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md diff --git a/docs/ja/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md similarity index 100% rename from docs/ja/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md diff --git a/docs/ja/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md similarity index 100% rename from docs/ja/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md diff --git a/docs/ja/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts b/courses/learn-harness-engineering/docs/ja/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts similarity index 100% rename from docs/ja/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts diff --git a/docs/ja/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md similarity index 100% rename from docs/ja/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md diff --git a/docs/ja/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts b/courses/learn-harness-engineering/docs/ja/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts similarity index 100% rename from docs/ja/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts diff --git a/docs/ja/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md similarity index 100% rename from docs/ja/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md diff --git a/docs/ja/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md b/courses/learn-harness-engineering/docs/ja/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md similarity index 100% rename from docs/ja/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md rename to courses/learn-harness-engineering/docs/ja/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md diff --git a/docs/ja/projects/index.md b/courses/learn-harness-engineering/docs/ja/projects/index.md similarity index 100% rename from docs/ja/projects/index.md rename to courses/learn-harness-engineering/docs/ja/projects/index.md diff --git a/docs/ja/projects/project-01-baseline-vs-minimal-harness/index.md b/courses/learn-harness-engineering/docs/ja/projects/project-01-baseline-vs-minimal-harness/index.md similarity index 100% rename from docs/ja/projects/project-01-baseline-vs-minimal-harness/index.md rename to courses/learn-harness-engineering/docs/ja/projects/project-01-baseline-vs-minimal-harness/index.md diff --git a/docs/ja/projects/project-02-agent-readable-workspace/index.md b/courses/learn-harness-engineering/docs/ja/projects/project-02-agent-readable-workspace/index.md similarity index 100% rename from docs/ja/projects/project-02-agent-readable-workspace/index.md rename to courses/learn-harness-engineering/docs/ja/projects/project-02-agent-readable-workspace/index.md diff --git a/docs/ja/projects/project-03-multi-session-continuity/index.md b/courses/learn-harness-engineering/docs/ja/projects/project-03-multi-session-continuity/index.md similarity index 100% rename from docs/ja/projects/project-03-multi-session-continuity/index.md rename to courses/learn-harness-engineering/docs/ja/projects/project-03-multi-session-continuity/index.md diff --git a/docs/ja/projects/project-04-incremental-indexing/index.md b/courses/learn-harness-engineering/docs/ja/projects/project-04-incremental-indexing/index.md similarity index 100% rename from docs/ja/projects/project-04-incremental-indexing/index.md rename to courses/learn-harness-engineering/docs/ja/projects/project-04-incremental-indexing/index.md diff --git a/docs/ja/projects/project-05-grounded-qa-verification/index.md b/courses/learn-harness-engineering/docs/ja/projects/project-05-grounded-qa-verification/index.md similarity index 100% rename from docs/ja/projects/project-05-grounded-qa-verification/index.md rename to courses/learn-harness-engineering/docs/ja/projects/project-05-grounded-qa-verification/index.md diff --git a/docs/ja/projects/project-06-runtime-observability-and-debugging/index.md b/courses/learn-harness-engineering/docs/ja/projects/project-06-runtime-observability-and-debugging/index.md similarity index 100% rename from docs/ja/projects/project-06-runtime-observability-and-debugging/index.md rename to courses/learn-harness-engineering/docs/ja/projects/project-06-runtime-observability-and-debugging/index.md diff --git a/docs/ja/resources/index.md b/courses/learn-harness-engineering/docs/ja/resources/index.md similarity index 100% rename from docs/ja/resources/index.md rename to courses/learn-harness-engineering/docs/ja/resources/index.md diff --git a/docs/ja/resources/openai-advanced/index.md b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/index.md similarity index 100% rename from docs/ja/resources/openai-advanced/index.md rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/index.md diff --git a/docs/ja/resources/openai-advanced/repo-template/AGENTS.md b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/AGENTS.md similarity index 100% rename from docs/ja/resources/openai-advanced/repo-template/AGENTS.md rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/AGENTS.md diff --git a/docs/ja/resources/openai-advanced/repo-template/ARCHITECTURE.md b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/ARCHITECTURE.md similarity index 100% rename from docs/ja/resources/openai-advanced/repo-template/ARCHITECTURE.md rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/ARCHITECTURE.md diff --git a/docs/ja/resources/openai-advanced/repo-template/docs/DESIGN.md b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/DESIGN.md similarity index 100% rename from docs/ja/resources/openai-advanced/repo-template/docs/DESIGN.md rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/DESIGN.md diff --git a/docs/ja/resources/openai-advanced/repo-template/docs/FRONTEND.md b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/FRONTEND.md similarity index 100% rename from docs/ja/resources/openai-advanced/repo-template/docs/FRONTEND.md rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/FRONTEND.md diff --git a/docs/ja/resources/openai-advanced/repo-template/docs/PLANS.md b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/PLANS.md similarity index 100% rename from docs/ja/resources/openai-advanced/repo-template/docs/PLANS.md rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/PLANS.md diff --git a/docs/ja/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md similarity index 100% rename from docs/ja/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md diff --git a/docs/ja/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md similarity index 100% rename from docs/ja/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md diff --git a/docs/ja/resources/openai-advanced/repo-template/docs/RELIABILITY.md b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/RELIABILITY.md similarity index 100% rename from docs/ja/resources/openai-advanced/repo-template/docs/RELIABILITY.md rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/RELIABILITY.md diff --git a/docs/ja/resources/openai-advanced/repo-template/docs/SECURITY.md b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/SECURITY.md similarity index 100% rename from docs/ja/resources/openai-advanced/repo-template/docs/SECURITY.md rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/SECURITY.md diff --git a/docs/ja/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md similarity index 100% rename from docs/ja/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md diff --git a/docs/ja/resources/openai-advanced/repo-template/docs/design-docs/index.md b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/design-docs/index.md similarity index 100% rename from docs/ja/resources/openai-advanced/repo-template/docs/design-docs/index.md rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/design-docs/index.md diff --git a/docs/ja/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md similarity index 100% rename from docs/ja/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md diff --git a/docs/ja/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md similarity index 100% rename from docs/ja/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md diff --git a/docs/ja/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md similarity index 100% rename from docs/ja/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md diff --git a/docs/ja/resources/openai-advanced/repo-template/docs/generated/db-schema.md b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/generated/db-schema.md similarity index 100% rename from docs/ja/resources/openai-advanced/repo-template/docs/generated/db-schema.md rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/generated/db-schema.md diff --git a/docs/ja/resources/openai-advanced/repo-template/docs/product-specs/index.md b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/product-specs/index.md similarity index 100% rename from docs/ja/resources/openai-advanced/repo-template/docs/product-specs/index.md rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/product-specs/index.md diff --git a/docs/ja/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md similarity index 100% rename from docs/ja/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md diff --git a/docs/ja/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt similarity index 100% rename from docs/ja/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt diff --git a/docs/ja/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt similarity index 100% rename from docs/ja/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt diff --git a/docs/ja/resources/openai-advanced/repo-template/docs/references/uv-llms.txt b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/references/uv-llms.txt similarity index 100% rename from docs/ja/resources/openai-advanced/repo-template/docs/references/uv-llms.txt rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/docs/references/uv-llms.txt diff --git a/docs/ja/resources/openai-advanced/repo-template/index.md b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/index.md similarity index 100% rename from docs/ja/resources/openai-advanced/repo-template/index.md rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/repo-template/index.md diff --git a/docs/ja/resources/openai-advanced/sops/chrome-devtools-validation-loop.md b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/sops/chrome-devtools-validation-loop.md similarity index 100% rename from docs/ja/resources/openai-advanced/sops/chrome-devtools-validation-loop.md rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/sops/chrome-devtools-validation-loop.md diff --git a/docs/ja/resources/openai-advanced/sops/encode-knowledge-into-repo.md b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/sops/encode-knowledge-into-repo.md similarity index 100% rename from docs/ja/resources/openai-advanced/sops/encode-knowledge-into-repo.md rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/sops/encode-knowledge-into-repo.md diff --git a/docs/ja/resources/openai-advanced/sops/index.md b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/sops/index.md similarity index 100% rename from docs/ja/resources/openai-advanced/sops/index.md rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/sops/index.md diff --git a/docs/ja/resources/openai-advanced/sops/layered-domain-architecture.md b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/sops/layered-domain-architecture.md similarity index 100% rename from docs/ja/resources/openai-advanced/sops/layered-domain-architecture.md rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/sops/layered-domain-architecture.md diff --git a/docs/ja/resources/openai-advanced/sops/observability-feedback-loop.md b/courses/learn-harness-engineering/docs/ja/resources/openai-advanced/sops/observability-feedback-loop.md similarity index 100% rename from docs/ja/resources/openai-advanced/sops/observability-feedback-loop.md rename to courses/learn-harness-engineering/docs/ja/resources/openai-advanced/sops/observability-feedback-loop.md diff --git a/docs/ja/resources/reference/coding-agent-startup-flow.md b/courses/learn-harness-engineering/docs/ja/resources/reference/coding-agent-startup-flow.md similarity index 100% rename from docs/ja/resources/reference/coding-agent-startup-flow.md rename to courses/learn-harness-engineering/docs/ja/resources/reference/coding-agent-startup-flow.md diff --git a/docs/ja/resources/reference/index.md b/courses/learn-harness-engineering/docs/ja/resources/reference/index.md similarity index 100% rename from docs/ja/resources/reference/index.md rename to courses/learn-harness-engineering/docs/ja/resources/reference/index.md diff --git a/docs/ja/resources/reference/initializer-agent-playbook.md b/courses/learn-harness-engineering/docs/ja/resources/reference/initializer-agent-playbook.md similarity index 100% rename from docs/ja/resources/reference/initializer-agent-playbook.md rename to courses/learn-harness-engineering/docs/ja/resources/reference/initializer-agent-playbook.md diff --git a/docs/ja/resources/reference/method-map.md b/courses/learn-harness-engineering/docs/ja/resources/reference/method-map.md similarity index 100% rename from docs/ja/resources/reference/method-map.md rename to courses/learn-harness-engineering/docs/ja/resources/reference/method-map.md diff --git a/docs/ja/resources/reference/prompt-calibration.md b/courses/learn-harness-engineering/docs/ja/resources/reference/prompt-calibration.md similarity index 100% rename from docs/ja/resources/reference/prompt-calibration.md rename to courses/learn-harness-engineering/docs/ja/resources/reference/prompt-calibration.md diff --git a/docs/ja/resources/templates/AGENTS.md b/courses/learn-harness-engineering/docs/ja/resources/templates/AGENTS.md similarity index 100% rename from docs/ja/resources/templates/AGENTS.md rename to courses/learn-harness-engineering/docs/ja/resources/templates/AGENTS.md diff --git a/docs/ja/resources/templates/CLAUDE.md b/courses/learn-harness-engineering/docs/ja/resources/templates/CLAUDE.md similarity index 100% rename from docs/ja/resources/templates/CLAUDE.md rename to courses/learn-harness-engineering/docs/ja/resources/templates/CLAUDE.md diff --git a/docs/ja/resources/templates/claude-progress.md b/courses/learn-harness-engineering/docs/ja/resources/templates/claude-progress.md similarity index 100% rename from docs/ja/resources/templates/claude-progress.md rename to courses/learn-harness-engineering/docs/ja/resources/templates/claude-progress.md diff --git a/docs/ja/resources/templates/clean-state-checklist.md b/courses/learn-harness-engineering/docs/ja/resources/templates/clean-state-checklist.md similarity index 100% rename from docs/ja/resources/templates/clean-state-checklist.md rename to courses/learn-harness-engineering/docs/ja/resources/templates/clean-state-checklist.md diff --git a/docs/ja/resources/templates/evaluator-rubric.md b/courses/learn-harness-engineering/docs/ja/resources/templates/evaluator-rubric.md similarity index 100% rename from docs/ja/resources/templates/evaluator-rubric.md rename to courses/learn-harness-engineering/docs/ja/resources/templates/evaluator-rubric.md diff --git a/docs/ja/resources/templates/feature_list.json b/courses/learn-harness-engineering/docs/ja/resources/templates/feature_list.json similarity index 100% rename from docs/ja/resources/templates/feature_list.json rename to courses/learn-harness-engineering/docs/ja/resources/templates/feature_list.json diff --git a/docs/ja/resources/templates/index.md b/courses/learn-harness-engineering/docs/ja/resources/templates/index.md similarity index 100% rename from docs/ja/resources/templates/index.md rename to courses/learn-harness-engineering/docs/ja/resources/templates/index.md diff --git a/docs/ja/resources/templates/init.sh b/courses/learn-harness-engineering/docs/ja/resources/templates/init.sh similarity index 100% rename from docs/ja/resources/templates/init.sh rename to courses/learn-harness-engineering/docs/ja/resources/templates/init.sh diff --git a/docs/ja/resources/templates/quality-document.md b/courses/learn-harness-engineering/docs/ja/resources/templates/quality-document.md similarity index 100% rename from docs/ja/resources/templates/quality-document.md rename to courses/learn-harness-engineering/docs/ja/resources/templates/quality-document.md diff --git a/docs/ja/resources/templates/session-handoff.md b/courses/learn-harness-engineering/docs/ja/resources/templates/session-handoff.md similarity index 100% rename from docs/ja/resources/templates/session-handoff.md rename to courses/learn-harness-engineering/docs/ja/resources/templates/session-handoff.md diff --git a/docs/ja/skills/index.md b/courses/learn-harness-engineering/docs/ja/skills/index.md similarity index 100% rename from docs/ja/skills/index.md rename to courses/learn-harness-engineering/docs/ja/skills/index.md diff --git a/courses/learn-harness-engineering/docs/ko/index.md b/courses/learn-harness-engineering/docs/ko/index.md new file mode 100644 index 00000000..af6b0fd4 --- /dev/null +++ b/courses/learn-harness-engineering/docs/ko/index.md @@ -0,0 +1 @@ + diff --git a/docs/ko/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts b/courses/learn-harness-engineering/docs/ko/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts similarity index 100% rename from docs/ko/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts diff --git a/docs/ko/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md similarity index 100% rename from docs/ko/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md diff --git a/docs/ko/lectures/lecture-01-why-capable-agents-still-fail/code/index.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-01-why-capable-agents-still-fail/code/index.md similarity index 100% rename from docs/ko/lectures/lecture-01-why-capable-agents-still-fail/code/index.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-01-why-capable-agents-still-fail/code/index.md diff --git a/docs/ko/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md similarity index 100% rename from docs/ko/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md diff --git a/docs/ko/lectures/lecture-01-why-capable-agents-still-fail/index.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-01-why-capable-agents-still-fail/index.md similarity index 100% rename from docs/ko/lectures/lecture-01-why-capable-agents-still-fail/index.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-01-why-capable-agents-still-fail/index.md diff --git a/docs/ko/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md similarity index 100% rename from docs/ko/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md diff --git a/docs/ko/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts b/courses/learn-harness-engineering/docs/ko/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts similarity index 100% rename from docs/ko/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts diff --git a/docs/ko/lectures/lecture-02-what-a-harness-actually-is/code/index.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-02-what-a-harness-actually-is/code/index.md similarity index 100% rename from docs/ko/lectures/lecture-02-what-a-harness-actually-is/code/index.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-02-what-a-harness-actually-is/code/index.md diff --git a/docs/ko/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts b/courses/learn-harness-engineering/docs/ko/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts similarity index 100% rename from docs/ko/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts diff --git a/docs/ko/lectures/lecture-02-what-a-harness-actually-is/index.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-02-what-a-harness-actually-is/index.md similarity index 100% rename from docs/ko/lectures/lecture-02-what-a-harness-actually-is/index.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-02-what-a-harness-actually-is/index.md diff --git a/docs/ko/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md similarity index 100% rename from docs/ko/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md diff --git a/docs/ko/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt b/courses/learn-harness-engineering/docs/ko/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt similarity index 100% rename from docs/ko/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt diff --git a/docs/ko/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts b/courses/learn-harness-engineering/docs/ko/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts similarity index 100% rename from docs/ko/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts diff --git a/docs/ko/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md similarity index 100% rename from docs/ko/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md diff --git a/docs/ko/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md similarity index 100% rename from docs/ko/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md diff --git a/docs/ko/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md similarity index 100% rename from docs/ko/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md diff --git a/docs/ko/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md similarity index 100% rename from docs/ko/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md diff --git a/docs/ko/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md similarity index 100% rename from docs/ko/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md diff --git a/docs/ko/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts b/courses/learn-harness-engineering/docs/ko/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts similarity index 100% rename from docs/ko/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts diff --git a/docs/ko/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md similarity index 100% rename from docs/ko/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md diff --git a/docs/ko/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md similarity index 100% rename from docs/ko/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md diff --git a/docs/ko/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md similarity index 100% rename from docs/ko/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md diff --git a/docs/ko/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md similarity index 100% rename from docs/ko/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md diff --git a/docs/ko/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts b/courses/learn-harness-engineering/docs/ko/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts similarity index 100% rename from docs/ko/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts diff --git a/docs/ko/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md similarity index 100% rename from docs/ko/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md diff --git a/docs/ko/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md similarity index 100% rename from docs/ko/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md diff --git a/docs/ko/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts b/courses/learn-harness-engineering/docs/ko/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts similarity index 100% rename from docs/ko/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts diff --git a/docs/ko/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh b/courses/learn-harness-engineering/docs/ko/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh similarity index 100% rename from docs/ko/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh diff --git a/docs/ko/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md similarity index 100% rename from docs/ko/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md diff --git a/docs/ko/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md similarity index 100% rename from docs/ko/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md diff --git a/docs/ko/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md similarity index 100% rename from docs/ko/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md diff --git a/docs/ko/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md similarity index 100% rename from docs/ko/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md diff --git a/docs/ko/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md similarity index 100% rename from docs/ko/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md diff --git a/docs/ko/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts b/courses/learn-harness-engineering/docs/ko/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts similarity index 100% rename from docs/ko/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts diff --git a/docs/ko/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md similarity index 100% rename from docs/ko/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md diff --git a/docs/ko/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts b/courses/learn-harness-engineering/docs/ko/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts similarity index 100% rename from docs/ko/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts diff --git a/docs/ko/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json b/courses/learn-harness-engineering/docs/ko/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json similarity index 100% rename from docs/ko/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json diff --git a/docs/ko/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md similarity index 100% rename from docs/ko/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md diff --git a/docs/ko/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md similarity index 100% rename from docs/ko/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md diff --git a/docs/ko/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md similarity index 100% rename from docs/ko/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md diff --git a/docs/ko/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md similarity index 100% rename from docs/ko/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md diff --git a/docs/ko/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md similarity index 100% rename from docs/ko/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md diff --git a/docs/ko/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts b/courses/learn-harness-engineering/docs/ko/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts similarity index 100% rename from docs/ko/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts diff --git a/docs/ko/lectures/lecture-09-why-agents-declare-victory-too-early/index.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-09-why-agents-declare-victory-too-early/index.md similarity index 100% rename from docs/ko/lectures/lecture-09-why-agents-declare-victory-too-early/index.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-09-why-agents-declare-victory-too-early/index.md diff --git a/docs/ko/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md similarity index 100% rename from docs/ko/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md diff --git a/docs/ko/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts b/courses/learn-harness-engineering/docs/ko/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts similarity index 100% rename from docs/ko/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts diff --git a/docs/ko/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md similarity index 100% rename from docs/ko/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md diff --git a/docs/ko/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md similarity index 100% rename from docs/ko/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md diff --git a/docs/ko/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md similarity index 100% rename from docs/ko/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md diff --git a/docs/ko/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md similarity index 100% rename from docs/ko/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md diff --git a/docs/ko/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md similarity index 100% rename from docs/ko/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md diff --git a/docs/ko/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts b/courses/learn-harness-engineering/docs/ko/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts similarity index 100% rename from docs/ko/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts diff --git a/docs/ko/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md similarity index 100% rename from docs/ko/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md diff --git a/docs/ko/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md similarity index 100% rename from docs/ko/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md diff --git a/docs/ko/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md similarity index 100% rename from docs/ko/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md diff --git a/docs/ko/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts b/courses/learn-harness-engineering/docs/ko/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts similarity index 100% rename from docs/ko/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts diff --git a/docs/ko/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md similarity index 100% rename from docs/ko/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md diff --git a/docs/ko/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts b/courses/learn-harness-engineering/docs/ko/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts similarity index 100% rename from docs/ko/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts diff --git a/docs/ko/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md similarity index 100% rename from docs/ko/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md diff --git a/docs/ko/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md b/courses/learn-harness-engineering/docs/ko/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md similarity index 100% rename from docs/ko/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md rename to courses/learn-harness-engineering/docs/ko/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md diff --git a/docs/ko/projects/index.md b/courses/learn-harness-engineering/docs/ko/projects/index.md similarity index 100% rename from docs/ko/projects/index.md rename to courses/learn-harness-engineering/docs/ko/projects/index.md diff --git a/docs/ko/projects/project-01-baseline-vs-minimal-harness/index.md b/courses/learn-harness-engineering/docs/ko/projects/project-01-baseline-vs-minimal-harness/index.md similarity index 100% rename from docs/ko/projects/project-01-baseline-vs-minimal-harness/index.md rename to courses/learn-harness-engineering/docs/ko/projects/project-01-baseline-vs-minimal-harness/index.md diff --git a/docs/ko/projects/project-02-agent-readable-workspace/index.md b/courses/learn-harness-engineering/docs/ko/projects/project-02-agent-readable-workspace/index.md similarity index 100% rename from docs/ko/projects/project-02-agent-readable-workspace/index.md rename to courses/learn-harness-engineering/docs/ko/projects/project-02-agent-readable-workspace/index.md diff --git a/docs/ko/projects/project-03-multi-session-continuity/index.md b/courses/learn-harness-engineering/docs/ko/projects/project-03-multi-session-continuity/index.md similarity index 100% rename from docs/ko/projects/project-03-multi-session-continuity/index.md rename to courses/learn-harness-engineering/docs/ko/projects/project-03-multi-session-continuity/index.md diff --git a/docs/ko/projects/project-04-incremental-indexing/index.md b/courses/learn-harness-engineering/docs/ko/projects/project-04-incremental-indexing/index.md similarity index 100% rename from docs/ko/projects/project-04-incremental-indexing/index.md rename to courses/learn-harness-engineering/docs/ko/projects/project-04-incremental-indexing/index.md diff --git a/docs/ko/projects/project-05-grounded-qa-verification/index.md b/courses/learn-harness-engineering/docs/ko/projects/project-05-grounded-qa-verification/index.md similarity index 100% rename from docs/ko/projects/project-05-grounded-qa-verification/index.md rename to courses/learn-harness-engineering/docs/ko/projects/project-05-grounded-qa-verification/index.md diff --git a/docs/ko/projects/project-06-runtime-observability-and-debugging/index.md b/courses/learn-harness-engineering/docs/ko/projects/project-06-runtime-observability-and-debugging/index.md similarity index 100% rename from docs/ko/projects/project-06-runtime-observability-and-debugging/index.md rename to courses/learn-harness-engineering/docs/ko/projects/project-06-runtime-observability-and-debugging/index.md diff --git a/docs/ko/resources/index.md b/courses/learn-harness-engineering/docs/ko/resources/index.md similarity index 100% rename from docs/ko/resources/index.md rename to courses/learn-harness-engineering/docs/ko/resources/index.md diff --git a/docs/ko/resources/openai-advanced/index.md b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/index.md similarity index 100% rename from docs/ko/resources/openai-advanced/index.md rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/index.md diff --git a/docs/ko/resources/openai-advanced/repo-template/AGENTS.md b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/AGENTS.md similarity index 100% rename from docs/ko/resources/openai-advanced/repo-template/AGENTS.md rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/AGENTS.md diff --git a/docs/ko/resources/openai-advanced/repo-template/ARCHITECTURE.md b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/ARCHITECTURE.md similarity index 100% rename from docs/ko/resources/openai-advanced/repo-template/ARCHITECTURE.md rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/ARCHITECTURE.md diff --git a/docs/ko/resources/openai-advanced/repo-template/docs/DESIGN.md b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/DESIGN.md similarity index 100% rename from docs/ko/resources/openai-advanced/repo-template/docs/DESIGN.md rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/DESIGN.md diff --git a/docs/ko/resources/openai-advanced/repo-template/docs/FRONTEND.md b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/FRONTEND.md similarity index 100% rename from docs/ko/resources/openai-advanced/repo-template/docs/FRONTEND.md rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/FRONTEND.md diff --git a/docs/ko/resources/openai-advanced/repo-template/docs/PLANS.md b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/PLANS.md similarity index 100% rename from docs/ko/resources/openai-advanced/repo-template/docs/PLANS.md rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/PLANS.md diff --git a/docs/ko/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md similarity index 100% rename from docs/ko/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md diff --git a/docs/ko/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md similarity index 100% rename from docs/ko/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md diff --git a/docs/ko/resources/openai-advanced/repo-template/docs/RELIABILITY.md b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/RELIABILITY.md similarity index 100% rename from docs/ko/resources/openai-advanced/repo-template/docs/RELIABILITY.md rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/RELIABILITY.md diff --git a/docs/ko/resources/openai-advanced/repo-template/docs/SECURITY.md b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/SECURITY.md similarity index 100% rename from docs/ko/resources/openai-advanced/repo-template/docs/SECURITY.md rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/SECURITY.md diff --git a/docs/ko/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md similarity index 100% rename from docs/ko/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md diff --git a/docs/ko/resources/openai-advanced/repo-template/docs/design-docs/index.md b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/design-docs/index.md similarity index 100% rename from docs/ko/resources/openai-advanced/repo-template/docs/design-docs/index.md rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/design-docs/index.md diff --git a/docs/ko/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md similarity index 100% rename from docs/ko/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md diff --git a/docs/ko/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md similarity index 100% rename from docs/ko/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md diff --git a/docs/ko/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md similarity index 100% rename from docs/ko/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md diff --git a/docs/ko/resources/openai-advanced/repo-template/docs/generated/db-schema.md b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/generated/db-schema.md similarity index 100% rename from docs/ko/resources/openai-advanced/repo-template/docs/generated/db-schema.md rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/generated/db-schema.md diff --git a/docs/ko/resources/openai-advanced/repo-template/docs/product-specs/index.md b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/product-specs/index.md similarity index 100% rename from docs/ko/resources/openai-advanced/repo-template/docs/product-specs/index.md rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/product-specs/index.md diff --git a/docs/ko/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md similarity index 100% rename from docs/ko/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md diff --git a/docs/ko/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt similarity index 100% rename from docs/ko/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt diff --git a/docs/ko/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt similarity index 100% rename from docs/ko/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt diff --git a/docs/ko/resources/openai-advanced/repo-template/docs/references/uv-llms.txt b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/references/uv-llms.txt similarity index 100% rename from docs/ko/resources/openai-advanced/repo-template/docs/references/uv-llms.txt rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/docs/references/uv-llms.txt diff --git a/docs/ko/resources/openai-advanced/repo-template/index.md b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/index.md similarity index 100% rename from docs/ko/resources/openai-advanced/repo-template/index.md rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/repo-template/index.md diff --git a/docs/ko/resources/openai-advanced/sops/chrome-devtools-validation-loop.md b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/sops/chrome-devtools-validation-loop.md similarity index 100% rename from docs/ko/resources/openai-advanced/sops/chrome-devtools-validation-loop.md rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/sops/chrome-devtools-validation-loop.md diff --git a/docs/ko/resources/openai-advanced/sops/encode-knowledge-into-repo.md b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/sops/encode-knowledge-into-repo.md similarity index 100% rename from docs/ko/resources/openai-advanced/sops/encode-knowledge-into-repo.md rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/sops/encode-knowledge-into-repo.md diff --git a/docs/ko/resources/openai-advanced/sops/index.md b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/sops/index.md similarity index 100% rename from docs/ko/resources/openai-advanced/sops/index.md rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/sops/index.md diff --git a/docs/ko/resources/openai-advanced/sops/layered-domain-architecture.md b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/sops/layered-domain-architecture.md similarity index 100% rename from docs/ko/resources/openai-advanced/sops/layered-domain-architecture.md rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/sops/layered-domain-architecture.md diff --git a/docs/ko/resources/openai-advanced/sops/observability-feedback-loop.md b/courses/learn-harness-engineering/docs/ko/resources/openai-advanced/sops/observability-feedback-loop.md similarity index 100% rename from docs/ko/resources/openai-advanced/sops/observability-feedback-loop.md rename to courses/learn-harness-engineering/docs/ko/resources/openai-advanced/sops/observability-feedback-loop.md diff --git a/docs/ko/resources/reference/coding-agent-startup-flow.md b/courses/learn-harness-engineering/docs/ko/resources/reference/coding-agent-startup-flow.md similarity index 100% rename from docs/ko/resources/reference/coding-agent-startup-flow.md rename to courses/learn-harness-engineering/docs/ko/resources/reference/coding-agent-startup-flow.md diff --git a/docs/ko/resources/reference/glossary.md b/courses/learn-harness-engineering/docs/ko/resources/reference/glossary.md similarity index 100% rename from docs/ko/resources/reference/glossary.md rename to courses/learn-harness-engineering/docs/ko/resources/reference/glossary.md diff --git a/docs/ko/resources/reference/index.md b/courses/learn-harness-engineering/docs/ko/resources/reference/index.md similarity index 100% rename from docs/ko/resources/reference/index.md rename to courses/learn-harness-engineering/docs/ko/resources/reference/index.md diff --git a/docs/ko/resources/reference/initializer-agent-playbook.md b/courses/learn-harness-engineering/docs/ko/resources/reference/initializer-agent-playbook.md similarity index 100% rename from docs/ko/resources/reference/initializer-agent-playbook.md rename to courses/learn-harness-engineering/docs/ko/resources/reference/initializer-agent-playbook.md diff --git a/docs/ko/resources/reference/method-map.md b/courses/learn-harness-engineering/docs/ko/resources/reference/method-map.md similarity index 100% rename from docs/ko/resources/reference/method-map.md rename to courses/learn-harness-engineering/docs/ko/resources/reference/method-map.md diff --git a/docs/ko/resources/reference/prompt-calibration.md b/courses/learn-harness-engineering/docs/ko/resources/reference/prompt-calibration.md similarity index 100% rename from docs/ko/resources/reference/prompt-calibration.md rename to courses/learn-harness-engineering/docs/ko/resources/reference/prompt-calibration.md diff --git a/docs/ko/resources/templates/AGENTS.md b/courses/learn-harness-engineering/docs/ko/resources/templates/AGENTS.md similarity index 100% rename from docs/ko/resources/templates/AGENTS.md rename to courses/learn-harness-engineering/docs/ko/resources/templates/AGENTS.md diff --git a/docs/ko/resources/templates/CLAUDE.md b/courses/learn-harness-engineering/docs/ko/resources/templates/CLAUDE.md similarity index 100% rename from docs/ko/resources/templates/CLAUDE.md rename to courses/learn-harness-engineering/docs/ko/resources/templates/CLAUDE.md diff --git a/docs/ko/resources/templates/claude-progress.md b/courses/learn-harness-engineering/docs/ko/resources/templates/claude-progress.md similarity index 100% rename from docs/ko/resources/templates/claude-progress.md rename to courses/learn-harness-engineering/docs/ko/resources/templates/claude-progress.md diff --git a/docs/ko/resources/templates/clean-state-checklist.md b/courses/learn-harness-engineering/docs/ko/resources/templates/clean-state-checklist.md similarity index 100% rename from docs/ko/resources/templates/clean-state-checklist.md rename to courses/learn-harness-engineering/docs/ko/resources/templates/clean-state-checklist.md diff --git a/docs/ko/resources/templates/evaluator-rubric.md b/courses/learn-harness-engineering/docs/ko/resources/templates/evaluator-rubric.md similarity index 100% rename from docs/ko/resources/templates/evaluator-rubric.md rename to courses/learn-harness-engineering/docs/ko/resources/templates/evaluator-rubric.md diff --git a/docs/ko/resources/templates/feature_list.json b/courses/learn-harness-engineering/docs/ko/resources/templates/feature_list.json similarity index 100% rename from docs/ko/resources/templates/feature_list.json rename to courses/learn-harness-engineering/docs/ko/resources/templates/feature_list.json diff --git a/docs/ko/resources/templates/index.md b/courses/learn-harness-engineering/docs/ko/resources/templates/index.md similarity index 100% rename from docs/ko/resources/templates/index.md rename to courses/learn-harness-engineering/docs/ko/resources/templates/index.md diff --git a/docs/ko/resources/templates/init.sh b/courses/learn-harness-engineering/docs/ko/resources/templates/init.sh similarity index 100% rename from docs/ko/resources/templates/init.sh rename to courses/learn-harness-engineering/docs/ko/resources/templates/init.sh diff --git a/docs/ko/resources/templates/quality-document.md b/courses/learn-harness-engineering/docs/ko/resources/templates/quality-document.md similarity index 100% rename from docs/ko/resources/templates/quality-document.md rename to courses/learn-harness-engineering/docs/ko/resources/templates/quality-document.md diff --git a/docs/ko/resources/templates/session-handoff.md b/courses/learn-harness-engineering/docs/ko/resources/templates/session-handoff.md similarity index 100% rename from docs/ko/resources/templates/session-handoff.md rename to courses/learn-harness-engineering/docs/ko/resources/templates/session-handoff.md diff --git a/docs/ko/skills/index.md b/courses/learn-harness-engineering/docs/ko/skills/index.md similarity index 100% rename from docs/ko/skills/index.md rename to courses/learn-harness-engineering/docs/ko/skills/index.md diff --git a/docs/public/screenshots/readme/en-home.png b/courses/learn-harness-engineering/docs/public/screenshots/readme/en-home.png similarity index 100% rename from docs/public/screenshots/readme/en-home.png rename to courses/learn-harness-engineering/docs/public/screenshots/readme/en-home.png diff --git a/docs/public/screenshots/readme/en-lecture-01.png b/courses/learn-harness-engineering/docs/public/screenshots/readme/en-lecture-01.png similarity index 100% rename from docs/public/screenshots/readme/en-lecture-01.png rename to courses/learn-harness-engineering/docs/public/screenshots/readme/en-lecture-01.png diff --git a/docs/public/screenshots/readme/en-resources.png b/courses/learn-harness-engineering/docs/public/screenshots/readme/en-resources.png similarity index 100% rename from docs/public/screenshots/readme/en-resources.png rename to courses/learn-harness-engineering/docs/public/screenshots/readme/en-resources.png diff --git a/docs/public/screenshots/readme/zh-home.png b/courses/learn-harness-engineering/docs/public/screenshots/readme/zh-home.png similarity index 100% rename from docs/public/screenshots/readme/zh-home.png rename to courses/learn-harness-engineering/docs/public/screenshots/readme/zh-home.png diff --git a/docs/public/screenshots/readme/zh-lecture-01.png b/courses/learn-harness-engineering/docs/public/screenshots/readme/zh-lecture-01.png similarity index 100% rename from docs/public/screenshots/readme/zh-lecture-01.png rename to courses/learn-harness-engineering/docs/public/screenshots/readme/zh-lecture-01.png diff --git a/docs/public/screenshots/readme/zh-resources.png b/courses/learn-harness-engineering/docs/public/screenshots/readme/zh-resources.png similarity index 100% rename from docs/public/screenshots/readme/zh-resources.png rename to courses/learn-harness-engineering/docs/public/screenshots/readme/zh-resources.png diff --git a/docs/ru/index.md b/courses/learn-harness-engineering/docs/ru/index.md similarity index 100% rename from docs/ru/index.md rename to courses/learn-harness-engineering/docs/ru/index.md diff --git a/docs/ru/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts b/courses/learn-harness-engineering/docs/ru/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts similarity index 100% rename from docs/ru/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts diff --git a/docs/ru/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md similarity index 100% rename from docs/ru/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md diff --git a/docs/ru/lectures/lecture-01-why-capable-agents-still-fail/code/index.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-01-why-capable-agents-still-fail/code/index.md similarity index 100% rename from docs/ru/lectures/lecture-01-why-capable-agents-still-fail/code/index.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-01-why-capable-agents-still-fail/code/index.md diff --git a/docs/ru/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md similarity index 100% rename from docs/ru/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md diff --git a/docs/ru/lectures/lecture-01-why-capable-agents-still-fail/index.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-01-why-capable-agents-still-fail/index.md similarity index 100% rename from docs/ru/lectures/lecture-01-why-capable-agents-still-fail/index.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-01-why-capable-agents-still-fail/index.md diff --git a/docs/ru/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md similarity index 100% rename from docs/ru/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md diff --git a/docs/ru/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts b/courses/learn-harness-engineering/docs/ru/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts similarity index 100% rename from docs/ru/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts diff --git a/docs/ru/lectures/lecture-02-what-a-harness-actually-is/code/index.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-02-what-a-harness-actually-is/code/index.md similarity index 100% rename from docs/ru/lectures/lecture-02-what-a-harness-actually-is/code/index.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-02-what-a-harness-actually-is/code/index.md diff --git a/docs/ru/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts b/courses/learn-harness-engineering/docs/ru/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts similarity index 100% rename from docs/ru/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts diff --git a/docs/ru/lectures/lecture-02-what-a-harness-actually-is/index.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-02-what-a-harness-actually-is/index.md similarity index 100% rename from docs/ru/lectures/lecture-02-what-a-harness-actually-is/index.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-02-what-a-harness-actually-is/index.md diff --git a/docs/ru/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md similarity index 100% rename from docs/ru/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md diff --git a/docs/ru/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt b/courses/learn-harness-engineering/docs/ru/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt similarity index 100% rename from docs/ru/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt diff --git a/docs/ru/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts b/courses/learn-harness-engineering/docs/ru/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts similarity index 100% rename from docs/ru/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts diff --git a/docs/ru/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md similarity index 100% rename from docs/ru/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md diff --git a/docs/ru/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md similarity index 100% rename from docs/ru/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md diff --git a/docs/ru/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md similarity index 100% rename from docs/ru/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md diff --git a/docs/ru/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md similarity index 100% rename from docs/ru/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md diff --git a/docs/ru/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md similarity index 100% rename from docs/ru/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md diff --git a/docs/ru/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts b/courses/learn-harness-engineering/docs/ru/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts similarity index 100% rename from docs/ru/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts diff --git a/docs/ru/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md similarity index 100% rename from docs/ru/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md diff --git a/docs/ru/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md similarity index 100% rename from docs/ru/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md diff --git a/docs/ru/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md similarity index 100% rename from docs/ru/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md diff --git a/docs/ru/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md similarity index 100% rename from docs/ru/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md diff --git a/docs/ru/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts b/courses/learn-harness-engineering/docs/ru/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts similarity index 100% rename from docs/ru/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts diff --git a/docs/ru/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md similarity index 100% rename from docs/ru/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md diff --git a/docs/ru/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md similarity index 100% rename from docs/ru/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md diff --git a/docs/ru/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts b/courses/learn-harness-engineering/docs/ru/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts similarity index 100% rename from docs/ru/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts diff --git a/docs/ru/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh b/courses/learn-harness-engineering/docs/ru/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh similarity index 100% rename from docs/ru/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh diff --git a/docs/ru/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md similarity index 100% rename from docs/ru/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md diff --git a/docs/ru/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md similarity index 100% rename from docs/ru/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md diff --git a/docs/ru/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md similarity index 100% rename from docs/ru/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md diff --git a/docs/ru/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md similarity index 100% rename from docs/ru/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md diff --git a/docs/ru/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md similarity index 100% rename from docs/ru/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md diff --git a/docs/ru/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts b/courses/learn-harness-engineering/docs/ru/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts similarity index 100% rename from docs/ru/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts diff --git a/docs/ru/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md similarity index 100% rename from docs/ru/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md diff --git a/docs/ru/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts b/courses/learn-harness-engineering/docs/ru/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts similarity index 100% rename from docs/ru/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts diff --git a/docs/ru/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json b/courses/learn-harness-engineering/docs/ru/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json similarity index 100% rename from docs/ru/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json diff --git a/docs/ru/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md similarity index 100% rename from docs/ru/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md diff --git a/docs/ru/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md similarity index 100% rename from docs/ru/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md diff --git a/docs/ru/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md similarity index 100% rename from docs/ru/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md diff --git a/docs/ru/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md similarity index 100% rename from docs/ru/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md diff --git a/docs/ru/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md similarity index 100% rename from docs/ru/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md diff --git a/docs/ru/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts b/courses/learn-harness-engineering/docs/ru/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts similarity index 100% rename from docs/ru/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts diff --git a/docs/ru/lectures/lecture-09-why-agents-declare-victory-too-early/index.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-09-why-agents-declare-victory-too-early/index.md similarity index 100% rename from docs/ru/lectures/lecture-09-why-agents-declare-victory-too-early/index.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-09-why-agents-declare-victory-too-early/index.md diff --git a/docs/ru/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md similarity index 100% rename from docs/ru/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md diff --git a/docs/ru/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts b/courses/learn-harness-engineering/docs/ru/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts similarity index 100% rename from docs/ru/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts diff --git a/docs/ru/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md similarity index 100% rename from docs/ru/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md diff --git a/docs/ru/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md similarity index 100% rename from docs/ru/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md diff --git a/docs/ru/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md similarity index 100% rename from docs/ru/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md diff --git a/docs/ru/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md similarity index 100% rename from docs/ru/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md diff --git a/docs/ru/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md similarity index 100% rename from docs/ru/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md diff --git a/docs/ru/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts b/courses/learn-harness-engineering/docs/ru/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts similarity index 100% rename from docs/ru/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts diff --git a/docs/ru/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md similarity index 100% rename from docs/ru/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md diff --git a/docs/ru/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md similarity index 100% rename from docs/ru/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md diff --git a/docs/ru/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md similarity index 100% rename from docs/ru/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md diff --git a/docs/ru/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts b/courses/learn-harness-engineering/docs/ru/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts similarity index 100% rename from docs/ru/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts diff --git a/docs/ru/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md similarity index 100% rename from docs/ru/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md diff --git a/docs/ru/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts b/courses/learn-harness-engineering/docs/ru/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts similarity index 100% rename from docs/ru/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts diff --git a/docs/ru/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md similarity index 100% rename from docs/ru/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md diff --git a/docs/ru/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md b/courses/learn-harness-engineering/docs/ru/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md similarity index 100% rename from docs/ru/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md rename to courses/learn-harness-engineering/docs/ru/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md diff --git a/docs/ru/projects/index.md b/courses/learn-harness-engineering/docs/ru/projects/index.md similarity index 100% rename from docs/ru/projects/index.md rename to courses/learn-harness-engineering/docs/ru/projects/index.md diff --git a/docs/ru/projects/project-01-baseline-vs-minimal-harness/index.md b/courses/learn-harness-engineering/docs/ru/projects/project-01-baseline-vs-minimal-harness/index.md similarity index 100% rename from docs/ru/projects/project-01-baseline-vs-minimal-harness/index.md rename to courses/learn-harness-engineering/docs/ru/projects/project-01-baseline-vs-minimal-harness/index.md diff --git a/docs/ru/projects/project-02-agent-readable-workspace/index.md b/courses/learn-harness-engineering/docs/ru/projects/project-02-agent-readable-workspace/index.md similarity index 100% rename from docs/ru/projects/project-02-agent-readable-workspace/index.md rename to courses/learn-harness-engineering/docs/ru/projects/project-02-agent-readable-workspace/index.md diff --git a/docs/ru/projects/project-03-multi-session-continuity/index.md b/courses/learn-harness-engineering/docs/ru/projects/project-03-multi-session-continuity/index.md similarity index 100% rename from docs/ru/projects/project-03-multi-session-continuity/index.md rename to courses/learn-harness-engineering/docs/ru/projects/project-03-multi-session-continuity/index.md diff --git a/docs/ru/projects/project-04-incremental-indexing/index.md b/courses/learn-harness-engineering/docs/ru/projects/project-04-incremental-indexing/index.md similarity index 100% rename from docs/ru/projects/project-04-incremental-indexing/index.md rename to courses/learn-harness-engineering/docs/ru/projects/project-04-incremental-indexing/index.md diff --git a/docs/ru/projects/project-05-grounded-qa-verification/index.md b/courses/learn-harness-engineering/docs/ru/projects/project-05-grounded-qa-verification/index.md similarity index 100% rename from docs/ru/projects/project-05-grounded-qa-verification/index.md rename to courses/learn-harness-engineering/docs/ru/projects/project-05-grounded-qa-verification/index.md diff --git a/docs/ru/projects/project-06-runtime-observability-and-debugging/index.md b/courses/learn-harness-engineering/docs/ru/projects/project-06-runtime-observability-and-debugging/index.md similarity index 100% rename from docs/ru/projects/project-06-runtime-observability-and-debugging/index.md rename to courses/learn-harness-engineering/docs/ru/projects/project-06-runtime-observability-and-debugging/index.md diff --git a/docs/ru/resources/index.md b/courses/learn-harness-engineering/docs/ru/resources/index.md similarity index 100% rename from docs/ru/resources/index.md rename to courses/learn-harness-engineering/docs/ru/resources/index.md diff --git a/docs/ru/resources/openai-advanced/index.md b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/index.md similarity index 100% rename from docs/ru/resources/openai-advanced/index.md rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/index.md diff --git a/docs/ru/resources/openai-advanced/repo-template/AGENTS.md b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/AGENTS.md similarity index 100% rename from docs/ru/resources/openai-advanced/repo-template/AGENTS.md rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/AGENTS.md diff --git a/docs/ru/resources/openai-advanced/repo-template/ARCHITECTURE.md b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/ARCHITECTURE.md similarity index 100% rename from docs/ru/resources/openai-advanced/repo-template/ARCHITECTURE.md rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/ARCHITECTURE.md diff --git a/docs/ru/resources/openai-advanced/repo-template/docs/DESIGN.md b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/DESIGN.md similarity index 100% rename from docs/ru/resources/openai-advanced/repo-template/docs/DESIGN.md rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/DESIGN.md diff --git a/docs/ru/resources/openai-advanced/repo-template/docs/FRONTEND.md b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/FRONTEND.md similarity index 100% rename from docs/ru/resources/openai-advanced/repo-template/docs/FRONTEND.md rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/FRONTEND.md diff --git a/docs/ru/resources/openai-advanced/repo-template/docs/PLANS.md b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/PLANS.md similarity index 100% rename from docs/ru/resources/openai-advanced/repo-template/docs/PLANS.md rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/PLANS.md diff --git a/docs/ru/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md similarity index 100% rename from docs/ru/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md diff --git a/docs/ru/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md similarity index 100% rename from docs/ru/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md diff --git a/docs/ru/resources/openai-advanced/repo-template/docs/RELIABILITY.md b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/RELIABILITY.md similarity index 100% rename from docs/ru/resources/openai-advanced/repo-template/docs/RELIABILITY.md rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/RELIABILITY.md diff --git a/docs/ru/resources/openai-advanced/repo-template/docs/SECURITY.md b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/SECURITY.md similarity index 100% rename from docs/ru/resources/openai-advanced/repo-template/docs/SECURITY.md rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/SECURITY.md diff --git a/docs/ru/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md similarity index 100% rename from docs/ru/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md diff --git a/docs/ru/resources/openai-advanced/repo-template/docs/design-docs/index.md b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/design-docs/index.md similarity index 100% rename from docs/ru/resources/openai-advanced/repo-template/docs/design-docs/index.md rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/design-docs/index.md diff --git a/docs/ru/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md similarity index 100% rename from docs/ru/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md diff --git a/docs/ru/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md similarity index 100% rename from docs/ru/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md diff --git a/docs/ru/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md similarity index 100% rename from docs/ru/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md diff --git a/docs/ru/resources/openai-advanced/repo-template/docs/generated/db-schema.md b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/generated/db-schema.md similarity index 100% rename from docs/ru/resources/openai-advanced/repo-template/docs/generated/db-schema.md rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/generated/db-schema.md diff --git a/docs/ru/resources/openai-advanced/repo-template/docs/product-specs/index.md b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/product-specs/index.md similarity index 100% rename from docs/ru/resources/openai-advanced/repo-template/docs/product-specs/index.md rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/product-specs/index.md diff --git a/docs/ru/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md similarity index 100% rename from docs/ru/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md diff --git a/docs/ru/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt similarity index 100% rename from docs/ru/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt diff --git a/docs/ru/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt similarity index 100% rename from docs/ru/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt diff --git a/docs/ru/resources/openai-advanced/repo-template/docs/references/uv-llms.txt b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/references/uv-llms.txt similarity index 100% rename from docs/ru/resources/openai-advanced/repo-template/docs/references/uv-llms.txt rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/docs/references/uv-llms.txt diff --git a/docs/ru/resources/openai-advanced/repo-template/index.md b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/index.md similarity index 100% rename from docs/ru/resources/openai-advanced/repo-template/index.md rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/repo-template/index.md diff --git a/docs/ru/resources/openai-advanced/sops/chrome-devtools-validation-loop.md b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/sops/chrome-devtools-validation-loop.md similarity index 100% rename from docs/ru/resources/openai-advanced/sops/chrome-devtools-validation-loop.md rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/sops/chrome-devtools-validation-loop.md diff --git a/docs/ru/resources/openai-advanced/sops/encode-knowledge-into-repo.md b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/sops/encode-knowledge-into-repo.md similarity index 100% rename from docs/ru/resources/openai-advanced/sops/encode-knowledge-into-repo.md rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/sops/encode-knowledge-into-repo.md diff --git a/docs/ru/resources/openai-advanced/sops/index.md b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/sops/index.md similarity index 100% rename from docs/ru/resources/openai-advanced/sops/index.md rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/sops/index.md diff --git a/docs/ru/resources/openai-advanced/sops/layered-domain-architecture.md b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/sops/layered-domain-architecture.md similarity index 100% rename from docs/ru/resources/openai-advanced/sops/layered-domain-architecture.md rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/sops/layered-domain-architecture.md diff --git a/docs/ru/resources/openai-advanced/sops/observability-feedback-loop.md b/courses/learn-harness-engineering/docs/ru/resources/openai-advanced/sops/observability-feedback-loop.md similarity index 100% rename from docs/ru/resources/openai-advanced/sops/observability-feedback-loop.md rename to courses/learn-harness-engineering/docs/ru/resources/openai-advanced/sops/observability-feedback-loop.md diff --git a/docs/ru/resources/reference/coding-agent-startup-flow.md b/courses/learn-harness-engineering/docs/ru/resources/reference/coding-agent-startup-flow.md similarity index 100% rename from docs/ru/resources/reference/coding-agent-startup-flow.md rename to courses/learn-harness-engineering/docs/ru/resources/reference/coding-agent-startup-flow.md diff --git a/docs/ru/resources/reference/index.md b/courses/learn-harness-engineering/docs/ru/resources/reference/index.md similarity index 100% rename from docs/ru/resources/reference/index.md rename to courses/learn-harness-engineering/docs/ru/resources/reference/index.md diff --git a/docs/ru/resources/reference/initializer-agent-playbook.md b/courses/learn-harness-engineering/docs/ru/resources/reference/initializer-agent-playbook.md similarity index 100% rename from docs/ru/resources/reference/initializer-agent-playbook.md rename to courses/learn-harness-engineering/docs/ru/resources/reference/initializer-agent-playbook.md diff --git a/docs/ru/resources/reference/method-map.md b/courses/learn-harness-engineering/docs/ru/resources/reference/method-map.md similarity index 100% rename from docs/ru/resources/reference/method-map.md rename to courses/learn-harness-engineering/docs/ru/resources/reference/method-map.md diff --git a/docs/ru/resources/reference/prompt-calibration.md b/courses/learn-harness-engineering/docs/ru/resources/reference/prompt-calibration.md similarity index 100% rename from docs/ru/resources/reference/prompt-calibration.md rename to courses/learn-harness-engineering/docs/ru/resources/reference/prompt-calibration.md diff --git a/docs/ru/resources/templates/AGENTS.md b/courses/learn-harness-engineering/docs/ru/resources/templates/AGENTS.md similarity index 100% rename from docs/ru/resources/templates/AGENTS.md rename to courses/learn-harness-engineering/docs/ru/resources/templates/AGENTS.md diff --git a/docs/ru/resources/templates/CLAUDE.md b/courses/learn-harness-engineering/docs/ru/resources/templates/CLAUDE.md similarity index 100% rename from docs/ru/resources/templates/CLAUDE.md rename to courses/learn-harness-engineering/docs/ru/resources/templates/CLAUDE.md diff --git a/docs/ru/resources/templates/claude-progress.md b/courses/learn-harness-engineering/docs/ru/resources/templates/claude-progress.md similarity index 100% rename from docs/ru/resources/templates/claude-progress.md rename to courses/learn-harness-engineering/docs/ru/resources/templates/claude-progress.md diff --git a/docs/ru/resources/templates/clean-state-checklist.md b/courses/learn-harness-engineering/docs/ru/resources/templates/clean-state-checklist.md similarity index 100% rename from docs/ru/resources/templates/clean-state-checklist.md rename to courses/learn-harness-engineering/docs/ru/resources/templates/clean-state-checklist.md diff --git a/docs/ru/resources/templates/evaluator-rubric.md b/courses/learn-harness-engineering/docs/ru/resources/templates/evaluator-rubric.md similarity index 100% rename from docs/ru/resources/templates/evaluator-rubric.md rename to courses/learn-harness-engineering/docs/ru/resources/templates/evaluator-rubric.md diff --git a/docs/ru/resources/templates/feature_list.json b/courses/learn-harness-engineering/docs/ru/resources/templates/feature_list.json similarity index 100% rename from docs/ru/resources/templates/feature_list.json rename to courses/learn-harness-engineering/docs/ru/resources/templates/feature_list.json diff --git a/docs/ru/resources/templates/index.md b/courses/learn-harness-engineering/docs/ru/resources/templates/index.md similarity index 100% rename from docs/ru/resources/templates/index.md rename to courses/learn-harness-engineering/docs/ru/resources/templates/index.md diff --git a/docs/ru/resources/templates/init.sh b/courses/learn-harness-engineering/docs/ru/resources/templates/init.sh similarity index 100% rename from docs/ru/resources/templates/init.sh rename to courses/learn-harness-engineering/docs/ru/resources/templates/init.sh diff --git a/docs/ru/resources/templates/quality-document.md b/courses/learn-harness-engineering/docs/ru/resources/templates/quality-document.md similarity index 100% rename from docs/ru/resources/templates/quality-document.md rename to courses/learn-harness-engineering/docs/ru/resources/templates/quality-document.md diff --git a/docs/ru/resources/templates/session-handoff.md b/courses/learn-harness-engineering/docs/ru/resources/templates/session-handoff.md similarity index 100% rename from docs/ru/resources/templates/session-handoff.md rename to courses/learn-harness-engineering/docs/ru/resources/templates/session-handoff.md diff --git a/docs/ru/skills/index.md b/courses/learn-harness-engineering/docs/ru/skills/index.md similarity index 100% rename from docs/ru/skills/index.md rename to courses/learn-harness-engineering/docs/ru/skills/index.md diff --git a/docs/uz/GLOSSARY.md b/courses/learn-harness-engineering/docs/uz/GLOSSARY.md similarity index 100% rename from docs/uz/GLOSSARY.md rename to courses/learn-harness-engineering/docs/uz/GLOSSARY.md diff --git a/docs/uz/STYLE-GUIDE.md b/courses/learn-harness-engineering/docs/uz/STYLE-GUIDE.md similarity index 100% rename from docs/uz/STYLE-GUIDE.md rename to courses/learn-harness-engineering/docs/uz/STYLE-GUIDE.md diff --git a/docs/uz/index.md b/courses/learn-harness-engineering/docs/uz/index.md similarity index 100% rename from docs/uz/index.md rename to courses/learn-harness-engineering/docs/uz/index.md diff --git a/docs/uz/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts b/courses/learn-harness-engineering/docs/uz/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts similarity index 100% rename from docs/uz/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts diff --git a/docs/uz/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md similarity index 100% rename from docs/uz/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md diff --git a/docs/uz/lectures/lecture-01-why-capable-agents-still-fail/code/index.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-01-why-capable-agents-still-fail/code/index.md similarity index 100% rename from docs/uz/lectures/lecture-01-why-capable-agents-still-fail/code/index.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-01-why-capable-agents-still-fail/code/index.md diff --git a/docs/uz/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md similarity index 100% rename from docs/uz/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md diff --git a/docs/uz/lectures/lecture-01-why-capable-agents-still-fail/index.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-01-why-capable-agents-still-fail/index.md similarity index 100% rename from docs/uz/lectures/lecture-01-why-capable-agents-still-fail/index.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-01-why-capable-agents-still-fail/index.md diff --git a/docs/uz/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md similarity index 100% rename from docs/uz/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md diff --git a/docs/uz/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts b/courses/learn-harness-engineering/docs/uz/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts similarity index 100% rename from docs/uz/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts diff --git a/docs/uz/lectures/lecture-02-what-a-harness-actually-is/code/index.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-02-what-a-harness-actually-is/code/index.md similarity index 100% rename from docs/uz/lectures/lecture-02-what-a-harness-actually-is/code/index.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-02-what-a-harness-actually-is/code/index.md diff --git a/docs/uz/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts b/courses/learn-harness-engineering/docs/uz/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts similarity index 100% rename from docs/uz/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts diff --git a/docs/uz/lectures/lecture-02-what-a-harness-actually-is/index.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-02-what-a-harness-actually-is/index.md similarity index 100% rename from docs/uz/lectures/lecture-02-what-a-harness-actually-is/index.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-02-what-a-harness-actually-is/index.md diff --git a/docs/uz/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md similarity index 100% rename from docs/uz/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md diff --git a/docs/uz/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt b/courses/learn-harness-engineering/docs/uz/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt similarity index 100% rename from docs/uz/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt diff --git a/docs/uz/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts b/courses/learn-harness-engineering/docs/uz/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts similarity index 100% rename from docs/uz/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts diff --git a/docs/uz/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md similarity index 100% rename from docs/uz/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md diff --git a/docs/uz/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md similarity index 100% rename from docs/uz/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md diff --git a/docs/uz/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md similarity index 100% rename from docs/uz/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md diff --git a/docs/uz/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md similarity index 100% rename from docs/uz/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md diff --git a/docs/uz/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md similarity index 100% rename from docs/uz/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md diff --git a/docs/uz/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts b/courses/learn-harness-engineering/docs/uz/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts similarity index 100% rename from docs/uz/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts diff --git a/docs/uz/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md similarity index 100% rename from docs/uz/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md diff --git a/docs/uz/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md similarity index 100% rename from docs/uz/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md diff --git a/docs/uz/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md similarity index 100% rename from docs/uz/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md diff --git a/docs/uz/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md similarity index 100% rename from docs/uz/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md diff --git a/docs/uz/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts b/courses/learn-harness-engineering/docs/uz/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts similarity index 100% rename from docs/uz/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts diff --git a/docs/uz/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md similarity index 100% rename from docs/uz/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md diff --git a/docs/uz/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md similarity index 100% rename from docs/uz/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md diff --git a/docs/uz/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts b/courses/learn-harness-engineering/docs/uz/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts similarity index 100% rename from docs/uz/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts diff --git a/docs/uz/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh b/courses/learn-harness-engineering/docs/uz/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh similarity index 100% rename from docs/uz/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh diff --git a/docs/uz/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md similarity index 100% rename from docs/uz/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md diff --git a/docs/uz/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md similarity index 100% rename from docs/uz/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md diff --git a/docs/uz/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md similarity index 100% rename from docs/uz/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md diff --git a/docs/uz/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md similarity index 100% rename from docs/uz/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md diff --git a/docs/uz/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md similarity index 100% rename from docs/uz/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md diff --git a/docs/uz/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts b/courses/learn-harness-engineering/docs/uz/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts similarity index 100% rename from docs/uz/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts diff --git a/docs/uz/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md similarity index 100% rename from docs/uz/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md diff --git a/docs/uz/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts b/courses/learn-harness-engineering/docs/uz/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts similarity index 100% rename from docs/uz/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts diff --git a/docs/uz/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json b/courses/learn-harness-engineering/docs/uz/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json similarity index 100% rename from docs/uz/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json diff --git a/docs/uz/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md similarity index 100% rename from docs/uz/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md diff --git a/docs/uz/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md similarity index 100% rename from docs/uz/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md diff --git a/docs/uz/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md similarity index 100% rename from docs/uz/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md diff --git a/docs/uz/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md similarity index 100% rename from docs/uz/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md diff --git a/docs/uz/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md similarity index 100% rename from docs/uz/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md diff --git a/docs/uz/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts b/courses/learn-harness-engineering/docs/uz/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts similarity index 100% rename from docs/uz/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts diff --git a/docs/uz/lectures/lecture-09-why-agents-declare-victory-too-early/index.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-09-why-agents-declare-victory-too-early/index.md similarity index 100% rename from docs/uz/lectures/lecture-09-why-agents-declare-victory-too-early/index.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-09-why-agents-declare-victory-too-early/index.md diff --git a/docs/uz/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md similarity index 100% rename from docs/uz/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md diff --git a/docs/uz/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts b/courses/learn-harness-engineering/docs/uz/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts similarity index 100% rename from docs/uz/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts diff --git a/docs/uz/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md similarity index 100% rename from docs/uz/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md diff --git a/docs/uz/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md similarity index 100% rename from docs/uz/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md diff --git a/docs/uz/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md similarity index 100% rename from docs/uz/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md diff --git a/docs/uz/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md similarity index 100% rename from docs/uz/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md diff --git a/docs/uz/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md similarity index 100% rename from docs/uz/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md diff --git a/docs/uz/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts b/courses/learn-harness-engineering/docs/uz/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts similarity index 100% rename from docs/uz/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts diff --git a/docs/uz/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md similarity index 100% rename from docs/uz/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md diff --git a/docs/uz/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md similarity index 100% rename from docs/uz/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md diff --git a/docs/uz/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md similarity index 100% rename from docs/uz/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md diff --git a/docs/uz/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts b/courses/learn-harness-engineering/docs/uz/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts similarity index 100% rename from docs/uz/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts diff --git a/docs/uz/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md similarity index 100% rename from docs/uz/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md diff --git a/docs/uz/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts b/courses/learn-harness-engineering/docs/uz/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts similarity index 100% rename from docs/uz/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts diff --git a/docs/uz/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md similarity index 100% rename from docs/uz/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md diff --git a/docs/uz/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md b/courses/learn-harness-engineering/docs/uz/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md similarity index 100% rename from docs/uz/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md rename to courses/learn-harness-engineering/docs/uz/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md diff --git a/docs/uz/projects/index.md b/courses/learn-harness-engineering/docs/uz/projects/index.md similarity index 100% rename from docs/uz/projects/index.md rename to courses/learn-harness-engineering/docs/uz/projects/index.md diff --git a/docs/uz/projects/project-01-baseline-vs-minimal-harness/index.md b/courses/learn-harness-engineering/docs/uz/projects/project-01-baseline-vs-minimal-harness/index.md similarity index 100% rename from docs/uz/projects/project-01-baseline-vs-minimal-harness/index.md rename to courses/learn-harness-engineering/docs/uz/projects/project-01-baseline-vs-minimal-harness/index.md diff --git a/docs/uz/projects/project-02-agent-readable-workspace/index.md b/courses/learn-harness-engineering/docs/uz/projects/project-02-agent-readable-workspace/index.md similarity index 100% rename from docs/uz/projects/project-02-agent-readable-workspace/index.md rename to courses/learn-harness-engineering/docs/uz/projects/project-02-agent-readable-workspace/index.md diff --git a/docs/uz/projects/project-03-multi-session-continuity/index.md b/courses/learn-harness-engineering/docs/uz/projects/project-03-multi-session-continuity/index.md similarity index 100% rename from docs/uz/projects/project-03-multi-session-continuity/index.md rename to courses/learn-harness-engineering/docs/uz/projects/project-03-multi-session-continuity/index.md diff --git a/docs/uz/projects/project-04-incremental-indexing/index.md b/courses/learn-harness-engineering/docs/uz/projects/project-04-incremental-indexing/index.md similarity index 100% rename from docs/uz/projects/project-04-incremental-indexing/index.md rename to courses/learn-harness-engineering/docs/uz/projects/project-04-incremental-indexing/index.md diff --git a/docs/uz/projects/project-05-grounded-qa-verification/index.md b/courses/learn-harness-engineering/docs/uz/projects/project-05-grounded-qa-verification/index.md similarity index 100% rename from docs/uz/projects/project-05-grounded-qa-verification/index.md rename to courses/learn-harness-engineering/docs/uz/projects/project-05-grounded-qa-verification/index.md diff --git a/docs/uz/projects/project-06-runtime-observability-and-debugging/index.md b/courses/learn-harness-engineering/docs/uz/projects/project-06-runtime-observability-and-debugging/index.md similarity index 100% rename from docs/uz/projects/project-06-runtime-observability-and-debugging/index.md rename to courses/learn-harness-engineering/docs/uz/projects/project-06-runtime-observability-and-debugging/index.md diff --git a/docs/uz/resources/index.md b/courses/learn-harness-engineering/docs/uz/resources/index.md similarity index 100% rename from docs/uz/resources/index.md rename to courses/learn-harness-engineering/docs/uz/resources/index.md diff --git a/docs/uz/resources/openai-advanced/index.md b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/index.md similarity index 100% rename from docs/uz/resources/openai-advanced/index.md rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/index.md diff --git a/docs/uz/resources/openai-advanced/repo-template/AGENTS.md b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/AGENTS.md similarity index 100% rename from docs/uz/resources/openai-advanced/repo-template/AGENTS.md rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/AGENTS.md diff --git a/docs/uz/resources/openai-advanced/repo-template/ARCHITECTURE.md b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/ARCHITECTURE.md similarity index 100% rename from docs/uz/resources/openai-advanced/repo-template/ARCHITECTURE.md rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/ARCHITECTURE.md diff --git a/docs/uz/resources/openai-advanced/repo-template/docs/DESIGN.md b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/DESIGN.md similarity index 100% rename from docs/uz/resources/openai-advanced/repo-template/docs/DESIGN.md rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/DESIGN.md diff --git a/docs/uz/resources/openai-advanced/repo-template/docs/FRONTEND.md b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/FRONTEND.md similarity index 100% rename from docs/uz/resources/openai-advanced/repo-template/docs/FRONTEND.md rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/FRONTEND.md diff --git a/docs/uz/resources/openai-advanced/repo-template/docs/PLANS.md b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/PLANS.md similarity index 100% rename from docs/uz/resources/openai-advanced/repo-template/docs/PLANS.md rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/PLANS.md diff --git a/docs/uz/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md similarity index 100% rename from docs/uz/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md diff --git a/docs/uz/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md similarity index 100% rename from docs/uz/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md diff --git a/docs/uz/resources/openai-advanced/repo-template/docs/RELIABILITY.md b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/RELIABILITY.md similarity index 100% rename from docs/uz/resources/openai-advanced/repo-template/docs/RELIABILITY.md rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/RELIABILITY.md diff --git a/docs/uz/resources/openai-advanced/repo-template/docs/SECURITY.md b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/SECURITY.md similarity index 100% rename from docs/uz/resources/openai-advanced/repo-template/docs/SECURITY.md rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/SECURITY.md diff --git a/docs/uz/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md similarity index 100% rename from docs/uz/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md diff --git a/docs/uz/resources/openai-advanced/repo-template/docs/design-docs/index.md b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/design-docs/index.md similarity index 100% rename from docs/uz/resources/openai-advanced/repo-template/docs/design-docs/index.md rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/design-docs/index.md diff --git a/docs/uz/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md similarity index 100% rename from docs/uz/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md diff --git a/docs/uz/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md similarity index 100% rename from docs/uz/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md diff --git a/docs/uz/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md similarity index 100% rename from docs/uz/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md diff --git a/docs/uz/resources/openai-advanced/repo-template/docs/generated/db-schema.md b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/generated/db-schema.md similarity index 100% rename from docs/uz/resources/openai-advanced/repo-template/docs/generated/db-schema.md rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/generated/db-schema.md diff --git a/docs/uz/resources/openai-advanced/repo-template/docs/product-specs/index.md b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/product-specs/index.md similarity index 100% rename from docs/uz/resources/openai-advanced/repo-template/docs/product-specs/index.md rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/product-specs/index.md diff --git a/docs/uz/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md similarity index 100% rename from docs/uz/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md diff --git a/docs/uz/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt similarity index 100% rename from docs/uz/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt diff --git a/docs/uz/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt similarity index 100% rename from docs/uz/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt diff --git a/docs/uz/resources/openai-advanced/repo-template/docs/references/uv-llms.txt b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/references/uv-llms.txt similarity index 100% rename from docs/uz/resources/openai-advanced/repo-template/docs/references/uv-llms.txt rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/docs/references/uv-llms.txt diff --git a/docs/uz/resources/openai-advanced/repo-template/index.md b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/index.md similarity index 100% rename from docs/uz/resources/openai-advanced/repo-template/index.md rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/repo-template/index.md diff --git a/docs/uz/resources/openai-advanced/sops/chrome-devtools-validation-loop.md b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/sops/chrome-devtools-validation-loop.md similarity index 100% rename from docs/uz/resources/openai-advanced/sops/chrome-devtools-validation-loop.md rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/sops/chrome-devtools-validation-loop.md diff --git a/docs/uz/resources/openai-advanced/sops/encode-knowledge-into-repo.md b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/sops/encode-knowledge-into-repo.md similarity index 100% rename from docs/uz/resources/openai-advanced/sops/encode-knowledge-into-repo.md rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/sops/encode-knowledge-into-repo.md diff --git a/docs/uz/resources/openai-advanced/sops/index.md b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/sops/index.md similarity index 100% rename from docs/uz/resources/openai-advanced/sops/index.md rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/sops/index.md diff --git a/docs/uz/resources/openai-advanced/sops/layered-domain-architecture.md b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/sops/layered-domain-architecture.md similarity index 100% rename from docs/uz/resources/openai-advanced/sops/layered-domain-architecture.md rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/sops/layered-domain-architecture.md diff --git a/docs/uz/resources/openai-advanced/sops/observability-feedback-loop.md b/courses/learn-harness-engineering/docs/uz/resources/openai-advanced/sops/observability-feedback-loop.md similarity index 100% rename from docs/uz/resources/openai-advanced/sops/observability-feedback-loop.md rename to courses/learn-harness-engineering/docs/uz/resources/openai-advanced/sops/observability-feedback-loop.md diff --git a/docs/uz/resources/reference/coding-agent-startup-flow.md b/courses/learn-harness-engineering/docs/uz/resources/reference/coding-agent-startup-flow.md similarity index 100% rename from docs/uz/resources/reference/coding-agent-startup-flow.md rename to courses/learn-harness-engineering/docs/uz/resources/reference/coding-agent-startup-flow.md diff --git a/docs/uz/resources/reference/index.md b/courses/learn-harness-engineering/docs/uz/resources/reference/index.md similarity index 100% rename from docs/uz/resources/reference/index.md rename to courses/learn-harness-engineering/docs/uz/resources/reference/index.md diff --git a/docs/uz/resources/reference/initializer-agent-playbook.md b/courses/learn-harness-engineering/docs/uz/resources/reference/initializer-agent-playbook.md similarity index 100% rename from docs/uz/resources/reference/initializer-agent-playbook.md rename to courses/learn-harness-engineering/docs/uz/resources/reference/initializer-agent-playbook.md diff --git a/docs/uz/resources/reference/method-map.md b/courses/learn-harness-engineering/docs/uz/resources/reference/method-map.md similarity index 100% rename from docs/uz/resources/reference/method-map.md rename to courses/learn-harness-engineering/docs/uz/resources/reference/method-map.md diff --git a/docs/uz/resources/reference/prompt-calibration.md b/courses/learn-harness-engineering/docs/uz/resources/reference/prompt-calibration.md similarity index 100% rename from docs/uz/resources/reference/prompt-calibration.md rename to courses/learn-harness-engineering/docs/uz/resources/reference/prompt-calibration.md diff --git a/docs/uz/resources/templates/AGENTS.md b/courses/learn-harness-engineering/docs/uz/resources/templates/AGENTS.md similarity index 100% rename from docs/uz/resources/templates/AGENTS.md rename to courses/learn-harness-engineering/docs/uz/resources/templates/AGENTS.md diff --git a/docs/uz/resources/templates/CLAUDE.md b/courses/learn-harness-engineering/docs/uz/resources/templates/CLAUDE.md similarity index 100% rename from docs/uz/resources/templates/CLAUDE.md rename to courses/learn-harness-engineering/docs/uz/resources/templates/CLAUDE.md diff --git a/docs/uz/resources/templates/claude-progress.md b/courses/learn-harness-engineering/docs/uz/resources/templates/claude-progress.md similarity index 100% rename from docs/uz/resources/templates/claude-progress.md rename to courses/learn-harness-engineering/docs/uz/resources/templates/claude-progress.md diff --git a/docs/uz/resources/templates/clean-state-checklist.md b/courses/learn-harness-engineering/docs/uz/resources/templates/clean-state-checklist.md similarity index 100% rename from docs/uz/resources/templates/clean-state-checklist.md rename to courses/learn-harness-engineering/docs/uz/resources/templates/clean-state-checklist.md diff --git a/docs/uz/resources/templates/evaluator-rubric.md b/courses/learn-harness-engineering/docs/uz/resources/templates/evaluator-rubric.md similarity index 100% rename from docs/uz/resources/templates/evaluator-rubric.md rename to courses/learn-harness-engineering/docs/uz/resources/templates/evaluator-rubric.md diff --git a/docs/uz/resources/templates/feature_list.json b/courses/learn-harness-engineering/docs/uz/resources/templates/feature_list.json similarity index 100% rename from docs/uz/resources/templates/feature_list.json rename to courses/learn-harness-engineering/docs/uz/resources/templates/feature_list.json diff --git a/docs/uz/resources/templates/index.md b/courses/learn-harness-engineering/docs/uz/resources/templates/index.md similarity index 100% rename from docs/uz/resources/templates/index.md rename to courses/learn-harness-engineering/docs/uz/resources/templates/index.md diff --git a/docs/uz/resources/templates/init.sh b/courses/learn-harness-engineering/docs/uz/resources/templates/init.sh similarity index 100% rename from docs/uz/resources/templates/init.sh rename to courses/learn-harness-engineering/docs/uz/resources/templates/init.sh diff --git a/docs/uz/resources/templates/quality-document.md b/courses/learn-harness-engineering/docs/uz/resources/templates/quality-document.md similarity index 100% rename from docs/uz/resources/templates/quality-document.md rename to courses/learn-harness-engineering/docs/uz/resources/templates/quality-document.md diff --git a/docs/uz/resources/templates/session-handoff.md b/courses/learn-harness-engineering/docs/uz/resources/templates/session-handoff.md similarity index 100% rename from docs/uz/resources/templates/session-handoff.md rename to courses/learn-harness-engineering/docs/uz/resources/templates/session-handoff.md diff --git a/docs/uz/skills/index.md b/courses/learn-harness-engineering/docs/uz/skills/index.md similarity index 100% rename from docs/uz/skills/index.md rename to courses/learn-harness-engineering/docs/uz/skills/index.md diff --git a/docs/vi/index.md b/courses/learn-harness-engineering/docs/vi/index.md similarity index 100% rename from docs/vi/index.md rename to courses/learn-harness-engineering/docs/vi/index.md diff --git a/docs/vi/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts b/courses/learn-harness-engineering/docs/vi/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts similarity index 100% rename from docs/vi/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts diff --git a/docs/vi/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md similarity index 100% rename from docs/vi/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md diff --git a/docs/vi/lectures/lecture-01-why-capable-agents-still-fail/code/index.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-01-why-capable-agents-still-fail/code/index.md similarity index 100% rename from docs/vi/lectures/lecture-01-why-capable-agents-still-fail/code/index.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-01-why-capable-agents-still-fail/code/index.md diff --git a/docs/vi/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md similarity index 100% rename from docs/vi/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md diff --git a/docs/vi/lectures/lecture-01-why-capable-agents-still-fail/index.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-01-why-capable-agents-still-fail/index.md similarity index 100% rename from docs/vi/lectures/lecture-01-why-capable-agents-still-fail/index.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-01-why-capable-agents-still-fail/index.md diff --git a/docs/vi/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md similarity index 100% rename from docs/vi/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md diff --git a/docs/vi/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts b/courses/learn-harness-engineering/docs/vi/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts similarity index 100% rename from docs/vi/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts diff --git a/docs/vi/lectures/lecture-02-what-a-harness-actually-is/code/index.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-02-what-a-harness-actually-is/code/index.md similarity index 100% rename from docs/vi/lectures/lecture-02-what-a-harness-actually-is/code/index.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-02-what-a-harness-actually-is/code/index.md diff --git a/docs/vi/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts b/courses/learn-harness-engineering/docs/vi/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts similarity index 100% rename from docs/vi/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts diff --git a/docs/vi/lectures/lecture-02-what-a-harness-actually-is/index.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-02-what-a-harness-actually-is/index.md similarity index 100% rename from docs/vi/lectures/lecture-02-what-a-harness-actually-is/index.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-02-what-a-harness-actually-is/index.md diff --git a/docs/vi/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md similarity index 100% rename from docs/vi/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md diff --git a/docs/vi/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt b/courses/learn-harness-engineering/docs/vi/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt similarity index 100% rename from docs/vi/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt diff --git a/docs/vi/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts b/courses/learn-harness-engineering/docs/vi/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts similarity index 100% rename from docs/vi/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts diff --git a/docs/vi/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md similarity index 100% rename from docs/vi/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md diff --git a/docs/vi/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md similarity index 100% rename from docs/vi/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md diff --git a/docs/vi/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md similarity index 100% rename from docs/vi/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md diff --git a/docs/vi/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md similarity index 100% rename from docs/vi/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md diff --git a/docs/vi/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md similarity index 100% rename from docs/vi/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md diff --git a/docs/vi/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts b/courses/learn-harness-engineering/docs/vi/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts similarity index 100% rename from docs/vi/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts diff --git a/docs/vi/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md similarity index 100% rename from docs/vi/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md diff --git a/docs/vi/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md similarity index 100% rename from docs/vi/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md diff --git a/docs/vi/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md similarity index 100% rename from docs/vi/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md diff --git a/docs/vi/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md similarity index 100% rename from docs/vi/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md diff --git a/docs/vi/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts b/courses/learn-harness-engineering/docs/vi/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts similarity index 100% rename from docs/vi/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts diff --git a/docs/vi/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md similarity index 100% rename from docs/vi/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md diff --git a/docs/vi/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md similarity index 100% rename from docs/vi/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md diff --git a/docs/vi/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts b/courses/learn-harness-engineering/docs/vi/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts similarity index 100% rename from docs/vi/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts diff --git a/docs/vi/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh b/courses/learn-harness-engineering/docs/vi/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh similarity index 100% rename from docs/vi/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh diff --git a/docs/vi/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md similarity index 100% rename from docs/vi/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md diff --git a/docs/vi/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md similarity index 100% rename from docs/vi/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md diff --git a/docs/vi/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md similarity index 100% rename from docs/vi/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md diff --git a/docs/vi/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md similarity index 100% rename from docs/vi/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md diff --git a/docs/vi/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md similarity index 100% rename from docs/vi/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md diff --git a/docs/vi/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts b/courses/learn-harness-engineering/docs/vi/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts similarity index 100% rename from docs/vi/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts diff --git a/docs/vi/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md similarity index 100% rename from docs/vi/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md diff --git a/docs/vi/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts b/courses/learn-harness-engineering/docs/vi/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts similarity index 100% rename from docs/vi/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts diff --git a/docs/vi/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json b/courses/learn-harness-engineering/docs/vi/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json similarity index 100% rename from docs/vi/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json diff --git a/docs/vi/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md similarity index 100% rename from docs/vi/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md diff --git a/docs/vi/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md similarity index 100% rename from docs/vi/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md diff --git a/docs/vi/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md similarity index 100% rename from docs/vi/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md diff --git a/docs/vi/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md similarity index 100% rename from docs/vi/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md diff --git a/docs/vi/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md similarity index 100% rename from docs/vi/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md diff --git a/docs/vi/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts b/courses/learn-harness-engineering/docs/vi/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts similarity index 100% rename from docs/vi/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts diff --git a/docs/vi/lectures/lecture-09-why-agents-declare-victory-too-early/index.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-09-why-agents-declare-victory-too-early/index.md similarity index 100% rename from docs/vi/lectures/lecture-09-why-agents-declare-victory-too-early/index.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-09-why-agents-declare-victory-too-early/index.md diff --git a/docs/vi/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md similarity index 100% rename from docs/vi/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md diff --git a/docs/vi/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts b/courses/learn-harness-engineering/docs/vi/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts similarity index 100% rename from docs/vi/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts diff --git a/docs/vi/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md similarity index 100% rename from docs/vi/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md diff --git a/docs/vi/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md similarity index 100% rename from docs/vi/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md diff --git a/docs/vi/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md similarity index 100% rename from docs/vi/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md diff --git a/docs/vi/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md similarity index 100% rename from docs/vi/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md diff --git a/docs/vi/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md similarity index 100% rename from docs/vi/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md diff --git a/docs/vi/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts b/courses/learn-harness-engineering/docs/vi/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts similarity index 100% rename from docs/vi/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts diff --git a/docs/vi/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md similarity index 100% rename from docs/vi/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md diff --git a/docs/vi/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md similarity index 100% rename from docs/vi/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md diff --git a/docs/vi/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md similarity index 100% rename from docs/vi/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md diff --git a/docs/vi/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts b/courses/learn-harness-engineering/docs/vi/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts similarity index 100% rename from docs/vi/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts diff --git a/docs/vi/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md similarity index 100% rename from docs/vi/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md diff --git a/docs/vi/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts b/courses/learn-harness-engineering/docs/vi/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts similarity index 100% rename from docs/vi/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts diff --git a/docs/vi/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md similarity index 100% rename from docs/vi/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md diff --git a/docs/vi/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md b/courses/learn-harness-engineering/docs/vi/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md similarity index 100% rename from docs/vi/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md rename to courses/learn-harness-engineering/docs/vi/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md diff --git a/docs/vi/projects/index.md b/courses/learn-harness-engineering/docs/vi/projects/index.md similarity index 100% rename from docs/vi/projects/index.md rename to courses/learn-harness-engineering/docs/vi/projects/index.md diff --git a/docs/vi/projects/project-01-baseline-vs-minimal-harness/index.md b/courses/learn-harness-engineering/docs/vi/projects/project-01-baseline-vs-minimal-harness/index.md similarity index 100% rename from docs/vi/projects/project-01-baseline-vs-minimal-harness/index.md rename to courses/learn-harness-engineering/docs/vi/projects/project-01-baseline-vs-minimal-harness/index.md diff --git a/docs/vi/projects/project-02-agent-readable-workspace/index.md b/courses/learn-harness-engineering/docs/vi/projects/project-02-agent-readable-workspace/index.md similarity index 100% rename from docs/vi/projects/project-02-agent-readable-workspace/index.md rename to courses/learn-harness-engineering/docs/vi/projects/project-02-agent-readable-workspace/index.md diff --git a/docs/vi/projects/project-03-multi-session-continuity/index.md b/courses/learn-harness-engineering/docs/vi/projects/project-03-multi-session-continuity/index.md similarity index 100% rename from docs/vi/projects/project-03-multi-session-continuity/index.md rename to courses/learn-harness-engineering/docs/vi/projects/project-03-multi-session-continuity/index.md diff --git a/docs/vi/projects/project-04-incremental-indexing/index.md b/courses/learn-harness-engineering/docs/vi/projects/project-04-incremental-indexing/index.md similarity index 100% rename from docs/vi/projects/project-04-incremental-indexing/index.md rename to courses/learn-harness-engineering/docs/vi/projects/project-04-incremental-indexing/index.md diff --git a/docs/vi/projects/project-05-grounded-qa-verification/index.md b/courses/learn-harness-engineering/docs/vi/projects/project-05-grounded-qa-verification/index.md similarity index 100% rename from docs/vi/projects/project-05-grounded-qa-verification/index.md rename to courses/learn-harness-engineering/docs/vi/projects/project-05-grounded-qa-verification/index.md diff --git a/docs/vi/projects/project-06-runtime-observability-and-debugging/index.md b/courses/learn-harness-engineering/docs/vi/projects/project-06-runtime-observability-and-debugging/index.md similarity index 100% rename from docs/vi/projects/project-06-runtime-observability-and-debugging/index.md rename to courses/learn-harness-engineering/docs/vi/projects/project-06-runtime-observability-and-debugging/index.md diff --git a/docs/vi/resources/index.md b/courses/learn-harness-engineering/docs/vi/resources/index.md similarity index 100% rename from docs/vi/resources/index.md rename to courses/learn-harness-engineering/docs/vi/resources/index.md diff --git a/docs/vi/resources/openai-advanced/index.md b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/index.md similarity index 100% rename from docs/vi/resources/openai-advanced/index.md rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/index.md diff --git a/docs/vi/resources/openai-advanced/repo-template/AGENTS.md b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/AGENTS.md similarity index 100% rename from docs/vi/resources/openai-advanced/repo-template/AGENTS.md rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/AGENTS.md diff --git a/docs/vi/resources/openai-advanced/repo-template/ARCHITECTURE.md b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/ARCHITECTURE.md similarity index 100% rename from docs/vi/resources/openai-advanced/repo-template/ARCHITECTURE.md rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/ARCHITECTURE.md diff --git a/docs/vi/resources/openai-advanced/repo-template/docs/DESIGN.md b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/DESIGN.md similarity index 100% rename from docs/vi/resources/openai-advanced/repo-template/docs/DESIGN.md rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/DESIGN.md diff --git a/docs/vi/resources/openai-advanced/repo-template/docs/FRONTEND.md b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/FRONTEND.md similarity index 100% rename from docs/vi/resources/openai-advanced/repo-template/docs/FRONTEND.md rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/FRONTEND.md diff --git a/docs/vi/resources/openai-advanced/repo-template/docs/PLANS.md b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/PLANS.md similarity index 100% rename from docs/vi/resources/openai-advanced/repo-template/docs/PLANS.md rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/PLANS.md diff --git a/docs/vi/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md similarity index 100% rename from docs/vi/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md diff --git a/docs/vi/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md similarity index 100% rename from docs/vi/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md diff --git a/docs/vi/resources/openai-advanced/repo-template/docs/RELIABILITY.md b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/RELIABILITY.md similarity index 100% rename from docs/vi/resources/openai-advanced/repo-template/docs/RELIABILITY.md rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/RELIABILITY.md diff --git a/docs/vi/resources/openai-advanced/repo-template/docs/SECURITY.md b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/SECURITY.md similarity index 100% rename from docs/vi/resources/openai-advanced/repo-template/docs/SECURITY.md rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/SECURITY.md diff --git a/docs/vi/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md similarity index 100% rename from docs/vi/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md diff --git a/docs/vi/resources/openai-advanced/repo-template/docs/design-docs/index.md b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/design-docs/index.md similarity index 100% rename from docs/vi/resources/openai-advanced/repo-template/docs/design-docs/index.md rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/design-docs/index.md diff --git a/docs/vi/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md similarity index 100% rename from docs/vi/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md diff --git a/docs/vi/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md similarity index 100% rename from docs/vi/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md diff --git a/docs/vi/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md similarity index 100% rename from docs/vi/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md diff --git a/docs/vi/resources/openai-advanced/repo-template/docs/generated/db-schema.md b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/generated/db-schema.md similarity index 100% rename from docs/vi/resources/openai-advanced/repo-template/docs/generated/db-schema.md rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/generated/db-schema.md diff --git a/docs/vi/resources/openai-advanced/repo-template/docs/product-specs/index.md b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/product-specs/index.md similarity index 100% rename from docs/vi/resources/openai-advanced/repo-template/docs/product-specs/index.md rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/product-specs/index.md diff --git a/docs/vi/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md similarity index 100% rename from docs/vi/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md diff --git a/docs/vi/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt similarity index 100% rename from docs/vi/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt diff --git a/docs/vi/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt similarity index 100% rename from docs/vi/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt diff --git a/docs/vi/resources/openai-advanced/repo-template/docs/references/uv-llms.txt b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/references/uv-llms.txt similarity index 100% rename from docs/vi/resources/openai-advanced/repo-template/docs/references/uv-llms.txt rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/docs/references/uv-llms.txt diff --git a/docs/vi/resources/openai-advanced/repo-template/index.md b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/index.md similarity index 100% rename from docs/vi/resources/openai-advanced/repo-template/index.md rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/repo-template/index.md diff --git a/docs/vi/resources/openai-advanced/sops/chrome-devtools-validation-loop.md b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/sops/chrome-devtools-validation-loop.md similarity index 100% rename from docs/vi/resources/openai-advanced/sops/chrome-devtools-validation-loop.md rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/sops/chrome-devtools-validation-loop.md diff --git a/docs/vi/resources/openai-advanced/sops/encode-knowledge-into-repo.md b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/sops/encode-knowledge-into-repo.md similarity index 100% rename from docs/vi/resources/openai-advanced/sops/encode-knowledge-into-repo.md rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/sops/encode-knowledge-into-repo.md diff --git a/docs/vi/resources/openai-advanced/sops/index.md b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/sops/index.md similarity index 100% rename from docs/vi/resources/openai-advanced/sops/index.md rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/sops/index.md diff --git a/docs/vi/resources/openai-advanced/sops/layered-domain-architecture.md b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/sops/layered-domain-architecture.md similarity index 100% rename from docs/vi/resources/openai-advanced/sops/layered-domain-architecture.md rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/sops/layered-domain-architecture.md diff --git a/docs/vi/resources/openai-advanced/sops/observability-feedback-loop.md b/courses/learn-harness-engineering/docs/vi/resources/openai-advanced/sops/observability-feedback-loop.md similarity index 100% rename from docs/vi/resources/openai-advanced/sops/observability-feedback-loop.md rename to courses/learn-harness-engineering/docs/vi/resources/openai-advanced/sops/observability-feedback-loop.md diff --git a/docs/vi/resources/reference/coding-agent-startup-flow.md b/courses/learn-harness-engineering/docs/vi/resources/reference/coding-agent-startup-flow.md similarity index 100% rename from docs/vi/resources/reference/coding-agent-startup-flow.md rename to courses/learn-harness-engineering/docs/vi/resources/reference/coding-agent-startup-flow.md diff --git a/docs/vi/resources/reference/index.md b/courses/learn-harness-engineering/docs/vi/resources/reference/index.md similarity index 100% rename from docs/vi/resources/reference/index.md rename to courses/learn-harness-engineering/docs/vi/resources/reference/index.md diff --git a/docs/vi/resources/reference/initializer-agent-playbook.md b/courses/learn-harness-engineering/docs/vi/resources/reference/initializer-agent-playbook.md similarity index 100% rename from docs/vi/resources/reference/initializer-agent-playbook.md rename to courses/learn-harness-engineering/docs/vi/resources/reference/initializer-agent-playbook.md diff --git a/docs/vi/resources/reference/method-map.md b/courses/learn-harness-engineering/docs/vi/resources/reference/method-map.md similarity index 100% rename from docs/vi/resources/reference/method-map.md rename to courses/learn-harness-engineering/docs/vi/resources/reference/method-map.md diff --git a/docs/vi/resources/reference/prompt-calibration.md b/courses/learn-harness-engineering/docs/vi/resources/reference/prompt-calibration.md similarity index 100% rename from docs/vi/resources/reference/prompt-calibration.md rename to courses/learn-harness-engineering/docs/vi/resources/reference/prompt-calibration.md diff --git a/docs/vi/resources/templates/AGENTS.md b/courses/learn-harness-engineering/docs/vi/resources/templates/AGENTS.md similarity index 100% rename from docs/vi/resources/templates/AGENTS.md rename to courses/learn-harness-engineering/docs/vi/resources/templates/AGENTS.md diff --git a/docs/vi/resources/templates/CLAUDE.md b/courses/learn-harness-engineering/docs/vi/resources/templates/CLAUDE.md similarity index 100% rename from docs/vi/resources/templates/CLAUDE.md rename to courses/learn-harness-engineering/docs/vi/resources/templates/CLAUDE.md diff --git a/docs/vi/resources/templates/claude-progress.md b/courses/learn-harness-engineering/docs/vi/resources/templates/claude-progress.md similarity index 100% rename from docs/vi/resources/templates/claude-progress.md rename to courses/learn-harness-engineering/docs/vi/resources/templates/claude-progress.md diff --git a/docs/vi/resources/templates/clean-state-checklist.md b/courses/learn-harness-engineering/docs/vi/resources/templates/clean-state-checklist.md similarity index 100% rename from docs/vi/resources/templates/clean-state-checklist.md rename to courses/learn-harness-engineering/docs/vi/resources/templates/clean-state-checklist.md diff --git a/docs/vi/resources/templates/evaluator-rubric.md b/courses/learn-harness-engineering/docs/vi/resources/templates/evaluator-rubric.md similarity index 100% rename from docs/vi/resources/templates/evaluator-rubric.md rename to courses/learn-harness-engineering/docs/vi/resources/templates/evaluator-rubric.md diff --git a/docs/vi/resources/templates/feature_list.json b/courses/learn-harness-engineering/docs/vi/resources/templates/feature_list.json similarity index 100% rename from docs/vi/resources/templates/feature_list.json rename to courses/learn-harness-engineering/docs/vi/resources/templates/feature_list.json diff --git a/docs/vi/resources/templates/index.md b/courses/learn-harness-engineering/docs/vi/resources/templates/index.md similarity index 100% rename from docs/vi/resources/templates/index.md rename to courses/learn-harness-engineering/docs/vi/resources/templates/index.md diff --git a/docs/vi/resources/templates/init.sh b/courses/learn-harness-engineering/docs/vi/resources/templates/init.sh similarity index 100% rename from docs/vi/resources/templates/init.sh rename to courses/learn-harness-engineering/docs/vi/resources/templates/init.sh diff --git a/docs/vi/resources/templates/quality-document.md b/courses/learn-harness-engineering/docs/vi/resources/templates/quality-document.md similarity index 100% rename from docs/vi/resources/templates/quality-document.md rename to courses/learn-harness-engineering/docs/vi/resources/templates/quality-document.md diff --git a/docs/vi/resources/templates/session-handoff.md b/courses/learn-harness-engineering/docs/vi/resources/templates/session-handoff.md similarity index 100% rename from docs/vi/resources/templates/session-handoff.md rename to courses/learn-harness-engineering/docs/vi/resources/templates/session-handoff.md diff --git a/docs/vi/skills/index.md b/courses/learn-harness-engineering/docs/vi/skills/index.md similarity index 100% rename from docs/vi/skills/index.md rename to courses/learn-harness-engineering/docs/vi/skills/index.md diff --git a/docs/zh-TW/index.md b/courses/learn-harness-engineering/docs/zh-TW/index.md similarity index 100% rename from docs/zh-TW/index.md rename to courses/learn-harness-engineering/docs/zh-TW/index.md diff --git a/docs/zh-TW/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts similarity index 100% rename from docs/zh-TW/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts diff --git a/docs/zh-TW/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md similarity index 100% rename from docs/zh-TW/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md diff --git a/docs/zh-TW/lectures/lecture-01-why-capable-agents-still-fail/code/index.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-01-why-capable-agents-still-fail/code/index.md similarity index 100% rename from docs/zh-TW/lectures/lecture-01-why-capable-agents-still-fail/code/index.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-01-why-capable-agents-still-fail/code/index.md diff --git a/docs/zh-TW/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md similarity index 100% rename from docs/zh-TW/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md diff --git a/docs/zh-TW/lectures/lecture-01-why-capable-agents-still-fail/index.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-01-why-capable-agents-still-fail/index.md similarity index 100% rename from docs/zh-TW/lectures/lecture-01-why-capable-agents-still-fail/index.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-01-why-capable-agents-still-fail/index.md diff --git a/docs/zh-TW/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md similarity index 100% rename from docs/zh-TW/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md diff --git a/docs/zh-TW/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts similarity index 100% rename from docs/zh-TW/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts diff --git a/docs/zh-TW/lectures/lecture-02-what-a-harness-actually-is/code/index.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-02-what-a-harness-actually-is/code/index.md similarity index 100% rename from docs/zh-TW/lectures/lecture-02-what-a-harness-actually-is/code/index.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-02-what-a-harness-actually-is/code/index.md diff --git a/docs/zh-TW/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts similarity index 100% rename from docs/zh-TW/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts diff --git a/docs/zh-TW/lectures/lecture-02-what-a-harness-actually-is/index.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-02-what-a-harness-actually-is/index.md similarity index 100% rename from docs/zh-TW/lectures/lecture-02-what-a-harness-actually-is/index.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-02-what-a-harness-actually-is/index.md diff --git a/docs/zh-TW/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md similarity index 100% rename from docs/zh-TW/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md diff --git a/docs/zh-TW/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt similarity index 100% rename from docs/zh-TW/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt diff --git a/docs/zh-TW/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts similarity index 100% rename from docs/zh-TW/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts diff --git a/docs/zh-TW/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md similarity index 100% rename from docs/zh-TW/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md diff --git a/docs/zh-TW/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md similarity index 100% rename from docs/zh-TW/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md diff --git a/docs/zh-TW/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md similarity index 100% rename from docs/zh-TW/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md diff --git a/docs/zh-TW/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md similarity index 100% rename from docs/zh-TW/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md diff --git a/docs/zh-TW/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md similarity index 100% rename from docs/zh-TW/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md diff --git a/docs/zh-TW/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts similarity index 100% rename from docs/zh-TW/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts diff --git a/docs/zh-TW/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md similarity index 100% rename from docs/zh-TW/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md diff --git a/docs/zh-TW/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md similarity index 100% rename from docs/zh-TW/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md diff --git a/docs/zh-TW/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md similarity index 100% rename from docs/zh-TW/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md diff --git a/docs/zh-TW/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md similarity index 100% rename from docs/zh-TW/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md diff --git a/docs/zh-TW/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts similarity index 100% rename from docs/zh-TW/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts diff --git a/docs/zh-TW/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md similarity index 100% rename from docs/zh-TW/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md diff --git a/docs/zh-TW/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md similarity index 100% rename from docs/zh-TW/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md diff --git a/docs/zh-TW/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts similarity index 100% rename from docs/zh-TW/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts diff --git a/docs/zh-TW/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh similarity index 100% rename from docs/zh-TW/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh diff --git a/docs/zh-TW/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md similarity index 100% rename from docs/zh-TW/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md diff --git a/docs/zh-TW/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md similarity index 100% rename from docs/zh-TW/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md diff --git a/docs/zh-TW/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md similarity index 100% rename from docs/zh-TW/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md diff --git a/docs/zh-TW/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md similarity index 100% rename from docs/zh-TW/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md diff --git a/docs/zh-TW/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md similarity index 100% rename from docs/zh-TW/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md diff --git a/docs/zh-TW/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts similarity index 100% rename from docs/zh-TW/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts diff --git a/docs/zh-TW/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md similarity index 100% rename from docs/zh-TW/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md diff --git a/docs/zh-TW/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts similarity index 100% rename from docs/zh-TW/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts diff --git a/docs/zh-TW/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json similarity index 100% rename from docs/zh-TW/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json diff --git a/docs/zh-TW/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md similarity index 100% rename from docs/zh-TW/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md diff --git a/docs/zh-TW/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md similarity index 100% rename from docs/zh-TW/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md diff --git a/docs/zh-TW/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md similarity index 100% rename from docs/zh-TW/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md diff --git a/docs/zh-TW/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md similarity index 100% rename from docs/zh-TW/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md diff --git a/docs/zh-TW/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md similarity index 100% rename from docs/zh-TW/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md diff --git a/docs/zh-TW/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts similarity index 100% rename from docs/zh-TW/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts diff --git a/docs/zh-TW/lectures/lecture-09-why-agents-declare-victory-too-early/index.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-09-why-agents-declare-victory-too-early/index.md similarity index 100% rename from docs/zh-TW/lectures/lecture-09-why-agents-declare-victory-too-early/index.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-09-why-agents-declare-victory-too-early/index.md diff --git a/docs/zh-TW/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md similarity index 100% rename from docs/zh-TW/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md diff --git a/docs/zh-TW/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts similarity index 100% rename from docs/zh-TW/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts diff --git a/docs/zh-TW/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md similarity index 100% rename from docs/zh-TW/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md diff --git a/docs/zh-TW/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md similarity index 100% rename from docs/zh-TW/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md diff --git a/docs/zh-TW/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md similarity index 100% rename from docs/zh-TW/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md diff --git a/docs/zh-TW/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md similarity index 100% rename from docs/zh-TW/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md diff --git a/docs/zh-TW/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md similarity index 100% rename from docs/zh-TW/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md diff --git a/docs/zh-TW/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts similarity index 100% rename from docs/zh-TW/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts diff --git a/docs/zh-TW/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md similarity index 100% rename from docs/zh-TW/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md diff --git a/docs/zh-TW/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md similarity index 100% rename from docs/zh-TW/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md diff --git a/docs/zh-TW/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md similarity index 100% rename from docs/zh-TW/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md diff --git a/docs/zh-TW/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts similarity index 100% rename from docs/zh-TW/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts diff --git a/docs/zh-TW/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md similarity index 100% rename from docs/zh-TW/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md diff --git a/docs/zh-TW/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts similarity index 100% rename from docs/zh-TW/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts diff --git a/docs/zh-TW/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md similarity index 100% rename from docs/zh-TW/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md diff --git a/docs/zh-TW/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md b/courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md similarity index 100% rename from docs/zh-TW/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md rename to courses/learn-harness-engineering/docs/zh-TW/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md diff --git a/docs/zh-TW/projects/index.md b/courses/learn-harness-engineering/docs/zh-TW/projects/index.md similarity index 100% rename from docs/zh-TW/projects/index.md rename to courses/learn-harness-engineering/docs/zh-TW/projects/index.md diff --git a/docs/zh-TW/projects/project-01-baseline-vs-minimal-harness/index.md b/courses/learn-harness-engineering/docs/zh-TW/projects/project-01-baseline-vs-minimal-harness/index.md similarity index 100% rename from docs/zh-TW/projects/project-01-baseline-vs-minimal-harness/index.md rename to courses/learn-harness-engineering/docs/zh-TW/projects/project-01-baseline-vs-minimal-harness/index.md diff --git a/docs/zh-TW/projects/project-02-agent-readable-workspace/index.md b/courses/learn-harness-engineering/docs/zh-TW/projects/project-02-agent-readable-workspace/index.md similarity index 100% rename from docs/zh-TW/projects/project-02-agent-readable-workspace/index.md rename to courses/learn-harness-engineering/docs/zh-TW/projects/project-02-agent-readable-workspace/index.md diff --git a/docs/zh-TW/projects/project-03-multi-session-continuity/index.md b/courses/learn-harness-engineering/docs/zh-TW/projects/project-03-multi-session-continuity/index.md similarity index 100% rename from docs/zh-TW/projects/project-03-multi-session-continuity/index.md rename to courses/learn-harness-engineering/docs/zh-TW/projects/project-03-multi-session-continuity/index.md diff --git a/docs/zh-TW/projects/project-04-incremental-indexing/index.md b/courses/learn-harness-engineering/docs/zh-TW/projects/project-04-incremental-indexing/index.md similarity index 100% rename from docs/zh-TW/projects/project-04-incremental-indexing/index.md rename to courses/learn-harness-engineering/docs/zh-TW/projects/project-04-incremental-indexing/index.md diff --git a/docs/zh-TW/projects/project-05-grounded-qa-verification/index.md b/courses/learn-harness-engineering/docs/zh-TW/projects/project-05-grounded-qa-verification/index.md similarity index 100% rename from docs/zh-TW/projects/project-05-grounded-qa-verification/index.md rename to courses/learn-harness-engineering/docs/zh-TW/projects/project-05-grounded-qa-verification/index.md diff --git a/docs/zh-TW/projects/project-06-runtime-observability-and-debugging/index.md b/courses/learn-harness-engineering/docs/zh-TW/projects/project-06-runtime-observability-and-debugging/index.md similarity index 100% rename from docs/zh-TW/projects/project-06-runtime-observability-and-debugging/index.md rename to courses/learn-harness-engineering/docs/zh-TW/projects/project-06-runtime-observability-and-debugging/index.md diff --git a/docs/zh-TW/resources/index.md b/courses/learn-harness-engineering/docs/zh-TW/resources/index.md similarity index 100% rename from docs/zh-TW/resources/index.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/index.md diff --git a/docs/zh-TW/resources/openai-advanced/index.md b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/index.md similarity index 100% rename from docs/zh-TW/resources/openai-advanced/index.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/index.md diff --git a/docs/zh-TW/resources/openai-advanced/repo-template/AGENTS.md b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/AGENTS.md similarity index 100% rename from docs/zh-TW/resources/openai-advanced/repo-template/AGENTS.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/AGENTS.md diff --git a/docs/zh-TW/resources/openai-advanced/repo-template/ARCHITECTURE.md b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/ARCHITECTURE.md similarity index 100% rename from docs/zh-TW/resources/openai-advanced/repo-template/ARCHITECTURE.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/ARCHITECTURE.md diff --git a/docs/zh-TW/resources/openai-advanced/repo-template/docs/DESIGN.md b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/DESIGN.md similarity index 100% rename from docs/zh-TW/resources/openai-advanced/repo-template/docs/DESIGN.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/DESIGN.md diff --git a/docs/zh-TW/resources/openai-advanced/repo-template/docs/FRONTEND.md b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/FRONTEND.md similarity index 100% rename from docs/zh-TW/resources/openai-advanced/repo-template/docs/FRONTEND.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/FRONTEND.md diff --git a/docs/zh-TW/resources/openai-advanced/repo-template/docs/PLANS.md b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/PLANS.md similarity index 100% rename from docs/zh-TW/resources/openai-advanced/repo-template/docs/PLANS.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/PLANS.md diff --git a/docs/zh-TW/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md similarity index 100% rename from docs/zh-TW/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md diff --git a/docs/zh-TW/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md similarity index 100% rename from docs/zh-TW/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md diff --git a/docs/zh-TW/resources/openai-advanced/repo-template/docs/RELIABILITY.md b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/RELIABILITY.md similarity index 100% rename from docs/zh-TW/resources/openai-advanced/repo-template/docs/RELIABILITY.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/RELIABILITY.md diff --git a/docs/zh-TW/resources/openai-advanced/repo-template/docs/SECURITY.md b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/SECURITY.md similarity index 100% rename from docs/zh-TW/resources/openai-advanced/repo-template/docs/SECURITY.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/SECURITY.md diff --git a/docs/zh-TW/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md similarity index 100% rename from docs/zh-TW/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md diff --git a/docs/zh-TW/resources/openai-advanced/repo-template/docs/design-docs/index.md b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/design-docs/index.md similarity index 100% rename from docs/zh-TW/resources/openai-advanced/repo-template/docs/design-docs/index.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/design-docs/index.md diff --git a/docs/zh-TW/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md similarity index 100% rename from docs/zh-TW/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md diff --git a/docs/zh-TW/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md similarity index 100% rename from docs/zh-TW/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md diff --git a/docs/zh-TW/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md similarity index 100% rename from docs/zh-TW/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md diff --git a/docs/zh-TW/resources/openai-advanced/repo-template/docs/generated/db-schema.md b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/generated/db-schema.md similarity index 100% rename from docs/zh-TW/resources/openai-advanced/repo-template/docs/generated/db-schema.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/generated/db-schema.md diff --git a/docs/zh-TW/resources/openai-advanced/repo-template/docs/product-specs/index.md b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/product-specs/index.md similarity index 100% rename from docs/zh-TW/resources/openai-advanced/repo-template/docs/product-specs/index.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/product-specs/index.md diff --git a/docs/zh-TW/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md similarity index 100% rename from docs/zh-TW/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md diff --git a/docs/zh-TW/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt similarity index 100% rename from docs/zh-TW/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt diff --git a/docs/zh-TW/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt similarity index 100% rename from docs/zh-TW/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt diff --git a/docs/zh-TW/resources/openai-advanced/repo-template/docs/references/uv-llms.txt b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/references/uv-llms.txt similarity index 100% rename from docs/zh-TW/resources/openai-advanced/repo-template/docs/references/uv-llms.txt rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/docs/references/uv-llms.txt diff --git a/docs/zh-TW/resources/openai-advanced/repo-template/index.md b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/index.md similarity index 100% rename from docs/zh-TW/resources/openai-advanced/repo-template/index.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/repo-template/index.md diff --git a/docs/zh-TW/resources/openai-advanced/sops/chrome-devtools-validation-loop.md b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/sops/chrome-devtools-validation-loop.md similarity index 100% rename from docs/zh-TW/resources/openai-advanced/sops/chrome-devtools-validation-loop.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/sops/chrome-devtools-validation-loop.md diff --git a/docs/zh-TW/resources/openai-advanced/sops/encode-knowledge-into-repo.md b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/sops/encode-knowledge-into-repo.md similarity index 100% rename from docs/zh-TW/resources/openai-advanced/sops/encode-knowledge-into-repo.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/sops/encode-knowledge-into-repo.md diff --git a/docs/zh-TW/resources/openai-advanced/sops/index.md b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/sops/index.md similarity index 100% rename from docs/zh-TW/resources/openai-advanced/sops/index.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/sops/index.md diff --git a/docs/zh-TW/resources/openai-advanced/sops/layered-domain-architecture.md b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/sops/layered-domain-architecture.md similarity index 100% rename from docs/zh-TW/resources/openai-advanced/sops/layered-domain-architecture.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/sops/layered-domain-architecture.md diff --git a/docs/zh-TW/resources/openai-advanced/sops/observability-feedback-loop.md b/courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/sops/observability-feedback-loop.md similarity index 100% rename from docs/zh-TW/resources/openai-advanced/sops/observability-feedback-loop.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/openai-advanced/sops/observability-feedback-loop.md diff --git a/docs/zh-TW/resources/reference/coding-agent-startup-flow.md b/courses/learn-harness-engineering/docs/zh-TW/resources/reference/coding-agent-startup-flow.md similarity index 100% rename from docs/zh-TW/resources/reference/coding-agent-startup-flow.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/reference/coding-agent-startup-flow.md diff --git a/docs/zh-TW/resources/reference/index.md b/courses/learn-harness-engineering/docs/zh-TW/resources/reference/index.md similarity index 100% rename from docs/zh-TW/resources/reference/index.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/reference/index.md diff --git a/docs/zh-TW/resources/reference/initializer-agent-playbook.md b/courses/learn-harness-engineering/docs/zh-TW/resources/reference/initializer-agent-playbook.md similarity index 100% rename from docs/zh-TW/resources/reference/initializer-agent-playbook.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/reference/initializer-agent-playbook.md diff --git a/docs/zh-TW/resources/reference/method-map.md b/courses/learn-harness-engineering/docs/zh-TW/resources/reference/method-map.md similarity index 100% rename from docs/zh-TW/resources/reference/method-map.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/reference/method-map.md diff --git a/docs/zh-TW/resources/reference/prompt-calibration.md b/courses/learn-harness-engineering/docs/zh-TW/resources/reference/prompt-calibration.md similarity index 100% rename from docs/zh-TW/resources/reference/prompt-calibration.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/reference/prompt-calibration.md diff --git a/docs/zh-TW/resources/templates/AGENTS.md b/courses/learn-harness-engineering/docs/zh-TW/resources/templates/AGENTS.md similarity index 100% rename from docs/zh-TW/resources/templates/AGENTS.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/templates/AGENTS.md diff --git a/docs/zh-TW/resources/templates/CLAUDE.md b/courses/learn-harness-engineering/docs/zh-TW/resources/templates/CLAUDE.md similarity index 100% rename from docs/zh-TW/resources/templates/CLAUDE.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/templates/CLAUDE.md diff --git a/docs/zh-TW/resources/templates/claude-progress.md b/courses/learn-harness-engineering/docs/zh-TW/resources/templates/claude-progress.md similarity index 100% rename from docs/zh-TW/resources/templates/claude-progress.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/templates/claude-progress.md diff --git a/docs/zh-TW/resources/templates/clean-state-checklist.md b/courses/learn-harness-engineering/docs/zh-TW/resources/templates/clean-state-checklist.md similarity index 100% rename from docs/zh-TW/resources/templates/clean-state-checklist.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/templates/clean-state-checklist.md diff --git a/docs/zh-TW/resources/templates/evaluator-rubric.md b/courses/learn-harness-engineering/docs/zh-TW/resources/templates/evaluator-rubric.md similarity index 100% rename from docs/zh-TW/resources/templates/evaluator-rubric.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/templates/evaluator-rubric.md diff --git a/docs/zh-TW/resources/templates/feature_list.json b/courses/learn-harness-engineering/docs/zh-TW/resources/templates/feature_list.json similarity index 100% rename from docs/zh-TW/resources/templates/feature_list.json rename to courses/learn-harness-engineering/docs/zh-TW/resources/templates/feature_list.json diff --git a/docs/zh-TW/resources/templates/index.md b/courses/learn-harness-engineering/docs/zh-TW/resources/templates/index.md similarity index 100% rename from docs/zh-TW/resources/templates/index.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/templates/index.md diff --git a/docs/zh-TW/resources/templates/init.sh b/courses/learn-harness-engineering/docs/zh-TW/resources/templates/init.sh similarity index 100% rename from docs/zh-TW/resources/templates/init.sh rename to courses/learn-harness-engineering/docs/zh-TW/resources/templates/init.sh diff --git a/docs/zh-TW/resources/templates/quality-document.md b/courses/learn-harness-engineering/docs/zh-TW/resources/templates/quality-document.md similarity index 100% rename from docs/zh-TW/resources/templates/quality-document.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/templates/quality-document.md diff --git a/docs/zh-TW/resources/templates/session-handoff.md b/courses/learn-harness-engineering/docs/zh-TW/resources/templates/session-handoff.md similarity index 100% rename from docs/zh-TW/resources/templates/session-handoff.md rename to courses/learn-harness-engineering/docs/zh-TW/resources/templates/session-handoff.md diff --git a/docs/zh-TW/skills/index.md b/courses/learn-harness-engineering/docs/zh-TW/skills/index.md similarity index 100% rename from docs/zh-TW/skills/index.md rename to courses/learn-harness-engineering/docs/zh-TW/skills/index.md diff --git a/docs/zh/index.md b/courses/learn-harness-engineering/docs/zh/index.md similarity index 100% rename from docs/zh/index.md rename to courses/learn-harness-engineering/docs/zh/index.md diff --git a/docs/zh/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts b/courses/learn-harness-engineering/docs/zh/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts similarity index 100% rename from docs/zh/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts diff --git a/docs/zh/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md similarity index 100% rename from docs/zh/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-01-why-capable-agents-still-fail/code/failure-signals-checklist.md diff --git a/docs/zh/lectures/lecture-01-why-capable-agents-still-fail/code/index.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-01-why-capable-agents-still-fail/code/index.md similarity index 100% rename from docs/zh/lectures/lecture-01-why-capable-agents-still-fail/code/index.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-01-why-capable-agents-still-fail/code/index.md diff --git a/docs/zh/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md similarity index 100% rename from docs/zh/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-01-why-capable-agents-still-fail/code/underspecified-task.md diff --git a/docs/zh/lectures/lecture-01-why-capable-agents-still-fail/index.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-01-why-capable-agents-still-fail/index.md similarity index 100% rename from docs/zh/lectures/lecture-01-why-capable-agents-still-fail/index.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-01-why-capable-agents-still-fail/index.md diff --git a/docs/zh/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md similarity index 100% rename from docs/zh/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-02-what-a-harness-actually-is/code/harness-components.md diff --git a/docs/zh/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts b/courses/learn-harness-engineering/docs/zh/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts similarity index 100% rename from docs/zh/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-02-what-a-harness-actually-is/code/harness-vs-no-harness.ts diff --git a/docs/zh/lectures/lecture-02-what-a-harness-actually-is/code/index.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-02-what-a-harness-actually-is/code/index.md similarity index 100% rename from docs/zh/lectures/lecture-02-what-a-harness-actually-is/code/index.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-02-what-a-harness-actually-is/code/index.md diff --git a/docs/zh/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts b/courses/learn-harness-engineering/docs/zh/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts similarity index 100% rename from docs/zh/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-02-what-a-harness-actually-is/code/minimal-harness-loop.ts diff --git a/docs/zh/lectures/lecture-02-what-a-harness-actually-is/index.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-02-what-a-harness-actually-is/index.md similarity index 100% rename from docs/zh/lectures/lecture-02-what-a-harness-actually-is/index.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-02-what-a-harness-actually-is/index.md diff --git a/docs/zh/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md similarity index 100% rename from docs/zh/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/index.md diff --git a/docs/zh/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt b/courses/learn-harness-engineering/docs/zh/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt similarity index 100% rename from docs/zh/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-knowledge-layout.txt diff --git a/docs/zh/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts b/courses/learn-harness-engineering/docs/zh/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts similarity index 100% rename from docs/zh/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/repo-reader.ts diff --git a/docs/zh/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md similarity index 100% rename from docs/zh/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/code/system-of-record-checklist.md diff --git a/docs/zh/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md similarity index 100% rename from docs/zh/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/index.md diff --git a/docs/zh/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md similarity index 100% rename from docs/zh/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-04-why-one-giant-instruction-file-fails/code/AGENTS-short.md diff --git a/docs/zh/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md similarity index 100% rename from docs/zh/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-04-why-one-giant-instruction-file-fails/code/anti-patterns.md diff --git a/docs/zh/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md similarity index 100% rename from docs/zh/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-04-why-one-giant-instruction-file-fails/code/index.md diff --git a/docs/zh/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts b/courses/learn-harness-engineering/docs/zh/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts similarity index 100% rename from docs/zh/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-04-why-one-giant-instruction-file-fails/code/split-vs-monolithic.ts diff --git a/docs/zh/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md similarity index 100% rename from docs/zh/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-04-why-one-giant-instruction-file-fails/index.md diff --git a/docs/zh/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md similarity index 100% rename from docs/zh/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/continuity-checklist.md diff --git a/docs/zh/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md similarity index 100% rename from docs/zh/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/index.md diff --git a/docs/zh/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md similarity index 100% rename from docs/zh/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-handoff.md diff --git a/docs/zh/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts b/courses/learn-harness-engineering/docs/zh/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts similarity index 100% rename from docs/zh/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-05-why-long-running-tasks-lose-continuity/code/session-simulator.ts diff --git a/docs/zh/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md similarity index 100% rename from docs/zh/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-05-why-long-running-tasks-lose-continuity/index.md diff --git a/docs/zh/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md similarity index 100% rename from docs/zh/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-06-why-initialization-needs-its-own-phase/code/index.md diff --git a/docs/zh/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts b/courses/learn-harness-engineering/docs/zh/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts similarity index 100% rename from docs/zh/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init-check.ts diff --git a/docs/zh/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh b/courses/learn-harness-engineering/docs/zh/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh similarity index 100% rename from docs/zh/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-06-why-initialization-needs-its-own-phase/code/init.sh diff --git a/docs/zh/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md similarity index 100% rename from docs/zh/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-06-why-initialization-needs-its-own-phase/code/initializer-output-checklist.md diff --git a/docs/zh/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md similarity index 100% rename from docs/zh/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-06-why-initialization-needs-its-own-phase/index.md diff --git a/docs/zh/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md similarity index 100% rename from docs/zh/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-07-why-agents-overreach-and-under-finish/code/index.md diff --git a/docs/zh/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md similarity index 100% rename from docs/zh/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-07-why-agents-overreach-and-under-finish/code/next-task-template.md diff --git a/docs/zh/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md similarity index 100% rename from docs/zh/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-surface-example.md diff --git a/docs/zh/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts b/courses/learn-harness-engineering/docs/zh/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts similarity index 100% rename from docs/zh/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-07-why-agents-overreach-and-under-finish/code/scope-tracker.ts diff --git a/docs/zh/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md similarity index 100% rename from docs/zh/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-07-why-agents-overreach-and-under-finish/index.md diff --git a/docs/zh/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts b/courses/learn-harness-engineering/docs/zh/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts similarity index 100% rename from docs/zh/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature-list-validator.ts diff --git a/docs/zh/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json b/courses/learn-harness-engineering/docs/zh/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json similarity index 100% rename from docs/zh/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/feature_list.json diff --git a/docs/zh/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md similarity index 100% rename from docs/zh/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/index.md diff --git a/docs/zh/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md similarity index 100% rename from docs/zh/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-08-why-feature-lists-are-harness-primitives/code/pass-gate-policy.md diff --git a/docs/zh/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md similarity index 100% rename from docs/zh/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-08-why-feature-lists-are-harness-primitives/index.md diff --git a/docs/zh/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md similarity index 100% rename from docs/zh/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-09-why-agents-declare-victory-too-early/code/clean-state-checklist.md diff --git a/docs/zh/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md similarity index 100% rename from docs/zh/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-09-why-agents-declare-victory-too-early/code/index.md diff --git a/docs/zh/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts b/courses/learn-harness-engineering/docs/zh/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts similarity index 100% rename from docs/zh/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-09-why-agents-declare-victory-too-early/code/victory-detector.ts diff --git a/docs/zh/lectures/lecture-09-why-agents-declare-victory-too-early/index.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-09-why-agents-declare-victory-too-early/index.md similarity index 100% rename from docs/zh/lectures/lecture-09-why-agents-declare-victory-too-early/index.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-09-why-agents-declare-victory-too-early/index.md diff --git a/docs/zh/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md similarity index 100% rename from docs/zh/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-10-why-end-to-end-testing-changes-results/code/architecture-rules.md diff --git a/docs/zh/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts b/courses/learn-harness-engineering/docs/zh/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts similarity index 100% rename from docs/zh/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-10-why-end-to-end-testing-changes-results/code/e2e-runner.ts diff --git a/docs/zh/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md similarity index 100% rename from docs/zh/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-10-why-end-to-end-testing-changes-results/code/index.md diff --git a/docs/zh/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md similarity index 100% rename from docs/zh/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-10-why-end-to-end-testing-changes-results/code/review-feedback-to-rule.md diff --git a/docs/zh/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md similarity index 100% rename from docs/zh/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-10-why-end-to-end-testing-changes-results/index.md diff --git a/docs/zh/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md similarity index 100% rename from docs/zh/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/evaluator-rubric.md diff --git a/docs/zh/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md similarity index 100% rename from docs/zh/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/index.md diff --git a/docs/zh/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts b/courses/learn-harness-engineering/docs/zh/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts similarity index 100% rename from docs/zh/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/runtime-logger.ts diff --git a/docs/zh/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md similarity index 100% rename from docs/zh/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-11-why-observability-belongs-inside-the-harness/code/sprint-contract.md diff --git a/docs/zh/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md similarity index 100% rename from docs/zh/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-11-why-observability-belongs-inside-the-harness/index.md diff --git a/docs/zh/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md similarity index 100% rename from docs/zh/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-comparison-template.md diff --git a/docs/zh/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts b/courses/learn-harness-engineering/docs/zh/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts similarity index 100% rename from docs/zh/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/benchmark-runner.ts diff --git a/docs/zh/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md similarity index 100% rename from docs/zh/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-loop.md diff --git a/docs/zh/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts b/courses/learn-harness-engineering/docs/zh/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts similarity index 100% rename from docs/zh/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/cleanup-scanner.ts diff --git a/docs/zh/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md similarity index 100% rename from docs/zh/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-12-why-every-session-must-leave-a-clean-state/code/index.md diff --git a/docs/zh/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md b/courses/learn-harness-engineering/docs/zh/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md similarity index 100% rename from docs/zh/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md rename to courses/learn-harness-engineering/docs/zh/lectures/lecture-12-why-every-session-must-leave-a-clean-state/index.md diff --git a/docs/zh/projects/index.md b/courses/learn-harness-engineering/docs/zh/projects/index.md similarity index 100% rename from docs/zh/projects/index.md rename to courses/learn-harness-engineering/docs/zh/projects/index.md diff --git a/docs/zh/projects/project-01-baseline-vs-minimal-harness/index.md b/courses/learn-harness-engineering/docs/zh/projects/project-01-baseline-vs-minimal-harness/index.md similarity index 100% rename from docs/zh/projects/project-01-baseline-vs-minimal-harness/index.md rename to courses/learn-harness-engineering/docs/zh/projects/project-01-baseline-vs-minimal-harness/index.md diff --git a/docs/zh/projects/project-02-agent-readable-workspace/index.md b/courses/learn-harness-engineering/docs/zh/projects/project-02-agent-readable-workspace/index.md similarity index 100% rename from docs/zh/projects/project-02-agent-readable-workspace/index.md rename to courses/learn-harness-engineering/docs/zh/projects/project-02-agent-readable-workspace/index.md diff --git a/docs/zh/projects/project-03-multi-session-continuity/index.md b/courses/learn-harness-engineering/docs/zh/projects/project-03-multi-session-continuity/index.md similarity index 100% rename from docs/zh/projects/project-03-multi-session-continuity/index.md rename to courses/learn-harness-engineering/docs/zh/projects/project-03-multi-session-continuity/index.md diff --git a/docs/zh/projects/project-04-incremental-indexing/index.md b/courses/learn-harness-engineering/docs/zh/projects/project-04-incremental-indexing/index.md similarity index 100% rename from docs/zh/projects/project-04-incremental-indexing/index.md rename to courses/learn-harness-engineering/docs/zh/projects/project-04-incremental-indexing/index.md diff --git a/docs/zh/projects/project-05-grounded-qa-verification/index.md b/courses/learn-harness-engineering/docs/zh/projects/project-05-grounded-qa-verification/index.md similarity index 100% rename from docs/zh/projects/project-05-grounded-qa-verification/index.md rename to courses/learn-harness-engineering/docs/zh/projects/project-05-grounded-qa-verification/index.md diff --git a/docs/zh/projects/project-06-runtime-observability-and-debugging/index.md b/courses/learn-harness-engineering/docs/zh/projects/project-06-runtime-observability-and-debugging/index.md similarity index 100% rename from docs/zh/projects/project-06-runtime-observability-and-debugging/index.md rename to courses/learn-harness-engineering/docs/zh/projects/project-06-runtime-observability-and-debugging/index.md diff --git a/docs/zh/resources/index.md b/courses/learn-harness-engineering/docs/zh/resources/index.md similarity index 100% rename from docs/zh/resources/index.md rename to courses/learn-harness-engineering/docs/zh/resources/index.md diff --git a/docs/zh/resources/openai-advanced/index.md b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/index.md similarity index 100% rename from docs/zh/resources/openai-advanced/index.md rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/index.md diff --git a/docs/zh/resources/openai-advanced/repo-template/AGENTS.md b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/AGENTS.md similarity index 100% rename from docs/zh/resources/openai-advanced/repo-template/AGENTS.md rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/AGENTS.md diff --git a/docs/zh/resources/openai-advanced/repo-template/ARCHITECTURE.md b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/ARCHITECTURE.md similarity index 100% rename from docs/zh/resources/openai-advanced/repo-template/ARCHITECTURE.md rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/ARCHITECTURE.md diff --git a/docs/zh/resources/openai-advanced/repo-template/docs/DESIGN.md b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/DESIGN.md similarity index 100% rename from docs/zh/resources/openai-advanced/repo-template/docs/DESIGN.md rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/DESIGN.md diff --git a/docs/zh/resources/openai-advanced/repo-template/docs/FRONTEND.md b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/FRONTEND.md similarity index 100% rename from docs/zh/resources/openai-advanced/repo-template/docs/FRONTEND.md rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/FRONTEND.md diff --git a/docs/zh/resources/openai-advanced/repo-template/docs/PLANS.md b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/PLANS.md similarity index 100% rename from docs/zh/resources/openai-advanced/repo-template/docs/PLANS.md rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/PLANS.md diff --git a/docs/zh/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md similarity index 100% rename from docs/zh/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/PRODUCT_SENSE.md diff --git a/docs/zh/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md similarity index 100% rename from docs/zh/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/QUALITY_SCORE.md diff --git a/docs/zh/resources/openai-advanced/repo-template/docs/RELIABILITY.md b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/RELIABILITY.md similarity index 100% rename from docs/zh/resources/openai-advanced/repo-template/docs/RELIABILITY.md rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/RELIABILITY.md diff --git a/docs/zh/resources/openai-advanced/repo-template/docs/SECURITY.md b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/SECURITY.md similarity index 100% rename from docs/zh/resources/openai-advanced/repo-template/docs/SECURITY.md rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/SECURITY.md diff --git a/docs/zh/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md similarity index 100% rename from docs/zh/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/design-docs/core-beliefs.md diff --git a/docs/zh/resources/openai-advanced/repo-template/docs/design-docs/index.md b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/design-docs/index.md similarity index 100% rename from docs/zh/resources/openai-advanced/repo-template/docs/design-docs/index.md rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/design-docs/index.md diff --git a/docs/zh/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md similarity index 100% rename from docs/zh/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/exec-plans/active/index.md diff --git a/docs/zh/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md similarity index 100% rename from docs/zh/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/exec-plans/completed/index.md diff --git a/docs/zh/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md similarity index 100% rename from docs/zh/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/exec-plans/tech-debt-tracker.md diff --git a/docs/zh/resources/openai-advanced/repo-template/docs/generated/db-schema.md b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/generated/db-schema.md similarity index 100% rename from docs/zh/resources/openai-advanced/repo-template/docs/generated/db-schema.md rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/generated/db-schema.md diff --git a/docs/zh/resources/openai-advanced/repo-template/docs/product-specs/index.md b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/product-specs/index.md similarity index 100% rename from docs/zh/resources/openai-advanced/repo-template/docs/product-specs/index.md rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/product-specs/index.md diff --git a/docs/zh/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md similarity index 100% rename from docs/zh/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/product-specs/new-user-onboarding.md diff --git a/docs/zh/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt similarity index 100% rename from docs/zh/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/references/design-system-reference-llms.txt diff --git a/docs/zh/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt similarity index 100% rename from docs/zh/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/references/nixpacks-llms.txt diff --git a/docs/zh/resources/openai-advanced/repo-template/docs/references/uv-llms.txt b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/references/uv-llms.txt similarity index 100% rename from docs/zh/resources/openai-advanced/repo-template/docs/references/uv-llms.txt rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/docs/references/uv-llms.txt diff --git a/docs/zh/resources/openai-advanced/repo-template/index.md b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/index.md similarity index 100% rename from docs/zh/resources/openai-advanced/repo-template/index.md rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/repo-template/index.md diff --git a/docs/zh/resources/openai-advanced/sops/chrome-devtools-validation-loop.md b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/sops/chrome-devtools-validation-loop.md similarity index 100% rename from docs/zh/resources/openai-advanced/sops/chrome-devtools-validation-loop.md rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/sops/chrome-devtools-validation-loop.md diff --git a/docs/zh/resources/openai-advanced/sops/encode-knowledge-into-repo.md b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/sops/encode-knowledge-into-repo.md similarity index 100% rename from docs/zh/resources/openai-advanced/sops/encode-knowledge-into-repo.md rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/sops/encode-knowledge-into-repo.md diff --git a/docs/zh/resources/openai-advanced/sops/index.md b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/sops/index.md similarity index 100% rename from docs/zh/resources/openai-advanced/sops/index.md rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/sops/index.md diff --git a/docs/zh/resources/openai-advanced/sops/layered-domain-architecture.md b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/sops/layered-domain-architecture.md similarity index 100% rename from docs/zh/resources/openai-advanced/sops/layered-domain-architecture.md rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/sops/layered-domain-architecture.md diff --git a/docs/zh/resources/openai-advanced/sops/observability-feedback-loop.md b/courses/learn-harness-engineering/docs/zh/resources/openai-advanced/sops/observability-feedback-loop.md similarity index 100% rename from docs/zh/resources/openai-advanced/sops/observability-feedback-loop.md rename to courses/learn-harness-engineering/docs/zh/resources/openai-advanced/sops/observability-feedback-loop.md diff --git a/docs/zh/resources/reference/coding-agent-startup-flow.md b/courses/learn-harness-engineering/docs/zh/resources/reference/coding-agent-startup-flow.md similarity index 100% rename from docs/zh/resources/reference/coding-agent-startup-flow.md rename to courses/learn-harness-engineering/docs/zh/resources/reference/coding-agent-startup-flow.md diff --git a/docs/zh/resources/reference/index.md b/courses/learn-harness-engineering/docs/zh/resources/reference/index.md similarity index 100% rename from docs/zh/resources/reference/index.md rename to courses/learn-harness-engineering/docs/zh/resources/reference/index.md diff --git a/docs/zh/resources/reference/initializer-agent-playbook.md b/courses/learn-harness-engineering/docs/zh/resources/reference/initializer-agent-playbook.md similarity index 100% rename from docs/zh/resources/reference/initializer-agent-playbook.md rename to courses/learn-harness-engineering/docs/zh/resources/reference/initializer-agent-playbook.md diff --git a/docs/zh/resources/reference/method-map.md b/courses/learn-harness-engineering/docs/zh/resources/reference/method-map.md similarity index 100% rename from docs/zh/resources/reference/method-map.md rename to courses/learn-harness-engineering/docs/zh/resources/reference/method-map.md diff --git a/docs/zh/resources/reference/prompt-calibration.md b/courses/learn-harness-engineering/docs/zh/resources/reference/prompt-calibration.md similarity index 100% rename from docs/zh/resources/reference/prompt-calibration.md rename to courses/learn-harness-engineering/docs/zh/resources/reference/prompt-calibration.md diff --git a/docs/zh/resources/templates/AGENTS.md b/courses/learn-harness-engineering/docs/zh/resources/templates/AGENTS.md similarity index 100% rename from docs/zh/resources/templates/AGENTS.md rename to courses/learn-harness-engineering/docs/zh/resources/templates/AGENTS.md diff --git a/docs/zh/resources/templates/CLAUDE.md b/courses/learn-harness-engineering/docs/zh/resources/templates/CLAUDE.md similarity index 100% rename from docs/zh/resources/templates/CLAUDE.md rename to courses/learn-harness-engineering/docs/zh/resources/templates/CLAUDE.md diff --git a/docs/zh/resources/templates/claude-progress.md b/courses/learn-harness-engineering/docs/zh/resources/templates/claude-progress.md similarity index 100% rename from docs/zh/resources/templates/claude-progress.md rename to courses/learn-harness-engineering/docs/zh/resources/templates/claude-progress.md diff --git a/docs/zh/resources/templates/clean-state-checklist.md b/courses/learn-harness-engineering/docs/zh/resources/templates/clean-state-checklist.md similarity index 100% rename from docs/zh/resources/templates/clean-state-checklist.md rename to courses/learn-harness-engineering/docs/zh/resources/templates/clean-state-checklist.md diff --git a/docs/zh/resources/templates/evaluator-rubric.md b/courses/learn-harness-engineering/docs/zh/resources/templates/evaluator-rubric.md similarity index 100% rename from docs/zh/resources/templates/evaluator-rubric.md rename to courses/learn-harness-engineering/docs/zh/resources/templates/evaluator-rubric.md diff --git a/docs/zh/resources/templates/feature_list.json b/courses/learn-harness-engineering/docs/zh/resources/templates/feature_list.json similarity index 100% rename from docs/zh/resources/templates/feature_list.json rename to courses/learn-harness-engineering/docs/zh/resources/templates/feature_list.json diff --git a/docs/zh/resources/templates/index.md b/courses/learn-harness-engineering/docs/zh/resources/templates/index.md similarity index 100% rename from docs/zh/resources/templates/index.md rename to courses/learn-harness-engineering/docs/zh/resources/templates/index.md diff --git a/docs/zh/resources/templates/init.sh b/courses/learn-harness-engineering/docs/zh/resources/templates/init.sh similarity index 100% rename from docs/zh/resources/templates/init.sh rename to courses/learn-harness-engineering/docs/zh/resources/templates/init.sh diff --git a/docs/zh/resources/templates/quality-document.md b/courses/learn-harness-engineering/docs/zh/resources/templates/quality-document.md similarity index 100% rename from docs/zh/resources/templates/quality-document.md rename to courses/learn-harness-engineering/docs/zh/resources/templates/quality-document.md diff --git a/docs/zh/resources/templates/session-handoff.md b/courses/learn-harness-engineering/docs/zh/resources/templates/session-handoff.md similarity index 100% rename from docs/zh/resources/templates/session-handoff.md rename to courses/learn-harness-engineering/docs/zh/resources/templates/session-handoff.md diff --git a/docs/zh/skills/index.md b/courses/learn-harness-engineering/docs/zh/skills/index.md similarity index 100% rename from docs/zh/skills/index.md rename to courses/learn-harness-engineering/docs/zh/skills/index.md diff --git a/docs/.vitepress/active-course.mjs b/docs/.vitepress/active-course.mjs index 2d982ea1..f2153c33 100644 --- a/docs/.vitepress/active-course.mjs +++ b/docs/.vitepress/active-course.mjs @@ -1,5 +1,9 @@ import courseManifest from "../../courses/learn-harness-engineering/course.manifest.mjs"; export const ACTIVE_COURSE_SLUG = "learn-harness-engineering"; +export const ACTIVE_COURSE_CONTENT_DIR = + "../courses/learn-harness-engineering/docs"; +export const ACTIVE_COURSE_REPO_CONTENT_PREFIX = + "courses/learn-harness-engineering/docs"; export default courseManifest; diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index bf8afd89..4c59fbc6 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -4,8 +4,12 @@ import { withMermaid } from "vitepress-plugin-mermaid"; import courseConfig from "./course.config.mjs"; import { buildFontStylesheetLinks, - buildMermaidThemeVariables + buildMermaidThemeVariables, } from "./course-branding.mjs"; +import { + ACTIVE_COURSE_CONTENT_DIR, + ACTIVE_COURSE_REPO_CONTENT_PREFIX, +} from "./active-course.mjs"; import { getLocaleSourceItems } from "./course-curriculum.mjs"; import { getLocaleEntries } from "./course-locales.mjs"; import { createLocaleDefinition } from "./course-navigation.mjs"; @@ -32,13 +36,15 @@ const locales = Object.fromEntries( lang: entry.lang, sourceItems: getLocaleSourceItems(entry.key), labels: entry.labels, - repoTreeUrl: githubRepoTreeLink - }) - ]) + repoTreeUrl: githubRepoTreeLink, + repoContentPrefix: ACTIVE_COURSE_REPO_CONTENT_PREFIX, + }), + ]), ); export default withMermaid( defineConfig({ + srcDir: ACTIVE_COURSE_CONTENT_DIR, base: docsBase, title: courseConfig.site.title, description: courseConfig.site.description, @@ -47,20 +53,20 @@ export default withMermaid( ignoreDeadLinks: true, head: [ ...fontStylesheetLinks, - ["link", { rel: "icon", type: "image/svg+xml", href: brandLogo }] + ["link", { rel: "icon", type: "image/svg+xml", href: brandLogo }], ], themeConfig: { logo: brandLogo, search: { - provider: "local" + provider: "local", }, - socialLinks: [{ icon: "github", link: githubRepoTreeLink }] + socialLinks: [{ icon: "github", link: githubRepoTreeLink }], }, markdown: { theme: { light: "github-light", - dark: "github-dark" - } + dark: "github-dark", + }, }, mermaid: { theme: "base", @@ -68,9 +74,9 @@ export default withMermaid( flowchart: { nodeSpacing: 40, rankSpacing: 56, - padding: 12 - } + padding: 12, + }, }, - locales - }) + locales, + }), ); diff --git a/docs/.vitepress/course-branding.mjs b/docs/.vitepress/course-branding.mjs index b5546221..8f93f6aa 100644 --- a/docs/.vitepress/course-branding.mjs +++ b/docs/.vitepress/course-branding.mjs @@ -3,8 +3,8 @@ export function buildFontStylesheetLinks(courseConfig) { "link", { rel: "stylesheet", - href - } + href, + }, ]); } @@ -17,7 +17,7 @@ export function buildMermaidThemeVariables(courseConfig) { primaryTextColor: light.text1, lineColor: light.text3, fontFamily: courseConfig.theme.typography.mermaid, - fontSize: "18px" + fontSize: "18px", }; } @@ -60,6 +60,6 @@ export function buildCourseCssTokens(courseConfig) { "--course-dark-brand-soft": colors.dark.brandSoft, "--course-dark-divider": colors.dark.divider, "--course-dark-sidebar-bg": colors.dark.sidebarBg, - "--course-dark-nav-bg": colors.dark.navBg + "--course-dark-nav-bg": colors.dark.navBg, }; } diff --git a/docs/.vitepress/course-navigation.mjs b/docs/.vitepress/course-navigation.mjs index 2fc56804..5c23b86d 100644 --- a/docs/.vitepress/course-navigation.mjs +++ b/docs/.vitepress/course-navigation.mjs @@ -3,7 +3,7 @@ const LOCALE_PREFIX_PATTERN = /^\/(en|zh|vi|ko|uz|ru|ja|es|fr|de|ar|zh-TW)\//; export function relinkItems(items, locale) { return items.map((item) => ({ ...item, - link: item.link.replace(LOCALE_PREFIX_PATTERN, `/${locale}/`) + link: item.link.replace(LOCALE_PREFIX_PATTERN, `/${locale}/`), })); } @@ -11,7 +11,8 @@ export function buildLocaleThemeConfig({ locale, sourceItems, labels, - repoTreeUrl + repoTreeUrl, + repoContentPrefix = "docs", }) { const lectures = relinkItems(sourceItems.lectures, locale); const projects = relinkItems(sourceItems.projects, locale); @@ -20,40 +21,59 @@ export function buildLocaleThemeConfig({ return { nav: [ - { text: labels.lectures, link: lectures[1].link, activeMatch: `^/${locale}/(lectures/.*)?$` }, - { text: labels.projects, link: projects[0].link, activeMatch: `^/${locale}/projects/` }, - { text: labels.resources, link: `/${locale}/resources/`, activeMatch: `^/${locale}/resources/` }, - { text: labels.skills, link: `/${locale}/skills/`, activeMatch: `^/${locale}/skills/` }, + { + text: labels.lectures, + link: lectures[1].link, + activeMatch: `^/${locale}/(lectures/.*)?$`, + }, + { + text: labels.projects, + link: projects[0].link, + activeMatch: `^/${locale}/projects/`, + }, + { + text: labels.resources, + link: `/${locale}/resources/`, + activeMatch: `^/${locale}/resources/`, + }, + { + text: labels.skills, + link: `/${locale}/skills/`, + activeMatch: `^/${locale}/skills/`, + }, { text: labels.tryHarness, - link: `${repoTreeUrl.replace(/\/tree\/main$/, "/blob/main")}/docs/${locale}/resources/templates/index.md`, + link: `${repoTreeUrl.replace(/\/tree\/main$/, "/blob/main")}/${repoContentPrefix}/${locale}/resources/templates/index.md`, target: "_blank", - rel: "noopener noreferrer" - } + rel: "noopener noreferrer", + }, ], sidebar: { [`/${locale}/projects/`]: [{ text: labels.projects, items: projects }], - [`/${locale}/resources/`]: [{ text: labels.resourceLibrary, items: resources }], + [`/${locale}/resources/`]: [ + { text: labels.resourceLibrary, items: resources }, + ], [`/${locale}/skills/`]: [{ text: labels.skills, items: skills }], - [`/${locale}/`]: [{ text: labels.lectures, items: lectures }] + [`/${locale}/`]: [{ text: labels.lectures, items: lectures }], }, outline: { level: [2, 3], - ...(labels.outline ? { label: labels.outline } : {}) + ...(labels.outline ? { label: labels.outline } : {}), }, docFooter: { prev: labels.prev || "Previous", - next: labels.next || "Next" + next: labels.next || "Next", }, lastUpdated: { - text: labels.lastUpdated || "Last updated" + text: labels.lastUpdated || "Last updated", }, returnToTopLabel: labels.returnToTop || "Return to top", sidebarMenuLabel: labels.sidebarMenu || "Menu", darkModeSwitchLabel: labels.darkModeSwitch || "Theme", - lightModeSwitchTitle: labels.lightModeSwitchTitle || "Switch to light theme", + lightModeSwitchTitle: + labels.lightModeSwitchTitle || "Switch to light theme", darkModeSwitchTitle: labels.darkModeSwitchTitle || "Switch to dark theme", - socialLinks: [{ icon: "github", link: repoTreeUrl }] + socialLinks: [{ icon: "github", link: repoTreeUrl }], }; } @@ -63,7 +83,8 @@ export function createLocaleDefinition({ lang, sourceItems, labels, - repoTreeUrl + repoTreeUrl, + repoContentPrefix, }) { return { label, @@ -73,7 +94,8 @@ export function createLocaleDefinition({ locale, sourceItems, labels, - repoTreeUrl - }) + repoTreeUrl, + repoContentPrefix, + }), }; } diff --git a/docs/.vitepress/course.config.mjs b/docs/.vitepress/course.config.mjs index b26df37d..649bb390 100644 --- a/docs/.vitepress/course.config.mjs +++ b/docs/.vitepress/course.config.mjs @@ -3,5 +3,5 @@ import courseManifest from "./course.manifest.mjs"; export default { site: courseManifest.site, brand: courseManifest.brand, - theme: courseManifest.theme + theme: courseManifest.theme, }; diff --git a/docs/.vitepress/theme/components/CourseHome.vue b/docs/.vitepress/theme/components/CourseHome.vue index adecb32a..71433d92 100644 --- a/docs/.vitepress/theme/components/CourseHome.vue +++ b/docs/.vitepress/theme/components/CourseHome.vue @@ -34,7 +34,12 @@ const content = computed(() => getCourseHome(locale.value));

{{ content.startText }}

- +

{{ card.title }}

{{ card.body }}

@@ -55,7 +60,8 @@ const content = computed(() => getCourseHome(locale.value));

{{ content.nextIntro }}

diff --git a/docs/.vitepress/theme/index.js b/docs/.vitepress/theme/index.js index 3bfacc2d..2999d9b8 100644 --- a/docs/.vitepress/theme/index.js +++ b/docs/.vitepress/theme/index.js @@ -1,95 +1,97 @@ -import DefaultTheme from 'vitepress/theme' -import courseConfig from '../course.config.mjs' -import { buildCourseCssTokens } from '../course-branding.mjs' -import CourseHome from './components/CourseHome.vue' -import './style.css' - -let rootEnglishLabel = 'English' -let mermaidViewer -let mermaidViewerBody -let mermaidViewerStage -let mermaidObserver -let mermaidViewerUrl -let mermaidViewerImage -let mermaidViewerNaturalWidth = 0 -let mermaidViewerNaturalHeight = 0 -let mermaidViewerFitScale = 1 -let mermaidViewerScale = 1 +import DefaultTheme from "vitepress/theme"; +import courseConfig from "../course.config.mjs"; +import { buildCourseCssTokens } from "../course-branding.mjs"; +import CourseHome from "./components/CourseHome.vue"; +import "./style.css"; + +let rootEnglishLabel = "English"; +let mermaidViewer; +let mermaidViewerBody; +let mermaidViewerStage; +let mermaidObserver; +let mermaidViewerUrl; +let mermaidViewerNaturalWidth = 0; +let mermaidViewerNaturalHeight = 0; +let mermaidViewerFitScale = 1; +let mermaidViewerScale = 1; function applyCourseBranding() { - if (typeof document === 'undefined') return + if (typeof document === "undefined") return; - const root = document.documentElement - const tokens = buildCourseCssTokens(courseConfig) + const root = document.documentElement; + const tokens = buildCourseCssTokens(courseConfig); for (const [name, value] of Object.entries(tokens)) { - root.style.setProperty(name, value) + root.style.setProperty(name, value); } } function dedupeLocaleMenuLinks() { - if (typeof document === 'undefined') return + if (typeof document === "undefined") return; const containers = document.querySelectorAll( - '.VPNavBarTranslations .items, .VPNavBarExtra .group.translations, .VPNavScreenTranslations .list' - ) + ".VPNavBarTranslations .items, .VPNavBarExtra .group.translations, .VPNavScreenTranslations .list", + ); for (const container of containers) { - const seen = new Set() - const links = container.querySelectorAll('a[href]') + const seen = new Set(); + const links = container.querySelectorAll("a[href]"); for (const link of links) { - const label = link.textContent?.trim() || '' - const href = link.getAttribute('href') || '' - const key = `${label}::${href}` + const label = link.textContent?.trim() || ""; + const href = link.getAttribute("href") || ""; + const key = `${label}::${href}`; if (seen.has(key)) { - const removable = link.closest('.VPMenuLink, .item') - removable?.remove() - continue + const removable = link.closest(".VPMenuLink, .item"); + removable?.remove(); + continue; } - seen.add(key) + seen.add(key); } } } function queueLocaleMenuDedupe() { - if (typeof window === 'undefined') return + if (typeof window === "undefined") return; window.requestAnimationFrame(() => { window.requestAnimationFrame(() => { - dedupeLocaleMenuLinks() - }) - }) + dedupeLocaleMenuLinks(); + }); + }); } -function syncRootLocaleLabel(siteData, href = '') { - const locales = siteData.value?.locales - if (!locales?.root || !locales?.zh) return +function syncRootLocaleLabel(siteData, href = "") { + const locales = siteData.value?.locales; + if (!locales?.root || !locales?.zh) return; if (locales.root.label && locales.root.label !== locales.zh.label) { - rootEnglishLabel = locales.root.label + rootEnglishLabel = locales.root.label; } if (locales.en?.label) { - rootEnglishLabel = locales.en.label + rootEnglishLabel = locales.en.label; } - const base = siteData.value.base || '/' - const normalized = href || (typeof window !== 'undefined' ? window.location.pathname : '') + const base = siteData.value.base || "/"; + const normalized = + href || (typeof window !== "undefined" ? window.location.pathname : ""); const relative = normalized.startsWith(base) ? normalized.slice(base.length - 1) - : normalized + : normalized; - locales.root.label = relative.startsWith('/zh/') ? locales.zh.label : rootEnglishLabel + locales.root.label = relative.startsWith("/zh/") + ? locales.zh.label + : rootEnglishLabel; } function ensureMermaidViewer() { - if (typeof document === 'undefined') return - if (mermaidViewer && mermaidViewerBody && mermaidViewerStage) return + if (typeof document === "undefined") return; + if (mermaidViewer && mermaidViewerBody && mermaidViewerStage) return; - mermaidViewer = document.createElement('div') - mermaidViewer.className = 'mermaid-viewer' + mermaidViewer = document.createElement("div"); + mermaidViewer.className = "mermaid-viewer"; mermaidViewer.innerHTML = `
- ` + `; - mermaidViewerBody = mermaidViewer.querySelector('.mermaid-viewer__body') - mermaidViewerStage = mermaidViewer.querySelector('.mermaid-viewer__stage') + mermaidViewerBody = mermaidViewer.querySelector(".mermaid-viewer__body"); + mermaidViewerStage = mermaidViewer.querySelector(".mermaid-viewer__stage"); - mermaidViewer.addEventListener('click', (event) => { - const target = event.target - if (!(target instanceof HTMLElement)) return + mermaidViewer.addEventListener("click", (event) => { + const target = event.target; + if (!(target instanceof HTMLElement)) return; if ( - target.dataset.mermaidClose === 'true' || + target.dataset.mermaidClose === "true" || target === mermaidViewerBody || target === mermaidViewerStage ) { - closeMermaidViewer() - return + closeMermaidViewer(); + return; } - const action = target.dataset.mermaidAction - if (action === 'zoom-in') { - setMermaidViewerScale(mermaidViewerScale + 0.2) - } else if (action === 'zoom-out') { - setMermaidViewerScale(mermaidViewerScale - 0.2) - } else if (action === 'reset') { - setMermaidViewerScale(1) + const action = target.dataset.mermaidAction; + if (action === "zoom-in") { + setMermaidViewerScale(mermaidViewerScale + 0.2); + } else if (action === "zoom-out") { + setMermaidViewerScale(mermaidViewerScale - 0.2); + } else if (action === "reset") { + setMermaidViewerScale(1); } - }) - - document.addEventListener('keydown', (event) => { - if (event.key === 'Escape' && mermaidViewer?.classList.contains('is-open')) { - closeMermaidViewer() - } else if ((event.key === '+' || event.key === '=') && mermaidViewer?.classList.contains('is-open')) { - setMermaidViewerScale(mermaidViewerScale + 0.2) - } else if (event.key === '-' && mermaidViewer?.classList.contains('is-open')) { - setMermaidViewerScale(mermaidViewerScale - 0.2) + }); + + document.addEventListener("keydown", (event) => { + if ( + event.key === "Escape" && + mermaidViewer?.classList.contains("is-open") + ) { + closeMermaidViewer(); + } else if ( + (event.key === "+" || event.key === "=") && + mermaidViewer?.classList.contains("is-open") + ) { + setMermaidViewerScale(mermaidViewerScale + 0.2); + } else if ( + event.key === "-" && + mermaidViewer?.classList.contains("is-open") + ) { + setMermaidViewerScale(mermaidViewerScale - 0.2); } - }) - - mermaidViewerBody?.addEventListener('wheel', (event) => { - if (!mermaidViewer?.classList.contains('is-open')) return - event.preventDefault() - const delta = event.deltaY < 0 ? 0.12 : -0.12 - setMermaidViewerScale(mermaidViewerScale + delta) - }, { passive: false }) - - window.addEventListener('resize', () => { - if (mermaidViewer?.classList.contains('is-open')) { - updateMermaidViewerFitScale() - setMermaidViewerScale(mermaidViewerScale) + }); + + mermaidViewerBody?.addEventListener( + "wheel", + (event) => { + if (!mermaidViewer?.classList.contains("is-open")) return; + event.preventDefault(); + const delta = event.deltaY < 0 ? 0.12 : -0.12; + setMermaidViewerScale(mermaidViewerScale + delta); + }, + { passive: false }, + ); + + window.addEventListener("resize", () => { + if (mermaidViewer?.classList.contains("is-open")) { + updateMermaidViewerFitScale(); + setMermaidViewerScale(mermaidViewerScale); } - }) + }); - document.body.appendChild(mermaidViewer) + document.body.appendChild(mermaidViewer); } function serializeMermaidSvg(svg) { - const clone = svg.cloneNode(true) - if (!(clone instanceof SVGElement)) return null + const clone = svg.cloneNode(true); + if (!(clone instanceof SVGElement)) return null; - if (!clone.getAttribute('xmlns')) { - clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg') + if (!clone.getAttribute("xmlns")) { + clone.setAttribute("xmlns", "http://www.w3.org/2000/svg"); } - if (!clone.getAttribute('xmlns:xlink')) { - clone.setAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink') + if (!clone.getAttribute("xmlns:xlink")) { + clone.setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink"); } - const rect = svg.getBoundingClientRect() - const viewBox = svg.viewBox?.baseVal - const rawWidth = rect.width || viewBox?.width || Number.parseFloat(svg.getAttribute('width') || '') || 1200 - const rawHeight = rect.height || viewBox?.height || Number.parseFloat(svg.getAttribute('height') || '') || 800 - - if (!clone.getAttribute('viewBox')) { - clone.setAttribute('viewBox', `0 0 ${Math.max(1, Math.round(rawWidth))} ${Math.max(1, Math.round(rawHeight))}`) + const rect = svg.getBoundingClientRect(); + const viewBox = svg.viewBox?.baseVal; + const rawWidth = + rect.width || + viewBox?.width || + Number.parseFloat(svg.getAttribute("width") || "") || + 1200; + const rawHeight = + rect.height || + viewBox?.height || + Number.parseFloat(svg.getAttribute("height") || "") || + 800; + + if (!clone.getAttribute("viewBox")) { + clone.setAttribute( + "viewBox", + `0 0 ${Math.max(1, Math.round(rawWidth))} ${Math.max(1, Math.round(rawHeight))}`, + ); } - clone.setAttribute('width', String(Math.max(1, Math.round(rawWidth)))) - clone.setAttribute('height', String(Math.max(1, Math.round(rawHeight)))) + clone.setAttribute("width", String(Math.max(1, Math.round(rawWidth)))); + clone.setAttribute("height", String(Math.max(1, Math.round(rawHeight)))); return { markup: new XMLSerializer().serializeToString(clone), width: Math.max(1, rawWidth), - height: Math.max(1, rawHeight) - } + height: Math.max(1, rawHeight), + }; } function updateMermaidViewerFitScale() { - if (!mermaidViewerNaturalWidth || !mermaidViewerNaturalHeight || typeof window === 'undefined') return + if ( + !mermaidViewerNaturalWidth || + !mermaidViewerNaturalHeight || + typeof window === "undefined" + ) + return; - const maxWidth = Math.max(320, window.innerWidth - 16) - const maxHeight = Math.max(240, window.innerHeight - 16) + const maxWidth = Math.max(320, window.innerWidth - 16); + const maxHeight = Math.max(240, window.innerHeight - 16); mermaidViewerFitScale = Math.max( 0.25, - Math.min(maxWidth / mermaidViewerNaturalWidth, maxHeight / mermaidViewerNaturalHeight) - ) + Math.min( + maxWidth / mermaidViewerNaturalWidth, + maxHeight / mermaidViewerNaturalHeight, + ), + ); } function setMermaidViewerScale(nextScale) { - if (!mermaidViewerStage || !mermaidViewerNaturalWidth || !mermaidViewerNaturalHeight) return + if ( + !mermaidViewerStage || + !mermaidViewerNaturalWidth || + !mermaidViewerNaturalHeight + ) + return; - mermaidViewerScale = Math.max(0.5, Math.min(nextScale, 4)) + mermaidViewerScale = Math.max(0.5, Math.min(nextScale, 4)); - const width = mermaidViewerNaturalWidth * mermaidViewerFitScale * mermaidViewerScale - const height = mermaidViewerNaturalHeight * mermaidViewerFitScale * mermaidViewerScale + const width = + mermaidViewerNaturalWidth * mermaidViewerFitScale * mermaidViewerScale; + const height = + mermaidViewerNaturalHeight * mermaidViewerFitScale * mermaidViewerScale; - mermaidViewerStage.style.width = `${width}px` - mermaidViewerStage.style.height = `${height}px` + mermaidViewerStage.style.width = `${width}px`; + mermaidViewerStage.style.height = `${height}px`; - const resetButton = mermaidViewer?.querySelector('[data-mermaid-action="reset"]') + const resetButton = mermaidViewer?.querySelector( + '[data-mermaid-action="reset"]', + ); if (resetButton instanceof HTMLElement) { - resetButton.textContent = `${Math.round(mermaidViewerScale * 100)}%` + resetButton.textContent = `${Math.round(mermaidViewerScale * 100)}%`; } } function openMermaidViewer(diagram) { - ensureMermaidViewer() - if (!mermaidViewerBody || !mermaidViewer || !mermaidViewerStage) return + ensureMermaidViewer(); + if (!mermaidViewerBody || !mermaidViewer || !mermaidViewerStage) return; - const svg = diagram.querySelector('svg') - if (!svg) return + const svg = diagram.querySelector("svg"); + if (!svg) return; if (mermaidViewerUrl) { - URL.revokeObjectURL(mermaidViewerUrl) - mermaidViewerUrl = undefined + URL.revokeObjectURL(mermaidViewerUrl); + mermaidViewerUrl = undefined; } - const serialized = serializeMermaidSvg(svg) - if (!serialized) return - - const blob = new Blob([serialized.markup], { type: 'image/svg+xml;charset=utf-8' }) - mermaidViewerUrl = URL.createObjectURL(blob) - - const image = document.createElement('img') - image.className = 'mermaid-viewer__image' - image.alt = 'Expanded Mermaid diagram' - image.src = mermaidViewerUrl - image.addEventListener('load', () => { - mermaidViewerNaturalWidth = serialized.width - mermaidViewerNaturalHeight = serialized.height - updateMermaidViewerFitScale() - setMermaidViewerScale(1) + const serialized = serializeMermaidSvg(svg); + if (!serialized) return; + + const blob = new Blob([serialized.markup], { + type: "image/svg+xml;charset=utf-8", + }); + mermaidViewerUrl = URL.createObjectURL(blob); + + const image = document.createElement("img"); + image.className = "mermaid-viewer__image"; + image.alt = "Expanded Mermaid diagram"; + image.src = mermaidViewerUrl; + image.addEventListener("load", () => { + mermaidViewerNaturalWidth = serialized.width; + mermaidViewerNaturalHeight = serialized.height; + updateMermaidViewerFitScale(); + setMermaidViewerScale(1); if (mermaidViewerBody) { - mermaidViewerBody.scrollTo({ top: 0, left: 0 }) + mermaidViewerBody.scrollTo({ top: 0, left: 0 }); } - }) + }); - mermaidViewerImage = image - mermaidViewerStage.replaceChildren(image) - mermaidViewer.classList.add('is-open') - document.documentElement.classList.add('has-mermaid-viewer') + mermaidViewerStage.replaceChildren(image); + mermaidViewer.classList.add("is-open"); + document.documentElement.classList.add("has-mermaid-viewer"); } function closeMermaidViewer() { - if (!mermaidViewer || !mermaidViewerBody || !mermaidViewerStage) return - mermaidViewer.classList.remove('is-open') - mermaidViewerStage.replaceChildren() - mermaidViewerStage.style.width = '' - mermaidViewerStage.style.height = '' + if (!mermaidViewer || !mermaidViewerBody || !mermaidViewerStage) return; + mermaidViewer.classList.remove("is-open"); + mermaidViewerStage.replaceChildren(); + mermaidViewerStage.style.width = ""; + mermaidViewerStage.style.height = ""; if (mermaidViewerUrl) { - URL.revokeObjectURL(mermaidViewerUrl) - mermaidViewerUrl = undefined + URL.revokeObjectURL(mermaidViewerUrl); + mermaidViewerUrl = undefined; } - mermaidViewerImage = undefined - mermaidViewerNaturalWidth = 0 - mermaidViewerNaturalHeight = 0 - mermaidViewerFitScale = 1 - mermaidViewerScale = 1 - document.documentElement.classList.remove('has-mermaid-viewer') + mermaidViewerNaturalWidth = 0; + mermaidViewerNaturalHeight = 0; + mermaidViewerFitScale = 1; + mermaidViewerScale = 1; + document.documentElement.classList.remove("has-mermaid-viewer"); } function bindMermaidZoomables(root = document) { - if (typeof document === 'undefined') return - ensureMermaidViewer() + if (typeof document === "undefined") return; + ensureMermaidViewer(); - const diagrams = root.querySelectorAll('.vp-doc .mermaid') + const diagrams = root.querySelectorAll(".vp-doc .mermaid"); for (const diagram of diagrams) { - if (!(diagram instanceof HTMLElement) || diagram.dataset.mermaidZoomBound === 'true') { - continue + if ( + !(diagram instanceof HTMLElement) || + diagram.dataset.mermaidZoomBound === "true" + ) { + continue; } - diagram.dataset.mermaidZoomBound = 'true' - diagram.tabIndex = 0 - diagram.setAttribute('role', 'button') - diagram.setAttribute('aria-label', 'Open Mermaid diagram in fullscreen') + diagram.dataset.mermaidZoomBound = "true"; + diagram.tabIndex = 0; + diagram.setAttribute("role", "button"); + diagram.setAttribute("aria-label", "Open Mermaid diagram in fullscreen"); - diagram.addEventListener('click', () => { - openMermaidViewer(diagram) - }) + diagram.addEventListener("click", () => { + openMermaidViewer(diagram); + }); - diagram.addEventListener('keydown', (event) => { - if (event.key === 'Enter' || event.key === ' ') { - event.preventDefault() - openMermaidViewer(diagram) + diagram.addEventListener("keydown", (event) => { + if (event.key === "Enter" || event.key === " ") { + event.preventDefault(); + openMermaidViewer(diagram); } - }) + }); } } function queueMermaidBinding() { - if (typeof window === 'undefined') return + if (typeof window === "undefined") return; window.requestAnimationFrame(() => { window.requestAnimationFrame(() => { - bindMermaidZoomables() - }) - }) + bindMermaidZoomables(); + }); + }); } function ensureMermaidObserver() { - if (typeof document === 'undefined' || mermaidObserver) return + if (typeof document === "undefined" || mermaidObserver) return; mermaidObserver = new MutationObserver(() => { - bindMermaidZoomables() - }) + bindMermaidZoomables(); + }); mermaidObserver.observe(document.body, { childList: true, - subtree: true - }) + subtree: true, + }); } export default { extends: DefaultTheme, enhanceApp(ctx) { - ctx.app.component('CourseHome', CourseHome) - applyCourseBranding() - syncRootLocaleLabel(ctx.siteData) - queueLocaleMenuDedupe() - queueMermaidBinding() - ensureMermaidObserver() - - const previous = ctx.router.onAfterRouteChange + ctx.app.component("CourseHome", CourseHome); + applyCourseBranding(); + syncRootLocaleLabel(ctx.siteData); + queueLocaleMenuDedupe(); + queueMermaidBinding(); + ensureMermaidObserver(); + + const previous = ctx.router.onAfterRouteChange; ctx.router.onAfterRouteChange = async (to) => { - applyCourseBranding() - syncRootLocaleLabel(ctx.siteData, to) - queueLocaleMenuDedupe() - closeMermaidViewer() - queueMermaidBinding() + applyCourseBranding(); + syncRootLocaleLabel(ctx.siteData, to); + queueLocaleMenuDedupe(); + closeMermaidViewer(); + queueMermaidBinding(); if (previous) { - await previous(to) + await previous(to); } - } - } -} + }; + }, +}; diff --git a/docs/.vitepress/theme/style.css b/docs/.vitepress/theme/style.css index ebf36468..04f9f0b8 100644 --- a/docs/.vitepress/theme/style.css +++ b/docs/.vitepress/theme/style.css @@ -2,42 +2,47 @@ /* ---------- CSS Variables (Light) ---------- */ :root { - --course-light-bg: #FAF9F5; - --course-light-bg-alt: #F4F3EE; - --course-light-bg-elv: #FFFFFF; - --course-light-bg-soft: #F4F3EE; - --course-light-text-1: #1A1A1A; - --course-light-text-2: #4A4A4A; + --course-light-bg: #faf9f5; + --course-light-bg-alt: #f4f3ee; + --course-light-bg-elv: #ffffff; + --course-light-bg-soft: #f4f3ee; + --course-light-text-1: #1a1a1a; + --course-light-text-2: #4a4a4a; --course-light-text-3: #757575; - --course-light-brand-1: #D95C41; - --course-light-brand-2: #C14E36; - --course-light-brand-3: #A8412B; + --course-light-brand-1: #d95c41; + --course-light-brand-2: #c14e36; + --course-light-brand-3: #a8412b; --course-light-brand-soft: rgba(217, 92, 65, 0.1); --course-light-divider: rgba(0, 0, 0, 0.08); - --course-light-sidebar-bg: #F4F3EE; - --course-light-nav-bg: #FAF9F5; - --course-dark-bg: #1A1A1A; + --course-light-sidebar-bg: #f4f3ee; + --course-light-nav-bg: #faf9f5; + --course-dark-bg: #1a1a1a; --course-dark-bg-alt: #141414; --course-dark-bg-elv: #242424; --course-dark-bg-soft: #141414; - --course-dark-text-1: #E5E5E5; - --course-dark-text-2: #B3B3B3; + --course-dark-text-1: #e5e5e5; + --course-dark-text-2: #b3b3b3; --course-dark-text-3: #808080; - --course-dark-brand-1: #E07A64; - --course-dark-brand-2: #D95C41; - --course-dark-brand-3: #C14E36; + --course-dark-brand-1: #e07a64; + --course-dark-brand-2: #d95c41; + --course-dark-brand-3: #c14e36; --course-dark-brand-soft: rgba(224, 122, 100, 0.15); --course-dark-divider: rgba(255, 255, 255, 0.1); --course-dark-sidebar-bg: #141414; - --course-dark-nav-bg: #1A1A1A; + --course-dark-nav-bg: #1a1a1a; --course-layout-max-width: 1376px; --course-sidebar-width: 296px; --course-card-radius: 12px; --course-feature-shadow: 0 18px 48px rgba(217, 92, 65, 0.12); --course-feature-shadow-dark: 0 18px 48px rgba(0, 0, 0, 0.35); - --course-font-body: 'Instrument Sans', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; - --course-font-heading: 'Fraunces', ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; - --course-font-mono: 'JetBrains Mono', 'Fira Code', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + --course-font-body: + "Instrument Sans", ui-sans-serif, system-ui, -apple-system, + BlinkMacSystemFont, "Segoe UI", sans-serif; + --course-font-heading: + "Fraunces", ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; + --course-font-mono: + "JetBrains Mono", "Fira Code", ui-monospace, SFMono-Regular, Menlo, + Consolas, monospace; --vp-c-bg: var(--course-light-bg); --vp-c-bg-alt: var(--course-light-bg-alt); --vp-c-bg-elv: var(--course-light-bg-elv); @@ -142,14 +147,14 @@ font-size: 0.9em; } -.vp-doc div[class*='language-'] { +.vp-doc div[class*="language-"] { border-radius: 12px; margin: 16px 0; border: 1px solid var(--vp-c-divider); background-color: var(--vp-c-bg-elv); } -.vp-doc div[class*='language-'] button.copy { +.vp-doc div[class*="language-"] button.copy { background-color: var(--vp-c-bg-soft); border: 1px solid var(--vp-c-divider); border-radius: 6px; @@ -165,7 +170,8 @@ } /* ---------- Lists ---------- */ -.vp-doc ul, .vp-doc ol { +.vp-doc ul, +.vp-doc ol { padding-left: 1.25rem; } @@ -212,7 +218,10 @@ .VPFeature { border-radius: var(--course-card-radius) !important; border: 1px solid var(--vp-c-divider) !important; - transition: border-color 0.25s, box-shadow 0.25s, transform 0.25s !important; + transition: + border-color 0.25s, + box-shadow 0.25s, + transform 0.25s !important; padding: 20px 24px !important; } @@ -250,7 +259,9 @@ position: relative; align-items: flex-start; border-radius: 8px !important; - transition: background-color 0.2s, color 0.2s; + transition: + background-color 0.2s, + color 0.2s; color: var(--vp-c-text-2) !important; font-size: 0.9rem; padding: 8px 12px !important; @@ -411,8 +422,8 @@ /* Nav Action Button (Try Harness) */ .VPNavBarMenuLink[href*="/blob/main/docs/"] { - background-color: #1A1A1A !important; - color: #FFFFFF !important; + background-color: #1a1a1a !important; + color: #ffffff !important; border-radius: 20px !important; padding: 0 16px !important; margin: 0 4px 0 12px !important; @@ -427,17 +438,17 @@ .VPNavBarMenuLink[href*="/blob/main/docs/"]:hover { background-color: #333333 !important; - color: #FFFFFF !important; + color: #ffffff !important; } .dark .VPNavBarMenuLink[href*="/blob/main/docs/"] { - background-color: #E5E5E5 !important; - color: #1A1A1A !important; + background-color: #e5e5e5 !important; + color: #1a1a1a !important; } .dark .VPNavBarMenuLink[href*="/blob/main/docs/"]:hover { - background-color: #FFFFFF !important; - color: #1A1A1A !important; + background-color: #ffffff !important; + color: #1a1a1a !important; } .VPNavBarMenuLink[href*="/blob/main/docs/"]::after { @@ -454,7 +465,7 @@ } .VPNavBarMenuLink.active:not([href*="/blob/main/docs/"])::after { - content: ''; + content: ""; position: absolute; bottom: -1px; left: 0; @@ -469,8 +480,8 @@ /* GitHub Black Button */ .VPNavBarSocialLink { - background-color: #1A1A1A !important; - color: #FFFFFF !important; + background-color: #1a1a1a !important; + color: #ffffff !important; border-radius: 20px; padding: 0 16px 0 12px !important; height: 32px !important; @@ -495,12 +506,12 @@ } .dark .VPNavBarSocialLink { - background-color: #E5E5E5 !important; - color: #1A1A1A !important; + background-color: #e5e5e5 !important; + color: #1a1a1a !important; } .dark .VPNavBarSocialLink:hover { - background-color: #FFFFFF !important; + background-color: #ffffff !important; } @media (min-width: 768px) { @@ -519,7 +530,8 @@ overflow: hidden; } -.vp-doc th, .vp-doc td { +.vp-doc th, +.vp-doc td { padding: 10px 16px; border: 1px solid var(--vp-c-divider); } @@ -583,7 +595,7 @@ } .vp-doc .mermaid::after { - content: 'Click to expand'; + content: "Click to expand"; position: absolute; top: 0; right: 0; @@ -605,7 +617,7 @@ } html:lang(zh-CN) .vp-doc .mermaid::after { - content: '点击放大'; + content: "点击放大"; } .vp-doc .mermaid:focus-visible { @@ -636,14 +648,14 @@ html:lang(zh-CN) .vp-doc .mermaid::after { } .vp-doc .mermaid::after { - content: 'Tap to expand'; + content: "Tap to expand"; opacity: 1; top: 0; right: 0; } html:lang(zh-CN) .vp-doc .mermaid::after { - content: '点击放大'; + content: "点击放大"; } } @@ -837,7 +849,7 @@ html.has-mermaid-viewer body { } .index-list li::before { - content: ''; + content: ""; position: absolute; left: 0; top: 10px; diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..8ec33632 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,72 @@ +import js from "@eslint/js"; +import globals from "globals"; +import tseslint from "typescript-eslint"; + +const ignores = [ + "node_modules/**", + "docs/.vitepress/dist/**", + ".git-history-backup-20260519/**", + "projects/**", + "docs-readme/**", + "skills/**", + "courses/**/docs/**", +]; + +const jsFiles = [ + "docs/.vitepress/**/*.{js,mjs}", + "scripts/**/*.{js,mjs}", + "tests/**/*.{js,mjs}", + "courses/**/*.mjs", +]; + +const tsFiles = ["scripts/**/*.ts", "docs/.vitepress/**/*.ts"]; +const browserFiles = ["docs/.vitepress/theme/**/*.{js,mjs,ts}"]; + +export default [ + { ignores }, + { + ...js.configs.recommended, + files: jsFiles, + languageOptions: { + ...js.configs.recommended.languageOptions, + ecmaVersion: "latest", + sourceType: "module", + globals: { + ...globals.node, + }, + }, + rules: { + ...js.configs.recommended.rules, + "no-unused-vars": [ + "error", + { + argsIgnorePattern: "^_", + varsIgnorePattern: "^_", + }, + ], + }, + }, + { + files: browserFiles, + languageOptions: { + globals: { + ...globals.browser, + }, + }, + }, + ...tseslint.configs.recommended.map((config) => ({ + ...config, + files: tsFiles, + languageOptions: { + ...config.languageOptions, + parserOptions: { + ...config.languageOptions?.parserOptions, + ecmaVersion: "latest", + sourceType: "module", + }, + globals: { + ...globals.node, + }, + }, + })), +]; diff --git a/package-lock.json b/package-lock.json index 47fec0d2..8d01e51a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,12 +11,19 @@ "github-slugger": "^2.0.0" }, "devDependencies": { + "@eslint/js": "^9.27.0", "@faker-js/faker": "^9.9.0", + "eslint": "^9.27.0", + "globals": "^16.0.0", + "husky": "^9.1.7", + "lint-staged": "^15.2.5", "mermaid": "^11.14.0", "pdf-lib": "^1.17.1", "playwright": "^1.59.1", + "prettier": "^3.5.3", "tsx": "^4.19.0", "typescript": "^5.7.0", + "typescript-eslint": "^8.32.0", "vitepress": "^1.6.4", "vitepress-plugin-mermaid": "^2.0.17" } @@ -887,6 +894,163 @@ "node": ">=12" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@faker-js/faker": { "version": "9.9.0", "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.9.0.tgz", @@ -904,6 +1068,72 @@ "npm": ">=9.0.0" } }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@iconify-json/simple-icons": { "version": "1.2.75", "resolved": "https://registry.npmmirror.com/@iconify-json/simple-icons/-/simple-icons-1.2.75.tgz", @@ -1740,6 +1970,13 @@ "@types/unist": "*" } }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/linkify-it": { "version": "5.0.0", "resolved": "https://registry.npmmirror.com/@types/linkify-it/-/linkify-it-5.0.0.tgz", @@ -1797,137 +2034,419 @@ "dev": true, "license": "MIT" }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.4.tgz", + "integrity": "sha512-PegsU+XfyJJNjd4+u/k6f9yTyp0lEXXiPopUNobZcIAUJFGICFLN+sP0Rb3JehVmiij1Ph0dFGYqODoRo/2+6A==", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.4", + "@typescript-eslint/type-utils": "8.59.4", + "@typescript-eslint/utils": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.4", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } }, - "node_modules/@upsetjs/venn.js": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/@upsetjs/venn.js/-/venn.js-2.0.0.tgz", - "integrity": "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", - "optionalDependencies": { - "d3-selection": "^3.0.0", - "d3-transition": "^3.0.1" + "engines": { + "node": ">= 4" } }, - "node_modules/@vitejs/plugin-vue": { - "version": "5.2.4", - "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", - "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "node_modules/@typescript-eslint/parser": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.4.tgz", + "integrity": "sha512-zORHqO/tuhxY1zWuTvMUqddRxpiFJ72xVfcNoWpqdLjs6lfPbuQBJuW4pk+49/uBMy7Ssr4bzgjiKmmDB1UbZQ==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.4", + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/typescript-estree": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4", + "debug": "^4.4.3" + }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0", - "vue": "^3.2.25" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@vue/compiler-core": { - "version": "3.5.31", - "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.31.tgz", - "integrity": "sha512-k/ueL14aNIEy5Onf0OVzR8kiqF/WThgLdFhxwa4e/KF/0qe38IwIdofoSWBTvvxQOesaz6riAFAUaYjoF9fLLQ==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.4.tgz", + "integrity": "sha512-Ly00Vu4oAacfDeHp2Zg85ioNG6l8HG+tN1D7J+xTHSxu9y0awYKJ2zH1rFBn8ZSfuGK+7FxK3Cgl3uAz0aZZLg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.2", - "@vue/shared": "3.5.31", - "entities": "^7.0.1", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" + "@typescript-eslint/tsconfig-utils": "^8.59.4", + "@typescript-eslint/types": "^8.59.4", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.31", - "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.31.tgz", - "integrity": "sha512-BMY/ozS/xxjYqRFL+tKdRpATJYDTTgWSo0+AJvJNg4ig+Hgb0dOsHPXvloHQ5hmlivUqw1Yt2pPIqp4e0v1GUw==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.4.tgz", + "integrity": "sha512-mUeR/3H1WrTAddJrwut8OoPjfauaztMQmRwV5fQTUyNVJCLiUXXe4lGEyYIL2oFDpP7UtgbGJXCt72wT0z2S3Q==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.31", - "@vue/shared": "3.5.31" + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.31", - "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.31.tgz", - "integrity": "sha512-M8wpPgR9UJ8MiRGjppvx9uWJfLV7A/T+/rL8s/y3QG3u0c2/YZgff3d6SuimKRIhcYnWg5fTfDMlz2E6seUW8Q==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.4.tgz", + "integrity": "sha512-DLCpnKgD4alVxTBSKulK+gU1KCqOgUXfDRDXh2mZgzokQKa/70ax93I2uVO3m/LLvIAtWZIFoiifudmIqAxpMA==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.2", - "@vue/compiler-core": "3.5.31", - "@vue/compiler-dom": "3.5.31", - "@vue/compiler-ssr": "3.5.31", - "@vue/shared": "3.5.31", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.21", - "postcss": "^8.5.8", - "source-map-js": "^1.2.1" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.31", - "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.31.tgz", - "integrity": "sha512-h0xIMxrt/LHOvJKMri+vdYT92BrK3HFLtDqq9Pr/lVVfE4IyKZKvWf0vJFW10Yr6nX02OR4MkJwI0c1HDa1hog==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.4.tgz", + "integrity": "sha512-uonTuPAAKr9XaBGqJ3LjYTh72zy5DyGesljO9gtmk/eFW0W1fRHjnwVYKB35Lm8d5Q5CluEW3gPHjTvZTmgrfA==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.31", - "@vue/shared": "3.5.31" + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/typescript-estree": "8.59.4", + "@typescript-eslint/utils": "8.59.4", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@vue/devtools-api": { - "version": "7.7.9", - "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-7.7.9.tgz", - "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", + "node_modules/@typescript-eslint/types": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.4.tgz", + "integrity": "sha512-F1o7WJcCq+bc8dwcO/YsSEOudAH8RDtaOhM6wcAQhcUsFhnWQl81JKy48q1hoxAU0qrzM89+31GYh1515Zde3Q==", "dev": true, "license": "MIT", - "dependencies": { - "@vue/devtools-kit": "^7.7.9" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@vue/devtools-kit": { - "version": "7.7.9", - "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", - "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.4.tgz", + "integrity": "sha512-F+RuOmcDXo4+TPdfd/TCLS3m2nw8gE9XXyZLrA3JBfaA5tz9TtdkyD3YJFmPxulyc2cKbEok/CvFE3MgSLWnag==", "dev": true, "license": "MIT", "dependencies": { - "@vue/devtools-shared": "^7.7.9", - "birpc": "^2.3.0", - "hookable": "^5.5.3", - "mitt": "^3.0.1", - "perfect-debounce": "^1.0.0", - "speakingurl": "^14.0.1", - "superjson": "^2.2.2" + "@typescript-eslint/project-service": "8.59.4", + "@typescript-eslint/tsconfig-utils": "8.59.4", + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@vue/devtools-shared": { - "version": "7.7.9", - "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", - "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, "license": "MIT", - "dependencies": { - "rfdc": "^1.4.1" + "engines": { + "node": "18 || 20 || >=22" } }, - "node_modules/@vue/reactivity": { - "version": "3.5.31", - "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.31.tgz", - "integrity": "sha512-DtKXxk9E/KuVvt8VxWu+6Luc9I9ETNcqR1T1oW1gf02nXaZ1kuAx58oVu7uX9XxJR0iJCro6fqBLw9oSBELo5g==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, "license": "MIT", "dependencies": { - "@vue/shared": "3.5.31" - } + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.4.tgz", + "integrity": "sha512-cYXeNAUsG4lJo5dbc1FcKm+JwIWrj1/UpTORsC6tGMjEZ81DYcvIr9/ueikhMa/Y/gDQYGp+YX9/xQrXje5BJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.4", + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/typescript-estree": "8.59.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.4.tgz", + "integrity": "sha512-U3gxVaDVnuZKhSspW/MzMxE1kq7zOdc072FcSNoqA1I9p8HyKbBFfEHoWckBAMgNMph4MamwS5iTVzFmrnt8TQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.59.4", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@upsetjs/venn.js": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@upsetjs/venn.js/-/venn.js-2.0.0.tgz", + "integrity": "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "d3-selection": "^3.0.0", + "d3-transition": "^3.0.1" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.31", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.31.tgz", + "integrity": "sha512-k/ueL14aNIEy5Onf0OVzR8kiqF/WThgLdFhxwa4e/KF/0qe38IwIdofoSWBTvvxQOesaz6riAFAUaYjoF9fLLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.2", + "@vue/shared": "3.5.31", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.31", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.31.tgz", + "integrity": "sha512-BMY/ozS/xxjYqRFL+tKdRpATJYDTTgWSo0+AJvJNg4ig+Hgb0dOsHPXvloHQ5hmlivUqw1Yt2pPIqp4e0v1GUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.31", + "@vue/shared": "3.5.31" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.31", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.31.tgz", + "integrity": "sha512-M8wpPgR9UJ8MiRGjppvx9uWJfLV7A/T+/rL8s/y3QG3u0c2/YZgff3d6SuimKRIhcYnWg5fTfDMlz2E6seUW8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.2", + "@vue/compiler-core": "3.5.31", + "@vue/compiler-dom": "3.5.31", + "@vue/compiler-ssr": "3.5.31", + "@vue/shared": "3.5.31", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.8", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.31", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.31.tgz", + "integrity": "sha512-h0xIMxrt/LHOvJKMri+vdYT92BrK3HFLtDqq9Pr/lVVfE4IyKZKvWf0vJFW10Yr6nX02OR4MkJwI0c1HDa1hog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.31", + "@vue/shared": "3.5.31" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.9", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-7.7.9.tgz", + "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.9" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.9", + "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", + "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.9", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.9", + "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", + "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.31", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.31.tgz", + "integrity": "sha512-DtKXxk9E/KuVvt8VxWu+6Luc9I9ETNcqR1T1oW1gf02nXaZ1kuAx58oVu7uX9XxJR0iJCro6fqBLw9oSBELo5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.31" + } }, "node_modules/@vue/runtime-core": { "version": "3.5.31", @@ -2093,6 +2612,33 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/algoliasearch": { "version": "5.50.0", "resolved": "https://registry.npmmirror.com/algoliasearch/-/algoliasearch-5.50.0.tgz", @@ -2119,6 +2665,65 @@ "node": ">= 14.0.0" } }, + "node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/birpc": { "version": "2.9.0", "resolved": "https://registry.npmmirror.com/birpc/-/birpc-2.9.0.tgz", @@ -2129,6 +2734,40 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/ccount/-/ccount-2.0.1.tgz", @@ -2140,6 +2779,23 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/character-entities-html4": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz", @@ -2190,15 +2846,75 @@ "chevrotain": "^11.0.0" } }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/commander": { @@ -2211,6 +2927,13 @@ "node": ">= 10" } }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, "node_modules/confbox": { "version": "0.1.8", "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz", @@ -2244,6 +2967,21 @@ "layout-base": "^1.0.0" } }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", @@ -2799,6 +3537,31 @@ "dev": true, "license": "MIT" }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, "node_modules/delaunator": { "version": "5.1.0", "resolved": "https://registry.npmmirror.com/delaunator/-/delaunator-5.1.0.tgz", @@ -2843,6 +3606,13 @@ "@types/trusted-types": "^2.0.7" } }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, "node_modules/emoji-regex-xs": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", @@ -2863,6 +3633,19 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/esbuild": { "version": "0.21.5", "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz", @@ -2902,6 +3685,163 @@ "@esbuild/win32-x64": "0.21.5" } }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", @@ -2909,6 +3849,132 @@ "dev": true, "license": "MIT" }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, "node_modules/focus-trap": { "version": "7.8.0", "resolved": "https://registry.npmmirror.com/focus-trap/-/focus-trap-7.8.0.tgz", @@ -2934,6 +4000,32 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/get-east-asian-width": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-tsconfig": { "version": "4.13.7", "resolved": "https://registry.npmmirror.com/get-tsconfig/-/get-tsconfig-4.13.7.tgz", @@ -2953,6 +4045,32 @@ "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", "license": "ISC" }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/hachure-fill": { "version": "0.5.2", "resolved": "https://registry.npmmirror.com/hachure-fill/-/hachure-fill-0.5.2.tgz", @@ -2960,6 +4078,16 @@ "dev": true, "license": "MIT" }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/hast-util-to-html": { "version": "9.0.5", "resolved": "https://registry.npmmirror.com/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", @@ -3016,6 +4144,32 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "license": "MIT", + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -3029,6 +4183,43 @@ "node": ">=0.10.0" } }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, "node_modules/internmap": { "version": "2.0.3", "resolved": "https://registry.npmmirror.com/internmap/-/internmap-2.0.3.tgz", @@ -3039,6 +4230,65 @@ "node": ">=12" } }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-what": { "version": "5.5.0", "resolved": "https://registry.npmmirror.com/is-what/-/is-what-5.5.0.tgz", @@ -3052,6 +4302,47 @@ "url": "https://github.com/sponsors/mesqueeb" } }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/katex": { "version": "0.16.44", "resolved": "https://registry.npmmirror.com/katex/-/katex-0.16.44.tgz", @@ -3079,6 +4370,16 @@ "node": ">= 12" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/khroma": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/khroma/-/khroma-2.1.0.tgz", @@ -3110,6 +4411,118 @@ "dev": true, "license": "MIT" }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lint-staged": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.2.tgz", + "integrity": "sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.4.1", + "commander": "^13.1.0", + "debug": "^4.4.0", + "execa": "^8.0.1", + "lilconfig": "^3.1.3", + "listr2": "^8.2.5", + "micromatch": "^4.0.8", + "pidtree": "^0.6.0", + "string-argv": "^0.3.2", + "yaml": "^2.7.0" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/listr2": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", + "integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lodash-es": { "version": "4.17.23", "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.23.tgz", @@ -3117,6 +4530,79 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", @@ -3169,6 +4655,13 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, "node_modules/mermaid": { "version": "11.14.0", "resolved": "https://registry.npmmirror.com/mermaid/-/mermaid-11.14.0.tgz", @@ -3293,6 +4786,59 @@ ], "license": "MIT" }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/minisearch": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/minisearch/-/minisearch-7.2.0.tgz", @@ -3320,6 +4866,13 @@ "ufo": "^1.6.3" } }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", @@ -3339,6 +4892,13 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, "node_modules/non-layered-tidy-tree-layout": { "version": "2.0.2", "resolved": "https://registry.npmmirror.com/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", @@ -3347,6 +4907,51 @@ "license": "MIT", "optional": true }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/oniguruma-to-es": { "version": "3.1.1", "resolved": "https://registry.npmmirror.com/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", @@ -3359,6 +4964,56 @@ "regex-recursion": "^6.0.2" } }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/package-manager-detector": { "version": "1.6.0", "resolved": "https://registry.npmmirror.com/package-manager-detector/-/package-manager-detector-1.6.0.tgz", @@ -3373,6 +5028,19 @@ "dev": true, "license": "(MIT AND Zlib)" }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/path-data-parser": { "version": "0.1.0", "resolved": "https://registry.npmmirror.com/path-data-parser/-/path-data-parser-0.1.0.tgz", @@ -3380,6 +5048,26 @@ "dev": true, "license": "MIT" }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", @@ -3414,6 +5102,32 @@ "dev": true, "license": "ISC" }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/pkg-types": { "version": "1.3.1", "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz", @@ -3527,8 +5241,34 @@ "dev": true, "license": "MIT", "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", + "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/property-information": { @@ -3542,6 +5282,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/regex": { "version": "6.1.0", "resolved": "https://registry.npmmirror.com/regex/-/regex-6.1.0.tgz", @@ -3569,6 +5319,16 @@ "dev": true, "license": "MIT" }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -3579,6 +5339,39 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/rfdc": { "version": "1.4.1", "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", @@ -3673,6 +5466,42 @@ "license": "MIT", "peer": true }, + "node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/shiki": { "version": "2.5.0", "resolved": "https://registry.npmmirror.com/shiki/-/shiki-2.5.0.tgz", @@ -3690,6 +5519,49 @@ "@types/hast": "^3.0.4" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", @@ -3721,6 +5593,34 @@ "node": ">=0.10.0" } }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/stringify-entities": { "version": "4.0.4", "resolved": "https://registry.npmmirror.com/stringify-entities/-/stringify-entities-4.0.4.tgz", @@ -3736,6 +5636,48 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/stylis": { "version": "4.3.6", "resolved": "https://registry.npmmirror.com/stylis/-/stylis-4.3.6.tgz", @@ -3756,6 +5698,19 @@ "node": ">=16" } }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/tabbable": { "version": "6.4.0", "resolved": "https://registry.npmmirror.com/tabbable/-/tabbable-6.4.0.tgz", @@ -3773,6 +5728,67 @@ "node": ">=18" } }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmmirror.com/trim-lines/-/trim-lines-3.0.1.tgz", @@ -3784,6 +5800,19 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/ts-dedent": { "version": "2.2.0", "resolved": "https://registry.npmmirror.com/ts-dedent/-/ts-dedent-2.2.0.tgz", @@ -4254,6 +6283,19 @@ "@esbuild/win32-x64": "0.27.4" } }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.9.3.tgz", @@ -4268,6 +6310,30 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.4.tgz", + "integrity": "sha512-Rw6+44QNFaXtgHSjPy+Kw8hrJniMYzR85E9yLmOLcfZ91/rz+JXQbDTCmc6ccxMPY6K6PgAq26f0JCBfR7LIPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.59.4", + "@typescript-eslint/parser": "8.59.4", + "@typescript-eslint/typescript-estree": "8.59.4", + "@typescript-eslint/utils": "8.59.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, "node_modules/ufo": { "version": "1.6.3", "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.6.3.tgz", @@ -4348,6 +6414,16 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/uuid": { "version": "11.1.0", "resolved": "https://registry.npmmirror.com/uuid/-/uuid-11.1.0.tgz", @@ -4585,6 +6661,92 @@ } } }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmmirror.com/zwitch/-/zwitch-2.0.4.tgz", diff --git a/package.json b/package.json index 9f36604f..cd1fab3e 100644 --- a/package.json +++ b/package.json @@ -7,12 +7,17 @@ "dev": "vitepress dev docs", "build": "vitepress build docs", "preview": "vitepress preview docs", + "lint": "eslint . --max-warnings=0", + "format": "prettier --write README.md WHITELABEL.md package.json .github/workflows docs/.vitepress scripts tests courses/*/course.manifest.mjs", + "format:check": "prettier --check README.md WHITELABEL.md package.json .github/workflows docs/.vitepress scripts tests courses/*/course.manifest.mjs", + "prepare": "husky", "test": "node --test tests/*.test.mjs", "docs:dev": "vitepress dev docs", "docs:build": "vitepress build docs", "docs:preview": "vitepress preview docs", "lecture:run": "tsx", "course:list": "node scripts/set-active-course.mjs --list", + "course:new": "node scripts/new-course.mjs", "course:activate": "node scripts/set-active-course.mjs", "screenshots:readme": "node --import tsx scripts/capture-readme-screenshots.ts", "pdf:export": "node --import tsx scripts/build-course-pdfs.ts", @@ -20,15 +25,31 @@ }, "devDependencies": { "@faker-js/faker": "^9.9.0", + "@eslint/js": "^9.27.0", + "eslint": "^9.27.0", + "globals": "^16.0.0", + "husky": "^9.1.7", + "lint-staged": "^15.2.5", "mermaid": "^11.14.0", "pdf-lib": "^1.17.1", "playwright": "^1.59.1", + "prettier": "^3.5.3", "tsx": "^4.19.0", + "typescript-eslint": "^8.32.0", "typescript": "^5.7.0", "vitepress": "^1.6.4", "vitepress-plugin-mermaid": "^2.0.17" }, "dependencies": { "github-slugger": "^2.0.0" + }, + "lint-staged": { + "*.{js,mjs,ts}": [ + "eslint --fix", + "prettier --write" + ], + "*.{md,json,yml,yaml,css,vue}": [ + "prettier --write" + ] } } diff --git a/scripts/build-course-pdfs.ts b/scripts/build-course-pdfs.ts index a1a5cb3d..7e97d0b6 100644 --- a/scripts/build-course-pdfs.ts +++ b/scripts/build-course-pdfs.ts @@ -1,7 +1,7 @@ -import path from 'node:path' -import { promises as fs } from 'node:fs' -import { chromium, devices, type BrowserContext, type Page } from 'playwright' -import { PDFDocument } from 'pdf-lib' +import path from "node:path"; +import { promises as fs } from "node:fs"; +import { chromium, devices, type BrowserContext, type Page } from "playwright"; +import { PDFDocument } from "pdf-lib"; import { artifactsRoot, discoverCoursePages, @@ -9,8 +9,8 @@ import { pdfOutputRoot, startStaticServer, toAbsoluteSiteUrl, - type Language -} from './export-site-utils' + type Language, +} from "./export-site-utils"; const PDF_EXPORT_CSS = ` .VPNav, @@ -68,28 +68,28 @@ const PDF_EXPORT_CSS = ` body { background: #ffffff !important; } -` +`; async function main() { - const languages = parseRequestedLanguages(process.argv.slice(2)) - const tempRoot = path.join(artifactsRoot, 'pdfs/.tmp') + const languages = parseRequestedLanguages(process.argv.slice(2)); + const tempRoot = path.join(artifactsRoot, "pdfs/.tmp"); - await fs.rm(tempRoot, { recursive: true, force: true }) - await ensureDirectory(tempRoot) - await ensureDirectory(pdfOutputRoot) + await fs.rm(tempRoot, { recursive: true, force: true }); + await ensureDirectory(tempRoot); + await ensureDirectory(pdfOutputRoot); - const server = await startStaticServer() - const browser = await chromium.launch({ headless: true }) - const context = await browser.newContext(devices['Desktop Chrome']) + const server = await startStaticServer(); + const browser = await chromium.launch({ headless: true }); + const context = await browser.newContext(devices["Desktop Chrome"]); try { for (const language of languages) { - await buildLanguagePdf(context, server.origin, language, tempRoot) + await buildLanguagePdf(context, server.origin, language, tempRoot); } } finally { - await context.close() - await browser.close() - await server.close() + await context.close(); + await browser.close(); + await server.close(); } } @@ -97,96 +97,106 @@ async function buildLanguagePdf( context: BrowserContext, origin: string, language: Language, - tempRoot: string + tempRoot: string, ) { - const pages = await discoverCoursePages(language) - const tempLanguageDir = path.join(tempRoot, language) - const outputPdf = path.join(pdfOutputRoot, `learn-harness-engineering-${language}.pdf`) - const manifestPath = path.join(pdfOutputRoot, `learn-harness-engineering-${language}.json`) - - await fs.rm(tempLanguageDir, { recursive: true, force: true }) - await ensureDirectory(tempLanguageDir) - - const manifest: Array<{ title: string; routePath: string }> = [] - const tempPdfPaths: string[] = [] - - let pageIndex = 1 + const pages = await discoverCoursePages(language); + const tempLanguageDir = path.join(tempRoot, language); + const outputPdf = path.join( + pdfOutputRoot, + `learn-harness-engineering-${language}.pdf`, + ); + const manifestPath = path.join( + pdfOutputRoot, + `learn-harness-engineering-${language}.json`, + ); + + await fs.rm(tempLanguageDir, { recursive: true, force: true }); + await ensureDirectory(tempLanguageDir); + + const manifest: Array<{ title: string; routePath: string }> = []; + const tempPdfPaths: string[] = []; + + let pageIndex = 1; for (const entry of pages) { - const page = await context.newPage() - const url = toAbsoluteSiteUrl(origin, entry.routePath) + const page = await context.newPage(); + const url = toAbsoluteSiteUrl(origin, entry.routePath); - await page.goto(url, { waitUntil: 'networkidle' }) - await page.addStyleTag({ content: PDF_EXPORT_CSS }) - await page.emulateMedia({ media: 'screen' }) + await page.goto(url, { waitUntil: "networkidle" }); + await page.addStyleTag({ content: PDF_EXPORT_CSS }); + await page.emulateMedia({ media: "screen" }); - const title = await extractPageTitle(page, entry.titleHint) + const title = await extractPageTitle(page, entry.titleHint); const safeSlug = entry.routePath - .replace(/^\/+/, '') - .replace(/\/+$/, '') - .replace(/[/.]+/g, '-') - .replace(/-+/g, '-') - .toLowerCase() + .replace(/^\/+/, "") + .replace(/\/+$/, "") + .replace(/[/.]+/g, "-") + .replace(/-+/g, "-") + .toLowerCase(); const tempPdfPath = path.join( tempLanguageDir, - `${String(pageIndex).padStart(2, '0')}-${safeSlug || language}.pdf` - ) + `${String(pageIndex).padStart(2, "0")}-${safeSlug || language}.pdf`, + ); await page.pdf({ path: tempPdfPath, - format: 'A4', + format: "A4", printBackground: true, margin: { - top: '14mm', - bottom: '14mm', - left: '12mm', - right: '12mm' + top: "14mm", + bottom: "14mm", + left: "12mm", + right: "12mm", }, displayHeaderFooter: true, - headerTemplate: '
', + headerTemplate: "
", footerTemplate: - '
/
' - }) + '
/
', + }); - await page.close() + await page.close(); - manifest.push({ title, routePath: entry.routePath }) - tempPdfPaths.push(tempPdfPath) - console.log(`Rendered ${language.toUpperCase()} PDF section: ${title}`) - pageIndex += 1 + manifest.push({ title, routePath: entry.routePath }); + tempPdfPaths.push(tempPdfPath); + console.log(`Rendered ${language.toUpperCase()} PDF section: ${title}`); + pageIndex += 1; } - const coverPdfPath = path.join(tempLanguageDir, `00-cover-${language}.pdf`) - await renderCoverPage(context, coverPdfPath, language, manifest) - await mergePdfs([coverPdfPath, ...tempPdfPaths], outputPdf) - await fs.writeFile(manifestPath, JSON.stringify(manifest, null, 2)) + const coverPdfPath = path.join(tempLanguageDir, `00-cover-${language}.pdf`); + await renderCoverPage(context, coverPdfPath, language, manifest); + await mergePdfs([coverPdfPath, ...tempPdfPaths], outputPdf); + await fs.writeFile(manifestPath, JSON.stringify(manifest, null, 2)); - console.log(`Built ${outputPdf}`) + console.log(`Built ${outputPdf}`); } async function extractPageTitle(page: Page, fallback: string) { - const heading = await page.locator('h1').first().textContent().catch(() => null) - const title = heading?.trim() - if (title) return title - const documentTitle = await page.title() - return documentTitle.split('|')[0].trim() || fallback + const heading = await page + .locator("h1") + .first() + .textContent() + .catch(() => null); + const title = heading?.trim(); + if (title) return title; + const documentTitle = await page.title(); + return documentTitle.split("|")[0].trim() || fallback; } async function renderCoverPage( context: BrowserContext, outputPath: string, language: Language, - manifest: Array<{ title: string; routePath: string }> + manifest: Array<{ title: string; routePath: string }>, ) { - const page = await context.newPage() - const generatedAt = new Date().toISOString().slice(0, 10) - const languageLabel = language === 'en' ? 'English' : '简体中文' + const page = await context.newPage(); + const generatedAt = new Date().toISOString().slice(0, 10); + const languageLabel = language === "en" ? "English" : "简体中文"; const contents = manifest .map( (entry) => - `
  • ${escapeHtml(entry.title)}${escapeHtml(entry.routePath)}
  • ` + `
  • ${escapeHtml(entry.title)}${escapeHtml(entry.routePath)}
  • `, ) - .join('') + .join(""); await page.setContent( ` @@ -235,60 +245,60 @@ async function renderCoverPage(
      ${contents}
    `, - { waitUntil: 'load' } - ) + { waitUntil: "load" }, + ); await page.pdf({ path: outputPath, - format: 'A4', + format: "A4", printBackground: true, margin: { - top: '14mm', - bottom: '14mm', - left: '12mm', - right: '12mm' - } - }) - await page.close() + top: "14mm", + bottom: "14mm", + left: "12mm", + right: "12mm", + }, + }); + await page.close(); } async function mergePdfs(inputPaths: string[], outputPath: string) { - const merged = await PDFDocument.create() + const merged = await PDFDocument.create(); for (const inputPath of inputPaths) { - const sourceBytes = await fs.readFile(inputPath) - const source = await PDFDocument.load(sourceBytes) - const copiedPages = await merged.copyPages(source, source.getPageIndices()) + const sourceBytes = await fs.readFile(inputPath); + const source = await PDFDocument.load(sourceBytes); + const copiedPages = await merged.copyPages(source, source.getPageIndices()); for (const copiedPage of copiedPages) { - merged.addPage(copiedPage) + merged.addPage(copiedPage); } } - await fs.writeFile(outputPath, await merged.save()) + await fs.writeFile(outputPath, await merged.save()); } function parseRequestedLanguages(args: string[]): Language[] { - const languageIndex = args.findIndex((arg) => arg === '--lang') + const languageIndex = args.findIndex((arg) => arg === "--lang"); if (languageIndex === -1) { - return ['en', 'zh'] + return ["en", "zh"]; } - const value = args[languageIndex + 1] - if (value === 'en' || value === 'zh') { - return [value] + const value = args[languageIndex + 1]; + if (value === "en" || value === "zh") { + return [value]; } - throw new Error(`Unsupported language: ${value}`) + throw new Error(`Unsupported language: ${value}`); } function escapeHtml(value: string) { return value - .replaceAll('&', '&') - .replaceAll('<', '<') - .replaceAll('>', '>') + .replaceAll("&", "&") + .replaceAll("<", "<") + .replaceAll(">", ">"); } main().catch((error) => { - console.error(error) - process.exitCode = 1 -}) + console.error(error); + process.exitCode = 1; +}); diff --git a/scripts/capture-readme-screenshots.ts b/scripts/capture-readme-screenshots.ts index 11c84cbf..e61c4502 100644 --- a/scripts/capture-readme-screenshots.ts +++ b/scripts/capture-readme-screenshots.ts @@ -1,41 +1,41 @@ -import path from 'node:path' -import { chromium, devices } from 'playwright' +import path from "node:path"; +import { chromium, devices } from "playwright"; import { ensureDirectory, readmeScreenshotTargets, readmeScreenshotsRoot, startStaticServer, - toAbsoluteSiteUrl -} from './export-site-utils' + toAbsoluteSiteUrl, +} from "./export-site-utils"; async function main() { - await ensureDirectory(readmeScreenshotsRoot) + await ensureDirectory(readmeScreenshotsRoot); - const server = await startStaticServer() - const browser = await chromium.launch({ headless: true }) - const context = await browser.newContext(devices['Desktop Chrome']) + const server = await startStaticServer(); + const browser = await chromium.launch({ headless: true }); + const context = await browser.newContext(devices["Desktop Chrome"]); try { for (const target of readmeScreenshotTargets) { - const page = await context.newPage() + const page = await context.newPage(); await page.goto(toAbsoluteSiteUrl(server.origin, target.routePath), { - waitUntil: 'networkidle' - }) + waitUntil: "networkidle", + }); await page.screenshot({ path: path.join(readmeScreenshotsRoot, target.outputName), - fullPage: false - }) - await page.close() - console.log(`Captured ${target.outputName}`) + fullPage: false, + }); + await page.close(); + console.log(`Captured ${target.outputName}`); } } finally { - await context.close() - await browser.close() - await server.close() + await context.close(); + await browser.close(); + await server.close(); } } main().catch((error) => { - console.error(error) - process.exitCode = 1 -}) + console.error(error); + process.exitCode = 1; +}); diff --git a/scripts/export-site-utils.ts b/scripts/export-site-utils.ts index 88812f0d..8720c26c 100644 --- a/scripts/export-site-utils.ts +++ b/scripts/export-site-utils.ts @@ -1,122 +1,146 @@ -import http from 'node:http' -import path from 'node:path' -import { existsSync } from 'node:fs' -import { promises as fs } from 'node:fs' +import http from "node:http"; +import path from "node:path"; +import { existsSync } from "node:fs"; +import { promises as fs } from "node:fs"; -export type Language = 'en' | 'zh' +export type Language = "en" | "zh"; export type CoursePage = { - filePath: string - routePath: string - titleHint: string -} + filePath: string; + routePath: string; + titleHint: string; +}; export type ScreenshotTarget = { - language: Language - routePath: string - outputName: string -} + language: Language; + routePath: string; + outputName: string; +}; -export const repoRoot = process.cwd() -export const docsRoot = path.resolve(repoRoot, 'docs') -export const distRoot = path.resolve(repoRoot, 'docs/.vitepress/dist') -export const artifactsRoot = path.resolve(repoRoot, 'artifacts') -export const pdfOutputRoot = path.resolve(artifactsRoot, 'pdfs') -export const readmeScreenshotsRoot = path.resolve(docsRoot, 'public/screenshots/readme') +export const repoRoot = process.cwd(); +export const docsRoot = path.resolve(repoRoot, "docs"); +export const distRoot = path.resolve(repoRoot, "docs/.vitepress/dist"); +export const artifactsRoot = path.resolve(repoRoot, "artifacts"); +export const pdfOutputRoot = path.resolve(artifactsRoot, "pdfs"); +export const readmeScreenshotsRoot = path.resolve( + docsRoot, + "public/screenshots/readme", +); export const docsBasePath = normalizeBasePath( - process.env.DOCS_BASE_PATH || '/learn-harness-engineering/' -) + process.env.DOCS_BASE_PATH || "/learn-harness-engineering/", +); const MIME_TYPES: Record = { - '.css': 'text/css; charset=utf-8', - '.html': 'text/html; charset=utf-8', - '.ico': 'image/x-icon', - '.jpeg': 'image/jpeg', - '.jpg': 'image/jpeg', - '.js': 'text/javascript; charset=utf-8', - '.json': 'application/json; charset=utf-8', - '.md': 'text/markdown; charset=utf-8', - '.png': 'image/png', - '.svg': 'image/svg+xml', - '.txt': 'text/plain; charset=utf-8', - '.woff': 'font/woff', - '.woff2': 'font/woff2' -} + ".css": "text/css; charset=utf-8", + ".html": "text/html; charset=utf-8", + ".ico": "image/x-icon", + ".jpeg": "image/jpeg", + ".jpg": "image/jpeg", + ".js": "text/javascript; charset=utf-8", + ".json": "application/json; charset=utf-8", + ".md": "text/markdown; charset=utf-8", + ".png": "image/png", + ".svg": "image/svg+xml", + ".txt": "text/plain; charset=utf-8", + ".woff": "font/woff", + ".woff2": "font/woff2", +}; export const readmeScreenshotTargets: ScreenshotTarget[] = [ - { language: 'en', routePath: '/en/', outputName: 'en-home.png' }, + { language: "en", routePath: "/en/", outputName: "en-home.png" }, + { + language: "en", + routePath: "/en/lectures/lecture-01-why-capable-agents-still-fail/", + outputName: "en-lecture-01.png", + }, + { + language: "en", + routePath: "/en/resources/", + outputName: "en-resources.png", + }, + { language: "zh", routePath: "/zh/", outputName: "zh-home.png" }, { - language: 'en', - routePath: '/en/lectures/lecture-01-why-capable-agents-still-fail/', - outputName: 'en-lecture-01.png' + language: "zh", + routePath: "/zh/lectures/lecture-01-why-capable-agents-still-fail/", + outputName: "zh-lecture-01.png", }, - { language: 'en', routePath: '/en/resources/', outputName: 'en-resources.png' }, - { language: 'zh', routePath: '/zh/', outputName: 'zh-home.png' }, { - language: 'zh', - routePath: '/zh/lectures/lecture-01-why-capable-agents-still-fail/', - outputName: 'zh-lecture-01.png' + language: "zh", + routePath: "/zh/resources/", + outputName: "zh-resources.png", }, - { language: 'zh', routePath: '/zh/resources/', outputName: 'zh-resources.png' } -] +]; export async function ensureDirectory(targetPath: string) { - await fs.mkdir(targetPath, { recursive: true }) + await fs.mkdir(targetPath, { recursive: true }); } export function toAbsoluteSiteUrl(origin: string, routePath: string) { - const normalizedOrigin = origin.replace(/\/$/, '') - const normalizedRoute = routePath.startsWith('/') ? routePath : `/${routePath}` - return `${normalizedOrigin}${docsBasePath.replace(/\/$/, '')}${normalizedRoute}` + const normalizedOrigin = origin.replace(/\/$/, ""); + const normalizedRoute = routePath.startsWith("/") + ? routePath + : `/${routePath}`; + return `${normalizedOrigin}${docsBasePath.replace(/\/$/, "")}${normalizedRoute}`; } -export async function discoverCoursePages(language: Language): Promise { - const languageRoot = path.resolve(docsRoot, language) - const files = await walkMarkdownFiles(languageRoot) +export async function discoverCoursePages( + language: Language, +): Promise { + const languageRoot = path.resolve(docsRoot, language); + const files = await walkMarkdownFiles(languageRoot); return files - .filter((filePath) => shouldIncludeInCoursePdf(path.relative(languageRoot, filePath).replace(/\\/g, '/'))) + .filter((filePath) => + shouldIncludeInCoursePdf( + path.relative(languageRoot, filePath).replace(/\\/g, "/"), + ), + ) .sort((left, right) => compareCourseFiles(language, left, right)) .map((filePath) => ({ filePath, routePath: sourceFileToRoutePath(language, filePath), - titleHint: path.basename(filePath, '.md') - })) + titleHint: path.basename(filePath, ".md"), + })); } export async function startStaticServer(rootDir = distRoot) { const server = http.createServer(async (request, response) => { try { - const requestUrl = new URL(request.url || '/', 'http://127.0.0.1') - const filePath = resolveStaticFilePath(rootDir, requestUrl.pathname) + const requestUrl = new URL(request.url || "/", "http://127.0.0.1"); + const filePath = resolveStaticFilePath(rootDir, requestUrl.pathname); if (!filePath) { - response.statusCode = 404 - response.end('Not Found') - return + response.statusCode = 404; + response.end("Not Found"); + return; } - const data = await fs.readFile(filePath) - const ext = path.extname(filePath) - response.setHeader('Content-Type', MIME_TYPES[ext] || 'application/octet-stream') - response.end(data) + const data = await fs.readFile(filePath); + const ext = path.extname(filePath); + response.setHeader( + "Content-Type", + MIME_TYPES[ext] || "application/octet-stream", + ); + response.end(data); } catch (error) { - response.statusCode = 500 - response.end(error instanceof Error ? error.message : 'Unknown server error') + response.statusCode = 500; + response.end( + error instanceof Error ? error.message : "Unknown server error", + ); } - }) + }); const address = await new Promise((resolve, reject) => { - server.once('error', reject) - server.listen(0, '127.0.0.1', () => { - const currentAddress = server.address() - if (!currentAddress || typeof currentAddress === 'string') { - reject(new Error('Failed to bind static export server')) - return + server.once("error", reject); + server.listen(0, "127.0.0.1", () => { + const currentAddress = server.address(); + if (!currentAddress || typeof currentAddress === "string") { + reject(new Error("Failed to bind static export server")); + return; } - resolve(currentAddress) - }) - }) + resolve(currentAddress); + }); + }); return { origin: `http://127.0.0.1:${address.port}`, @@ -124,112 +148,118 @@ export async function startStaticServer(rootDir = distRoot) { await new Promise((resolve, reject) => { server.close((error) => { if (error) { - reject(error) - return + reject(error); + return; } - resolve() - }) - }) - } + resolve(); + }); + }), + }; } function normalizeBasePath(input: string) { - const withLeadingSlash = input.startsWith('/') ? input : `/${input}` - return withLeadingSlash.endsWith('/') ? withLeadingSlash : `${withLeadingSlash}/` + const withLeadingSlash = input.startsWith("/") ? input : `/${input}`; + return withLeadingSlash.endsWith("/") + ? withLeadingSlash + : `${withLeadingSlash}/`; } async function walkMarkdownFiles(targetDir: string): Promise { - const entries = await fs.readdir(targetDir, { withFileTypes: true }) + const entries = await fs.readdir(targetDir, { withFileTypes: true }); const nested = await Promise.all( entries.map(async (entry) => { - const fullPath = path.join(targetDir, entry.name) + const fullPath = path.join(targetDir, entry.name); if (entry.isDirectory()) { - return await walkMarkdownFiles(fullPath) + return await walkMarkdownFiles(fullPath); } - if (entry.isFile() && entry.name.endsWith('.md')) { - return [fullPath] + if (entry.isFile() && entry.name.endsWith(".md")) { + return [fullPath]; } - return [] - }) - ) + return []; + }), + ); - return nested.flat() + return nested.flat(); } function shouldIncludeInCoursePdf(relativePath: string) { - if (relativePath.includes('/code/')) return false - if (relativePath === 'index.md') return true - if (relativePath.startsWith('lectures/')) return true - if (relativePath.startsWith('projects/')) return true - if (relativePath === 'resources/index.md') return true - if (relativePath === 'resources/templates/index.md') return true - if (relativePath.startsWith('resources/reference/')) return true - if (relativePath.startsWith('resources/openai-advanced/')) return true - return false + if (relativePath.includes("/code/")) return false; + if (relativePath === "index.md") return true; + if (relativePath.startsWith("lectures/")) return true; + if (relativePath.startsWith("projects/")) return true; + if (relativePath === "resources/index.md") return true; + if (relativePath === "resources/templates/index.md") return true; + if (relativePath.startsWith("resources/reference/")) return true; + if (relativePath.startsWith("resources/openai-advanced/")) return true; + return false; } function compareCourseFiles(language: Language, left: string, right: string) { - const languageRoot = path.resolve(docsRoot, language) - const leftRelative = path.relative(languageRoot, left).replace(/\\/g, '/') - const rightRelative = path.relative(languageRoot, right).replace(/\\/g, '/') - const leftWeight = sortWeight(leftRelative) - const rightWeight = sortWeight(rightRelative) - if (leftWeight !== rightWeight) return leftWeight - rightWeight - return leftRelative.localeCompare(rightRelative) + const languageRoot = path.resolve(docsRoot, language); + const leftRelative = path.relative(languageRoot, left).replace(/\\/g, "/"); + const rightRelative = path.relative(languageRoot, right).replace(/\\/g, "/"); + const leftWeight = sortWeight(leftRelative); + const rightWeight = sortWeight(rightRelative); + if (leftWeight !== rightWeight) return leftWeight - rightWeight; + return leftRelative.localeCompare(rightRelative); } function sortWeight(relativePath: string) { - if (relativePath === 'index.md') return 0 - if (relativePath.startsWith('lectures/')) return 1 - if (relativePath.startsWith('projects/')) return 2 - if (relativePath === 'resources/index.md') return 3 - if (relativePath.startsWith('resources/templates/')) return 4 - if (relativePath.startsWith('resources/reference/')) return 5 - if (relativePath.startsWith('resources/openai-advanced/')) return 6 - return 99 + if (relativePath === "index.md") return 0; + if (relativePath.startsWith("lectures/")) return 1; + if (relativePath.startsWith("projects/")) return 2; + if (relativePath === "resources/index.md") return 3; + if (relativePath.startsWith("resources/templates/")) return 4; + if (relativePath.startsWith("resources/reference/")) return 5; + if (relativePath.startsWith("resources/openai-advanced/")) return 6; + return 99; } function sourceFileToRoutePath(language: Language, filePath: string) { - const languageRoot = path.resolve(docsRoot, language) - const relativePath = path.relative(languageRoot, filePath).replace(/\\/g, '/') + const languageRoot = path.resolve(docsRoot, language); + const relativePath = path + .relative(languageRoot, filePath) + .replace(/\\/g, "/"); - if (relativePath === 'index.md') { - return `/${language}/` + if (relativePath === "index.md") { + return `/${language}/`; } - if (relativePath.endsWith('/index.md')) { - return `/${language}/${relativePath.slice(0, -'index.md'.length)}` + if (relativePath.endsWith("/index.md")) { + return `/${language}/${relativePath.slice(0, -"index.md".length)}`; } - return `/${language}/${relativePath.replace(/\.md$/, '')}` + return `/${language}/${relativePath.replace(/\.md$/, "")}`; } function resolveStaticFilePath(rootDir: string, pathname: string) { - const normalizedPath = pathname.replace(/\/+/g, '/') + const normalizedPath = pathname.replace(/\/+/g, "/"); if (!normalizedPath.startsWith(docsBasePath)) { - return null + return null; } - const relativePath = normalizedPath.slice(docsBasePath.length).replace(/^\/+/, '') - const candidates = buildPathCandidates(rootDir, relativePath) - return candidates.find((candidate) => existsSync(candidate)) || null + const relativePath = normalizedPath + .slice(docsBasePath.length) + .replace(/^\/+/, ""); + const candidates = buildPathCandidates(rootDir, relativePath); + return candidates.find((candidate) => existsSync(candidate)) || null; } function buildPathCandidates(rootDir: string, relativePath: string) { if (!relativePath) { - return [path.join(rootDir, 'index.html')] + return [path.join(rootDir, "index.html")]; } - if (relativePath.endsWith('/')) { - return [path.join(rootDir, relativePath, 'index.html')] + if (relativePath.endsWith("/")) { + return [path.join(rootDir, relativePath, "index.html")]; } if (path.extname(relativePath)) { - return [path.join(rootDir, relativePath)] + return [path.join(rootDir, relativePath)]; } return [ path.join(rootDir, `${relativePath}.html`), - path.join(rootDir, relativePath, 'index.html') - ] + path.join(rootDir, relativePath, "index.html"), + ]; } diff --git a/scripts/new-course.mjs b/scripts/new-course.mjs new file mode 100644 index 00000000..8c3ebef5 --- /dev/null +++ b/scripts/new-course.mjs @@ -0,0 +1,367 @@ +import fs from "node:fs"; +import path from "node:path"; +import process from "node:process"; +import { execSync } from "node:child_process"; + +const repoRoot = process.cwd(); +const coursesDir = path.join(repoRoot, "courses"); + +function printUsage() { + console.log("Usage:"); + console.log(" npm run course:new -- [Course Title]"); +} + +function toTitleCase(slug) { + return slug + .split("-") + .filter(Boolean) + .map((part) => part.charAt(0).toUpperCase() + part.slice(1)) + .join(" "); +} + +function toCourseDescription(title) { + return `A customizable course built with the course-builder platform for ${title}.`; +} + +function escapeForJs(value) { + return value.replaceAll("\\", "\\\\").replaceAll("'", "\\'"); +} + +function getRepoTreeUrl() { + try { + const remoteUrl = execSync("git remote get-url origin", { + cwd: repoRoot, + encoding: "utf8", + }).trim(); + + if (remoteUrl.startsWith("https://github.com/")) { + return `${remoteUrl.replace(/\.git$/, "")}/tree/main`; + } + + const sshMatch = remoteUrl.match(/^git@github\.com:(.+?)(?:\.git)?$/); + if (sshMatch) { + return `https://github.com/${sshMatch[1]}/tree/main`; + } + } catch { + // Fall back to the placeholder repository URL below. + } + + return "https://github.com/your-org/course-builder/tree/main"; +} + +function buildManifest({ title, description, repoTreeUrl }) { + return `const courseManifest = { + site: { + title: '${escapeForJs(title)}', + description: + '${escapeForJs(description)}', + base: '/course-builder/', + repoTreeUrl: '${escapeForJs(repoTreeUrl)}' + }, + brand: { + logo: + 'data:image/svg+xml;utf8,' + }, + theme: { + fontStylesheets: [ + 'https://fonts.googleapis.com/css2?family=Newsreader:opsz,wght@6..72,400;6..72,600&family=Plus+Jakarta+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap' + ], + typography: { + body: + "'Plus Jakarta Sans', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif", + heading: + "'Newsreader', ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif", + mono: + "'JetBrains Mono', 'Fira Code', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace", + mermaid: "'Plus Jakarta Sans', sans-serif" + }, + layout: { + maxWidth: '1280px', + sidebarWidth: '280px', + cardRadius: '14px' + }, + effects: { + featureShadow: '0 18px 48px rgba(26, 127, 100, 0.14)', + featureShadowDark: '0 18px 48px rgba(0, 0, 0, 0.4)' + }, + colors: { + light: { + bg: '#F6FBF8', + bgAlt: '#ECF5F0', + bgElevated: '#FFFFFF', + bgSoft: '#ECF5F0', + text1: '#142019', + text2: '#355244', + text3: '#5B7669', + brand1: '#1A7F64', + brand2: '#126A53', + brand3: '#0B5542', + brandSoft: 'rgba(26, 127, 100, 0.12)', + divider: 'rgba(8, 32, 20, 0.1)', + sidebarBg: '#ECF5F0', + navBg: '#F6FBF8' + }, + dark: { + bg: '#0E1712', + bgAlt: '#0A120D', + bgElevated: '#17221C', + bgSoft: '#0A120D', + text1: '#E7F2EC', + text2: '#B7CEC1', + text3: '#87A294', + brand1: '#49AF8B', + brand2: '#329675', + brand3: '#24775D', + brandSoft: 'rgba(73, 175, 139, 0.16)', + divider: 'rgba(255, 255, 255, 0.12)', + sidebarBg: '#0A120D', + navBg: '#0E1712' + } + } + }, + locales: [ + { + key: 'en', + label: 'English', + lang: 'en', + labels: { + lectures: 'Modules', + projects: 'Projects', + resources: 'Resources', + skills: 'Guides', + resourceLibrary: 'Resource Library', + tryHarness: 'Open Templates ↗' + } + } + ], + curriculum: { + en: { + lectures: [ + { text: 'Welcome', link: '/en/' }, + { text: 'Module 1', link: '/en/lectures/module-01/' }, + { text: 'Module 2', link: '/en/lectures/module-02/' } + ], + projects: [ + { text: 'Overview', link: '/en/projects/' }, + { text: 'Project 1', link: '/en/projects/project-01/' } + ], + resources: [ + { text: 'Overview', link: '/en/resources/' }, + { text: 'Templates', link: '/en/resources/templates/' }, + { text: 'Reference', link: '/en/resources/reference/' }, + { text: 'Advanced', link: '/en/resources/openai-advanced/' } + ], + skills: [{ text: 'Guides', link: '/en/skills/' }] + } + }, + homeByLocale: { + en: { + hero: { + title: 'Welcome to ${escapeForJs(title)}', + intro: [ + 'This is a scaffolded course created by course-builder.', + 'Use this starter to replace the sample modules, projects, and resources with your own curriculum.' + ], + references: [ + { + label: 'Builder repository', + href: '${escapeForJs(repoTreeUrl.replace(/\/tree\/main$/, ""))}' + } + ] + }, + sections: { + start: 'Start here', + mechanism: 'Course map', + learn: 'You will cover', + next: 'Next steps' + }, + startText: + 'This starter course is intentionally minimal so you can adapt it quickly.', + cards: [ + { + title: 'Modules', + body: 'Teach the core ideas in a few compact lessons.', + href: './lectures/module-01/' + }, + { + title: 'Projects', + body: 'Add hands-on work that proves understanding.', + href: './projects/' + }, + { + title: 'Resources', + body: 'Keep templates, references, and supporting material together.', + href: './resources/' + } + ], + mechanismText: + 'A good course structure connects concept, practice, and reusable material.', + mechanismMermaid: \`graph LR + A["Concept"] --> B["Practice"] + B --> C["Reference"] + C --> D["Iteration"]\`, + learnItems: [ + 'Customize the branding and messaging.', + 'Replace the sample curriculum with your own structure.', + 'Add markdown content under courses//docs.' + ], + nextIntro: 'Replace these sample entry points with your real course flow.', + nextSteps: [ + { + title: 'Module 1', + description: 'Start by replacing the first module.', + href: './lectures/module-01/' + }, + { + title: 'Project 1', + description: 'Add the first applied exercise.', + href: './projects/project-01/' + } + ] + } + } +}; + +export default courseManifest; +`; +} + +function buildRootIndex() { + return `--- +layout: page +--- + + + +
    +

    Loading...

    +
    +`; +} + +function buildFileMap(title) { + return new Map([ + ["index.md", buildRootIndex()], + ["en/index.md", "\n"], + [ + "en/lectures/module-01/index.md", + `# Module 1 + +Introduce the first core concept for ${title}. + +## Goal + +Explain what learners should understand after this module. +`, + ], + [ + "en/lectures/module-02/index.md", + `# Module 2 + +Use this module to deepen the course after the opening lesson. +`, + ], + [ + "en/projects/index.md", + `# Projects + +Use projects to turn the course material into real output. +`, + ], + [ + "en/projects/project-01/index.md", + `# Project 1 + +Define the first practical exercise for ${title}. +`, + ], + [ + "en/resources/index.md", + `# Resources + +Keep templates, references, and extra material here. +`, + ], + [ + "en/resources/templates/index.md", + `# Templates + +Add copy-ready assets that students can reuse directly. +`, + ], + [ + "en/resources/reference/index.md", + `# Reference + +Store short supporting notes, definitions, and checklists here. +`, + ], + [ + "en/resources/openai-advanced/index.md", + `# Advanced + +Use this section for deeper material once the core course is stable. +`, + ], + [ + "en/skills/index.md", + `# Guides + +Use this section for operating guides, playbooks, or reusable teaching aids. +`, + ], + ]); +} + +const args = process.argv.slice(2); +const slug = args[0]; +const title = args.slice(1).join(" ").trim() || (slug ? toTitleCase(slug) : ""); + +if (!slug) { + printUsage(); + process.exit(1); +} + +if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(slug)) { + console.error(`Invalid course slug: ${slug}`); + console.error("Use lowercase letters, numbers, and hyphens only."); + process.exit(1); +} + +const courseDir = path.join(coursesDir, slug); +if (fs.existsSync(courseDir)) { + console.error(`Course already exists: courses/${slug}`); + process.exit(1); +} + +const docsDir = path.join(courseDir, "docs"); +fs.mkdirSync(docsDir, { recursive: true }); + +for (const [relativePath, contents] of buildFileMap(title)) { + const targetPath = path.join(docsDir, relativePath); + fs.mkdirSync(path.dirname(targetPath), { recursive: true }); + fs.writeFileSync(targetPath, contents, "utf8"); +} + +fs.writeFileSync( + path.join(courseDir, "course.manifest.mjs"), + buildManifest({ + title, + description: toCourseDescription(title), + repoTreeUrl: getRepoTreeUrl(), + }), + "utf8", +); + +console.log(`Created course scaffold: courses/${slug}`); +console.log(`Title: ${title}`); +console.log(""); +console.log("Next steps:"); +console.log(`- npm run course:activate -- ${slug}`); +console.log(`- edit courses/${slug}/course.manifest.mjs`); +console.log(`- replace the sample markdown under courses/${slug}/docs`); diff --git a/scripts/set-active-course.mjs b/scripts/set-active-course.mjs index 443d4c27..d4c18057 100644 --- a/scripts/set-active-course.mjs +++ b/scripts/set-active-course.mjs @@ -4,7 +4,10 @@ import process from "node:process"; const repoRoot = process.cwd(); const coursesDir = path.join(repoRoot, "courses"); -const activeCourseFile = path.join(repoRoot, "docs/.vitepress/active-course.mjs"); +const activeCourseFile = path.join( + repoRoot, + "docs/.vitepress/active-course.mjs", +); function listCourseSlugs() { if (!fs.existsSync(coursesDir)) return []; @@ -13,7 +16,9 @@ function listCourseSlugs() { .readdirSync(coursesDir, { withFileTypes: true }) .filter((entry) => entry.isDirectory()) .map((entry) => entry.name) - .filter((slug) => fs.existsSync(path.join(coursesDir, slug, "course.manifest.mjs"))) + .filter((slug) => + fs.existsSync(path.join(coursesDir, slug, "course.manifest.mjs")), + ) .sort(); } @@ -21,6 +26,8 @@ function buildActiveCourseModule(slug) { return `import courseManifest from "../../courses/${slug}/course.manifest.mjs"; export const ACTIVE_COURSE_SLUG = "${slug}"; +export const ACTIVE_COURSE_CONTENT_DIR = "../courses/${slug}/docs"; +export const ACTIVE_COURSE_REPO_CONTENT_PREFIX = "courses/${slug}/docs"; export default courseManifest; `; @@ -61,5 +68,12 @@ if (!availableCourses.includes(slug)) { process.exit(1); } +const courseDocsDir = path.join(coursesDir, slug, "docs"); + +if (!fs.existsSync(courseDocsDir)) { + console.error(`Course is missing docs directory: courses/${slug}/docs`); + process.exit(1); +} + fs.writeFileSync(activeCourseFile, buildActiveCourseModule(slug), "utf8"); console.log(`Active course set to: ${slug}`); diff --git a/tests/course-branding.test.mjs b/tests/course-branding.test.mjs index 6708cee1..cc0ef460 100644 --- a/tests/course-branding.test.mjs +++ b/tests/course-branding.test.mjs @@ -3,26 +3,30 @@ import assert from "node:assert/strict"; import bootcampManifest from "../courses/agent-ops-bootcamp/course.manifest.mjs"; import courseManifest from "../docs/.vitepress/course.manifest.mjs"; -import { ACTIVE_COURSE_SLUG } from "../docs/.vitepress/active-course.mjs"; +import { + ACTIVE_COURSE_CONTENT_DIR, + ACTIVE_COURSE_REPO_CONTENT_PREFIX, + ACTIVE_COURSE_SLUG, +} from "../docs/.vitepress/active-course.mjs"; import courseConfig from "../docs/.vitepress/course.config.mjs"; import { buildCourseCssTokens, buildFontStylesheetLinks, - buildMermaidThemeVariables + buildMermaidThemeVariables, } from "../docs/.vitepress/course-branding.mjs"; import { getCourseHome, - resolveCourseLocale + resolveCourseLocale, } from "../docs/.vitepress/course-content.mjs"; import { buildLocaleThemeConfig, - createLocaleDefinition + createLocaleDefinition, } from "../docs/.vitepress/course-navigation.mjs"; import { getLocaleSourceItems } from "../docs/.vitepress/course-curriculum.mjs"; import { createEnglishLocaleMeta, createLabels, - createSourceItems + createSourceItems, } from "./helpers/fixtures.mjs"; test("course config exposes the minimum whitelabel surface", () => { @@ -44,13 +48,21 @@ test("course manifest centralizes product config in one source", () => { assert.ok(courseManifest.curriculum.en); assert.ok(courseManifest.homeByLocale.en); assert.equal(typeof ACTIVE_COURSE_SLUG, "string"); + assert.match(ACTIVE_COURSE_CONTENT_DIR, /^\.\.\/courses\/.+\/docs$/); + assert.equal( + ACTIVE_COURSE_REPO_CONTENT_PREFIX, + `courses/${ACTIVE_COURSE_SLUG}/docs`, + ); }); test("platform can load a second course manifest with distinct branding and curriculum", () => { assert.equal(bootcampManifest.site.title, "Agent Ops Bootcamp"); - assert.equal(bootcampManifest.site.base, "/agent-ops-bootcamp/"); + assert.equal(bootcampManifest.site.base, "/course-builder/"); assert.equal(bootcampManifest.locales[0].labels.lectures, "Modules"); - assert.equal(bootcampManifest.curriculum.en.projects[1].text, "Incident Drill"); + assert.equal( + bootcampManifest.curriculum.en.projects[1].text, + "Incident Drill", + ); assert.equal(bootcampManifest.homeByLocale.en.cards[0].title, "Modules"); }); @@ -62,26 +74,47 @@ test("buildFontStylesheetLinks converts font urls into VitePress head tags", () "link", { rel: "stylesheet", - href: courseConfig.theme.fontStylesheets[0] - } + href: courseConfig.theme.fontStylesheets[0], + }, ]); }); test("buildCourseCssTokens maps branding into CSS custom properties", () => { const tokens = buildCourseCssTokens(courseConfig); - assert.equal(tokens["--course-font-body"], courseConfig.theme.typography.body); - assert.equal(tokens["--course-font-heading"], courseConfig.theme.typography.heading); - assert.equal(tokens["--course-light-brand-1"], courseConfig.theme.colors.light.brand1); - assert.equal(tokens["--course-dark-brand-1"], courseConfig.theme.colors.dark.brand1); - assert.equal(tokens["--course-sidebar-width"], courseConfig.theme.layout.sidebarWidth); + assert.equal( + tokens["--course-font-body"], + courseConfig.theme.typography.body, + ); + assert.equal( + tokens["--course-font-heading"], + courseConfig.theme.typography.heading, + ); + assert.equal( + tokens["--course-light-brand-1"], + courseConfig.theme.colors.light.brand1, + ); + assert.equal( + tokens["--course-dark-brand-1"], + courseConfig.theme.colors.dark.brand1, + ); + assert.equal( + tokens["--course-sidebar-width"], + courseConfig.theme.layout.sidebarWidth, + ); }); test("buildMermaidThemeVariables uses course colors and fonts", () => { const mermaidTheme = buildMermaidThemeVariables(courseConfig); - assert.equal(mermaidTheme.primaryColor, courseConfig.theme.colors.light.bgAlt); - assert.equal(mermaidTheme.primaryTextColor, courseConfig.theme.colors.light.text1); + assert.equal( + mermaidTheme.primaryColor, + courseConfig.theme.colors.light.bgAlt, + ); + assert.equal( + mermaidTheme.primaryTextColor, + courseConfig.theme.colors.light.text1, + ); assert.equal(mermaidTheme.lineColor, courseConfig.theme.colors.light.text3); assert.equal(mermaidTheme.fontFamily, courseConfig.theme.typography.mermaid); }); @@ -96,13 +129,19 @@ test("resolveCourseLocale falls back to english when locale is missing", () => { test("getCourseHome returns localized course landing content", () => { const englishHome = getCourseHome("en"); - assert.equal(englishHome.hero.title, courseManifest.homeByLocale.en.hero.title); + assert.equal( + englishHome.hero.title, + courseManifest.homeByLocale.en.hero.title, + ); assert.ok(englishHome.cards.length >= 3); assert.ok(englishHome.nextSteps.length >= 2); if (courseManifest.homeByLocale.ko) { const koreanHome = getCourseHome("ko"); - assert.equal(koreanHome.hero.title, courseManifest.homeByLocale.ko.hero.title); + assert.equal( + koreanHome.hero.title, + courseManifest.homeByLocale.ko.hero.title, + ); } }); @@ -114,25 +153,26 @@ test("buildLocaleThemeConfig creates nav and sidebar from labels and source item resources: "리소스", skills: "스킬", resourceLibrary: "리소스 모음", - tryHarness: "실습하기 ↗" + tryHarness: "실습하기 ↗", }); const themeConfig = buildLocaleThemeConfig({ locale: "ko", sourceItems, labels, - repoTreeUrl: courseConfig.site.repoTreeUrl + repoTreeUrl: courseConfig.site.repoTreeUrl, + repoContentPrefix: ACTIVE_COURSE_REPO_CONTENT_PREFIX, }); assert.equal(themeConfig.nav[0].text, "강의"); assert.equal( themeConfig.nav[0].link, - sourceItems.lectures[1].link.replace("/en/", "/ko/") + sourceItems.lectures[1].link.replace("/en/", "/ko/"), ); assert.equal(themeConfig.sidebar["/ko/projects/"][0].text, "프로젝트"); assert.equal( themeConfig.nav[4].link, - `${courseConfig.site.repoTreeUrl.replace(/\/tree\/main$/, "/blob/main")}/docs/ko/resources/templates/index.md` + `${courseConfig.site.repoTreeUrl.replace(/\/tree\/main$/, "/blob/main")}/${ACTIVE_COURSE_REPO_CONTENT_PREFIX}/ko/resources/templates/index.md`, ); }); @@ -144,7 +184,7 @@ test("createLocaleDefinition wraps locale metadata with generated theme config", resources: "Library", skills: "Skills", resourceLibrary: "Resource Library", - tryHarness: "Try Harness ↗" + tryHarness: "Try Harness ↗", }); const localeDefinition = createLocaleDefinition({ @@ -152,7 +192,8 @@ test("createLocaleDefinition wraps locale metadata with generated theme config", ...createEnglishLocaleMeta(), sourceItems, labels, - repoTreeUrl: courseConfig.site.repoTreeUrl + repoTreeUrl: courseConfig.site.repoTreeUrl, + repoContentPrefix: ACTIVE_COURSE_REPO_CONTENT_PREFIX, }); assert.equal(localeDefinition.label.length > 0, true); @@ -164,11 +205,20 @@ test("getLocaleSourceItems returns course structure by locale with english fallb const english = getLocaleSourceItems("en"); const fallback = getLocaleSourceItems("pt-BR"); - assert.equal(english.lectures[1].text, courseManifest.curriculum.en.lectures[1].text); - assert.equal(fallback.skills[0].text, courseManifest.curriculum.en.skills[0].text); + assert.equal( + english.lectures[1].text, + courseManifest.curriculum.en.lectures[1].text, + ); + assert.equal( + fallback.skills[0].text, + courseManifest.curriculum.en.skills[0].text, + ); if (courseManifest.curriculum.ko) { const korean = getLocaleSourceItems("ko"); - assert.equal(korean.projects[1].text, courseManifest.curriculum.ko.projects[1].text); + assert.equal( + korean.projects[1].text, + courseManifest.curriculum.ko.projects[1].text, + ); } }); diff --git a/tests/helpers/fixtures.mjs b/tests/helpers/fixtures.mjs index eea9e8ad..4918e407 100644 --- a/tests/helpers/fixtures.mjs +++ b/tests/helpers/fixtures.mjs @@ -12,11 +12,11 @@ export function createSourceItems() { return { lectures: [ { text: faker.lorem.word(), link: "/en/" }, - { text: lectureTitle, link: `/en/lectures/${lectureSlug}/` } + { text: lectureTitle, link: `/en/lectures/${lectureSlug}/` }, ], projects: [{ text: projectTitle, link: "/en/projects/" }], resources: [{ text: resourceTitle, link: "/en/resources/" }], - skills: [{ text: skillTitle, link: "/en/skills/" }] + skills: [{ text: skillTitle, link: "/en/skills/" }], }; } @@ -28,13 +28,13 @@ export function createLabels(overrides = {}) { skills: faker.lorem.word(), resourceLibrary: faker.lorem.words({ min: 1, max: 2 }), tryHarness: `${faker.lorem.words({ min: 1, max: 2 })} ↗`, - ...overrides + ...overrides, }; } export function createEnglishLocaleMeta() { return { label: faker.location.country(), - lang: faker.helpers.arrayElement(["en", "en-US", "en-GB"]) + lang: faker.helpers.arrayElement(["en", "en-US", "en-GB"]), }; }