feat(lessons): машинный журнал уроков — аддитивная таблица + observer-leaf (ORCH-098) #118
Reference in New Issue
Block a user
Delete Branch "feature/ORCH-098-fnd"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
ORCH-098 — FND: машинный журнал уроков (lessons)
Шаг 1 («Фундамент», F2) эпика саморазвития: формализует свободнотекстовые «уроки» из
memory/в машинную структурированную таблицу отклонений конвейераlessons— фундамент для будущих ретроспективщика (E2), приоритизатора RICE (E3) и Стрим.Что сделано
src/lessons.py— чистый observer-leaf (never-raise, kill-switch, паттернserial_gate/coverage_gate/metrics):record()/get()/update()/snapshot()+ слаг-константы. НЕ скоупится по репо (observer-only; пишет уроки про любой репо вкл. enduro; репо-разрез — на выборке).src/db.py— аддитивная идемпотентная таблицаlessonsвinit_db()(+3 индекса, restart-safe); колонки атрибуции нуллабельны и сразу (attribution/target_repo/target_domain, NFR-6 / Слава 10.06;_ensure_columnфорвард-safe); хелперыrecord_lesson/get_lessons/update_lesson/lessons_snapshot/lessons_recent_dup_exists.source="auto", best-effort, дедуп в окне):gate_failure(_handle_qg_failure_rollbacks),merge_hold(_handle_merge_verifyHOLD),transient_retry(launcher._finalize_transientна исчерпании бюджета),deploy_degraded(post-deployDEGRADED → set_repo_freeze).GET /lessons/POST /lessons/POST /lessons/{id}+ read-only ключlessonsвGET /queue. Выключенный флаг →{"enabled": false}.src/config.py—lessons_enabled/lessons_query_limit_default/lessons_dedup_window_s.Инвариант
Журнал — наблюдатель, не Quality Gate:
STAGE_TRANSITIONS/QG_CHECKS/check_*/ machine-verdict / схемы существующих таблиц — байт-в-байт не тронуты; enduro не затронут (общая БД, аддитивная таблица). never-raise на всех публичных функциях и врезках; kill-switchlessons_enabled=False→ полная инертность.Тесты
tests/test_lessons.py(TC-01…TC-12, unit + integration) — зелёные; полныйpytest tests/ -q— 1564 passed.ADR
docs/work-items/ORCH-098/06-adr/ADR-001-lessons-journal.mddocs/architecture/adr/adr-0033-lessons-journal.mdRefs: ORCH-098
🤖 Generated with Claude Code
Step 1 ("Foundation", F2) of the self-improvement epic: formalise free-text "lessons" from memory/ into a machine-readable `lessons` table — the foundation for the future retrospective agent (E2), the RICE prioritiser (E3) and Стрим. - src/lessons.py: pure never-raise observer leaf (record/get/update/snapshot), kill-switch only, NO repo scope (observer-only; records about any repo incl. enduro; repo cut on the read side). Slug-convention constants. - src/db.py: additive idempotent `lessons` table in init_db() (+3 indexes); nullable attribution columns from the start (NFR-6, _ensure_column forward-safe); helpers record_lesson/get_lessons/update_lesson/lessons_snapshot/ lessons_recent_dup_exists (auto-dedup window). - 4 auto-detectors (best-effort, source="auto", deduped): gate_failure (_handle_qg_failure_rollbacks), merge_hold (_handle_merge_verify HOLD), transient_retry (launcher._finalize_transient budget-exhaustion), deploy_degraded (post-deploy DEGRADED -> set_repo_freeze). - src/main.py: GET /lessons, POST /lessons, POST /lessons/{id} + read-only `lessons` block in GET /queue; off-switch -> {"enabled": false}. - src/config.py: lessons_enabled / lessons_query_limit_default / lessons_dedup_window_s. - tests/test_lessons.py: TC-01..TC-12 (unit + integration), all green. - Docs: CLAUDE.md, docs/architecture/README.md (component + schema + API), CHANGELOG. Invariant: the journal is an OBSERVER, not a Quality Gate — STAGE_TRANSITIONS / QG_CHECKS / check_* / machine-verdict / existing table schemas are byte-for-byte untouched; enduro not affected. never-raise on every public fn + injection. Refs: ORCH-098 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>b4e76123cbto21a47e85d3