Skip to content

Commit 4ac3391

Browse files
authored
Merge pull request #6 from aliaksei-loi/add-russian-locale
add Russian (ru) locale
2 parents 92c1588 + 1722a9a commit 4ac3391

113 files changed

Lines changed: 6575 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

docs/.vitepress/config.mts

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,43 @@ const enSkillItems = [
8080
{ text: "Skills Overview", link: "/en/skills/" }
8181
];
8282

83+
const ruLectureItems = [
84+
{ text: "Добро пожаловать", link: "/ru/" },
85+
{ text: "Сильная модель ≠ надёжное исполнение", link: "/ru/lectures/lecture-01-why-capable-agents-still-fail/" },
86+
{ text: "Что такое harness на самом деле", link: "/ru/lectures/lecture-02-what-a-harness-actually-is/" },
87+
{ text: "Репозиторий как единый источник правды", link: "/ru/lectures/lecture-03-why-the-repository-must-become-the-system-of-record/" },
88+
{ text: "Почему один большой файл инструкций не работает", link: "/ru/lectures/lecture-04-why-one-giant-instruction-file-fails/" },
89+
{ text: "Как сохранять контекст между сессиями", link: "/ru/lectures/lecture-05-why-long-running-tasks-lose-continuity/" },
90+
{ text: "Зачем инициализация — отдельная фаза", link: "/ru/lectures/lecture-06-why-initialization-needs-its-own-phase/" },
91+
{ text: "Почему агенты делают слишком много или слишком мало", link: "/ru/lectures/lecture-07-why-agents-overreach-and-under-finish/" },
92+
{ text: "Списки фич как примитивы harness", link: "/ru/lectures/lecture-08-why-feature-lists-are-harness-primitives/" },
93+
{ text: "Почему агенты слишком рано объявляют успех", link: "/ru/lectures/lecture-09-why-agents-declare-victory-too-early/" },
94+
{ text: "Только сквозной прогон — настоящая проверка", link: "/ru/lectures/lecture-10-why-end-to-end-testing-changes-results/" },
95+
{ text: "Наблюдаемость — часть harness", link: "/ru/lectures/lecture-11-why-observability-belongs-inside-the-harness/" },
96+
{ text: "Каждая сессия должна оставлять чистое состояние", link: "/ru/lectures/lecture-12-why-every-session-must-leave-a-clean-state/" }
97+
];
98+
99+
const ruProjectItems = [
100+
{ text: "Добро пожаловать", link: "/ru/projects/" },
101+
{ text: "Только промпты vs правила", link: "/ru/projects/project-01-baseline-vs-minimal-harness/" },
102+
{ text: "Рабочее пространство для агента", link: "/ru/projects/project-02-agent-readable-workspace/" },
103+
{ text: "Непрерывность между сессиями", link: "/ru/projects/project-03-multi-session-continuity/" },
104+
{ text: "Обратная связь и контроль скоупа", link: "/ru/projects/project-04-incremental-indexing/" },
105+
{ text: "Самопроверка и обоснованные ответы", link: "/ru/projects/project-05-grounded-qa-verification/" },
106+
{ text: "Полный harness (капстоун)", link: "/ru/projects/project-06-runtime-observability-and-debugging/" }
107+
];
108+
109+
const ruResourceItems = [
110+
{ text: "Обзор", link: "/ru/resources/" },
111+
{ text: "Шаблоны", link: "/ru/resources/templates/" },
112+
{ text: "Справочник", link: "/ru/resources/reference/" },
113+
{ text: "Расширенный пакет", link: "/ru/resources/openai-advanced/" }
114+
];
115+
116+
const ruSkillItems = [
117+
{ text: "Обзор скиллов", link: "/ru/skills/" }
118+
];
119+
83120
export default withMermaid(
84121
defineConfig({
85122
base: docsBase,
@@ -183,6 +220,43 @@ export default withMermaid(
183220
darkModeSwitchTitle: "切换到深色模式",
184221
socialLinks: [{ icon: "github", link: githubRepoTreeLink }]
185222
}
223+
},
224+
ru: {
225+
label: "Русский",
226+
lang: "ru",
227+
link: "/ru/",
228+
themeConfig: {
229+
nav: [
230+
{ text: "Лекции", link: ruLectureItems[1].link, activeMatch: '^/ru/(lectures/.*)?$' },
231+
{ text: "Проекты", link: ruProjectItems[0].link, activeMatch: '^/ru/projects/' },
232+
{ text: "Материалы", link: "/ru/resources/", activeMatch: '^/ru/resources/' },
233+
{ text: "Скиллы", link: "/ru/skills/", activeMatch: '^/ru/skills/' },
234+
{ text: "Try Harness ↗", link: "https://github.com/walkinglabs/learn-harness-engineering/blob/main/docs/ru/resources/templates/index.md", target: "_blank", rel: "noopener noreferrer" }
235+
],
236+
sidebar: {
237+
'/ru/projects/': [{ text: "Проекты", items: ruProjectItems }],
238+
'/ru/resources/': [{ text: "Материалы", items: ruResourceItems }],
239+
'/ru/skills/': [{ text: "Скиллы", items: ruSkillItems }],
240+
'/ru/': [{ text: "Лекции", items: ruLectureItems }]
241+
},
242+
outline: {
243+
level: [2, 3],
244+
label: "На этой странице"
245+
},
246+
docFooter: {
247+
prev: "Предыдущая",
248+
next: "Следующая"
249+
},
250+
lastUpdated: {
251+
text: "Последнее обновление"
252+
},
253+
returnToTopLabel: "Наверх",
254+
sidebarMenuLabel: "Меню",
255+
darkModeSwitchLabel: "Тема",
256+
lightModeSwitchTitle: "Включить светлую тему",
257+
darkModeSwitchTitle: "Включить тёмную тему",
258+
socialLinks: [{ icon: "github", link: githubRepoTreeLink }]
259+
}
186260
}
187261
}
188262
}));

docs/ru/index.md

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# Добро пожаловать в Learn Harness Engineering
2+
3+
Learn Harness Engineering — курс, посвящённый инженерии AI-агентов для кодинга. Мы глубоко изучили и обобщили самые передовые теории и практики Harness Engineering в индустрии. Наши основные источники:
4+
- [OpenAI: Harness engineering: leveraging Codex in an agent-first world](https://openai.com/index/harness-engineering/)
5+
- [Anthropic: Effective harnesses for long-running agents](https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents)
6+
- [Anthropic: Harness design for long-running application development](https://www.anthropic.com/engineering/harness-design-long-running-apps)
7+
- [Awesome Harness Engineering](https://github.com/walkinglabs/awesome-harness-engineering)
8+
9+
Через системный дизайн окружения, управление состоянием, верификацию и контроль курс учит, как сделать агентские инструменты вроде Codex и Claude Code по-настоящему надёжными. Он помогает строить фичи, чинить баги и автоматизировать задачи разработки, ограничивая AI-ассистента явными правилами и границами.
10+
11+
## С чего начать
12+
13+
Выберите свой путь обучения. Курс разделён на теоретические лекции, практические проекты и готовую к копированию библиотеку материалов.
14+
15+
<div class="card-grid">
16+
<a href="./lectures/lecture-01-why-capable-agents-still-fail/" class="card">
17+
<h3>Лекции</h3>
18+
<p>Поймите, почему сильные модели всё равно ошибаются, и изучите теорию эффективных harness.</p>
19+
</a>
20+
<a href="./projects/" class="card">
21+
<h3>Проекты</h3>
22+
<p>Практическое построение надёжной агентской среды с нуля.</p>
23+
</a>
24+
<a href="./resources/" class="card">
25+
<h3>Библиотека материалов</h3>
26+
<p>Готовые шаблоны (AGENTS.md, feature_list.json) для использования в своих репозиториях.</p>
27+
</a>
28+
</div>
29+
30+
## Основной механизм harness
31+
32+
Harness не «делает модель умнее» — он создаёт для неё замкнутую **рабочую систему**. Основной поток работы можно понять по этой простой диаграмме:
33+
34+
```mermaid
35+
graph TD
36+
A["Чёткая цель<br/>AGENTS.md"] --> B("Инициализация<br/>init.sh")
37+
B --> C{"Выполнение задач<br/>AI Agent"}
38+
C -->|Возникла проблема| D["Обратная связь<br/>CLI / Логи"]
39+
D -->|Автоисправление| C
40+
C -->|Код готов| E{"Проверка и QA<br/>Тесты"}
41+
E -->|Провал| D
42+
E -->|Пройдено| F["Очистка и передача<br/>claude-progress.md"]
43+
44+
classDef primary fill:#D95C41,stroke:#C14E36,color:#fff,font-weight:bold;
45+
classDef process fill:#F4F3EE,stroke:#D1D1D1,color:#1A1A1A;
46+
classDef check fill:#EAE8E1,stroke:#B3B3B3,color:#1A1A1A;
47+
48+
class A,F primary;
49+
class B,D process;
50+
class C,E check;
51+
```
52+
53+
## Что вы узнаете
54+
55+
Ключевые концепции, которыми вы овладеете:
56+
57+
<ul class="index-list">
58+
<li><strong>Ограничивать поведение агента</strong> явными правилами и границами.</li>
59+
<li><strong>Сохранять контекст</strong> в длительных задачах между сессиями.</li>
60+
<li><strong>Не давать агенту</strong> объявлять успех слишком рано.</li>
61+
<li><strong>Верифицировать работу</strong> через сквозные тесты и саморефлексию.</li>
62+
<li><strong>Делать runtime наблюдаемым</strong> и отлаживаемым.</li>
63+
</ul>
64+
65+
## Дальнейшие шаги
66+
67+
Когда вы поймёте основы, эти материалы помогут углубиться:
68+
69+
<ul class="index-list">
70+
<li><a href="./lectures/lecture-01-why-capable-agents-still-fail/">Лекция 01: Почему сильные агенты всё равно ошибаются</a>: начните с теории harness engineering.</li>
71+
<li><a href="./projects/project-01-baseline-vs-minimal-harness/">Проект 01: Базовый vs минимальный harness</a>: пройдите первое реальное задание.</li>
72+
<li><a href="./resources/templates/">Шаблоны</a>: возьмите минимальный набор (AGENTS.md, feature_list.json, claude-progress.md) для своих проектов.</li>
73+
</ul>
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
/**
2+
* failure-pattern-demo.ts
3+
*
4+
* Simulates the 4-step failure pattern that capable agents fall into:
5+
* 1. Incomplete context
6+
* 2. Locally reasonable changes
7+
* 3. No global verification
8+
* 4. Premature completion
9+
*
10+
* Run: npx tsx docs/lectures/lecture-01-why-capable-agents-still-fail/code/failure-pattern-demo.ts
11+
*/
12+
13+
// ---------------------------------------------------------------------------
14+
// Types
15+
// ---------------------------------------------------------------------------
16+
17+
interface StepState {
18+
step: number;
19+
name: string;
20+
contextAvailable: string[];
21+
contextMissing: string[];
22+
actionTaken: string;
23+
localOutcome: string;
24+
globalImpact: string;
25+
completed: boolean;
26+
}
27+
28+
// ---------------------------------------------------------------------------
29+
// Simulated "model" -- a simple decision function that bases its output
30+
// solely on whatever context it has been given.
31+
// ---------------------------------------------------------------------------
32+
33+
function modelDecide(context: string[], task: string): string {
34+
const has = (s: string) => context.some((c) => c.includes(s));
35+
36+
// The task is to "add a search endpoint to the API".
37+
// Correct answer requires knowing about auth middleware and rate limiting.
38+
39+
if (!has("auth")) {
40+
return "Created new route handler /search without authentication checks";
41+
}
42+
if (!has("rate-limit")) {
43+
return "Added search route with auth but forgot rate limiting";
44+
}
45+
if (!has("test-standards")) {
46+
return "Implemented search with auth and rate-limit, but no tests";
47+
}
48+
return "Fully implemented search endpoint with auth, rate-limit, and tests";
49+
}
50+
51+
// ---------------------------------------------------------------------------
52+
// Failure simulation
53+
// ---------------------------------------------------------------------------
54+
55+
function simulateFailurePattern(): StepState[] {
56+
const steps: StepState[] = [];
57+
58+
// ---- Step 1: Incomplete Context ----
59+
const step1Context = ["project structure", "route definitions"];
60+
const step1Missing = ["auth middleware", "rate-limiting policy", "test standards"];
61+
const step1Decision = modelDecide(step1Context, "add search endpoint");
62+
63+
steps.push({
64+
step: 1,
65+
name: "Incomplete Context",
66+
contextAvailable: step1Context,
67+
contextMissing: step1Missing,
68+
actionTaken: step1Decision,
69+
localOutcome: "Looks good -- route compiles, returns data",
70+
globalImpact: "Missing auth means unauthenticated access to search",
71+
completed: false,
72+
});
73+
74+
// ---- Step 2: Locally Reasonable Changes ----
75+
// The agent adds auth after a hint, but still lacks other context.
76+
const step2Context = [...step1Context, "auth middleware"];
77+
const step2Missing = ["rate-limiting policy", "test standards"];
78+
const step2Decision = modelDecide(step2Context, "add search endpoint");
79+
80+
steps.push({
81+
step: 2,
82+
name: "Locally Reasonable Changes",
83+
contextAvailable: step2Context,
84+
contextMissing: step2Missing,
85+
actionTaken: step2Decision,
86+
localOutcome: "Route has auth -- looks complete locally",
87+
globalImpact: "No rate limiting means the endpoint can be abused",
88+
completed: false,
89+
});
90+
91+
// ---- Step 3: No Global Verification ----
92+
const step3Context = [...step2Context, "rate-limiting policy"];
93+
const step3Missing = ["test standards"];
94+
const step3Decision = modelDecide(step3Context, "add search endpoint");
95+
96+
steps.push({
97+
step: 3,
98+
name: "No Global Verification",
99+
contextAvailable: step3Context,
100+
contextMissing: step3Missing,
101+
actionTaken: step3Decision,
102+
localOutcome: "Feature appears fully implemented",
103+
globalImpact: "No tests -- regression risk, violates project standards",
104+
completed: false,
105+
});
106+
107+
// ---- Step 4: Premature Completion ----
108+
steps.push({
109+
step: 4,
110+
name: "Premature Completion",
111+
contextAvailable: step3Context,
112+
contextMissing: step3Missing,
113+
actionTaken: 'Agent outputs: "Done. Added search endpoint."',
114+
localOutcome: "Agent is satisfied, task marked complete",
115+
globalImpact: "Task is incomplete -- missing tests, no E2E verification",
116+
completed: true,
117+
});
118+
119+
return steps;
120+
}
121+
122+
// ---------------------------------------------------------------------------
123+
// Comparison table
124+
// ---------------------------------------------------------------------------
125+
126+
function printComparisonTable(steps: StepState[]): void {
127+
console.log("\n" + "=".repeat(90));
128+
console.log(" FAILURE PATTERN DEMO -- 4 Steps to a Broken Deliverable");
129+
console.log("=".repeat(90));
130+
131+
for (const s of steps) {
132+
console.log(`\n Step ${s.step}: ${s.name}`);
133+
console.log(" " + "-".repeat(60));
134+
console.log(` Context available : ${s.contextAvailable.join(", ")}`);
135+
console.log(` Context missing : ${s.contextMissing.join(", ") || "(none)"}`);
136+
console.log(` Action taken : ${s.actionTaken}`);
137+
console.log(` Local outcome : ${s.localOutcome}`);
138+
console.log(` Global impact : ${s.globalImpact}`);
139+
console.log(` Marked complete? : ${s.completed ? "YES (premature)" : "No"}`);
140+
}
141+
142+
// Summary comparison
143+
console.log("\n" + "=".repeat(90));
144+
console.log(" COMPARISON: What the agent saw vs. what was actually needed");
145+
console.log("=".repeat(90));
146+
147+
const totalRequired = ["project structure", "route definitions", "auth middleware", "rate-limiting policy", "test standards"];
148+
const finalAvailable = steps[steps.length - 1].contextAvailable;
149+
150+
const header = "| Criterion | Available | Missing | Status |";
151+
const sep = "|------------------------|-----------|---------|----------|";
152+
console.log("\n" + header);
153+
console.log(sep);
154+
155+
for (const item of totalRequired) {
156+
const avail = finalAvailable.includes(item);
157+
const row = `| ${item.padEnd(23)}| ${(avail ? "Yes" : "No").padEnd(10)}| ${(!avail ? "Yes" : "").padEnd(8)}| ${(avail ? "OK" : "GAP").padEnd(9)}|`;
158+
console.log(row);
159+
}
160+
161+
const gapCount = totalRequired.filter((i) => !finalAvailable.includes(i)).length;
162+
console.log("\n Result: Agent completed with " + gapCount + " of " + totalRequired.length + " context items missing.");
163+
console.log(" This is the core failure pattern: each step looked reasonable in isolation.\n");
164+
}
165+
166+
// ---------------------------------------------------------------------------
167+
// Run
168+
// ---------------------------------------------------------------------------
169+
170+
printComparisonTable(simulateFailurePattern());
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# Чеклист сигналов о провале
2+
3+
Используйте этот чеклист при разборе прогона со слабым harness.
4+
5+
- Спросил ли агент, как запускать приложение, или сделал неверные предположения?
6+
- Создал ли он каталоги или абстракции, не соответствующие задуманному
7+
продукту?
8+
- Остановился ли он после визуальной UI-оболочки без полного рабочего сценария?
9+
- Оставил ли он заметки или артефакты, помогающие следующему прогону продолжить?
10+
- Сможет ли свежая сессия понять, что произошло, меньше чем за пять минут?
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# Код для Лекции 01
2+
3+
Используйте эту папку для небольших примеров, демонстрирующих:
4+
5+
- сильную модель, проваливающуюся в слабой среде
6+
- недоопределённую конфигурацию репозитория
7+
- отсутствие петель обратной связи
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Пример недоопределённой задачи
2+
3+
Сделай десктоп-приложение базы знаний с AI-ответами на вопросы.
4+
5+
Ограничения:
6+
7+
- Не указаны
8+
- Команда запуска не задана
9+
- Структура папок не описана
10+
- Модель данных не определена
11+
- Явных критериев готовности нет
12+
13+
Типичные исходы такого промпта:
14+
15+
- агент изобретает структуру на ходу
16+
- приложение может собираться, но запускается нестабильно
17+
- UI может появиться раньше, чем будет рабочий путь ингеста/запросов
18+
- агент часто останавливается после косметического успеха

0 commit comments

Comments
 (0)