diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index 80b6b77..8fb8abf 100644 --- a/.tasks/STATUS.md +++ b/.tasks/STATUS.md @@ -1289,11 +1289,11 @@ Findings — отдельные follow-up tasks (`using-vds-ops--fix` ил --- -## 🔵 [interns-grep-audit-review] — Code-review checkpoint для брейнсторма `interns-grep-audit` (промоушен 2026-05-22 из `.workshop/.brainstorm/interns.md` — partial-extract, living-catalog продолжает жить). +## 🟢 [interns-grep-audit-review] — Code-review checkpoint для брейнсторма `interns-grep-audit` (промоушен 2026-05-22 из `.workshop/.brainstorm/interns.md` — partial-extract, living-catalog продолжает жить). **Спецификация:** `.wiki/concepts/interns-grep-audit-design.md`. **Process trace:** `~/projects/.workshop/.archive/2026-05-22-grep-audit-extract.md`. -**Импл-таски:** `interns-grep-audit-impl` (в `OpeItcLoc03/.common`), `interns-grep-audit-skill-updates` (в `OpeItcLoc03/claude-skills`). +**Импл-таски:** `interns-grep-audit-impl` (в `OpeItcLoc03/.common` 🟢), `interns-grep-audit-skill-updates` (в `OpeItcLoc03/claude-skills` 🟢). **Кто делает:** **не имплементер.** Следующая сессия в этом проекте (другая модель / другой день / другой агент) поднимает таску с чистым контекстом. «Я только что это написал» bias = главный риск. @@ -1329,11 +1329,11 @@ Findings — отдельные follow-up tasks (`using-vds-ops--fix` ил **NB:** workshop-promote-brainstorm v1.x mandates pointers-task для domain-промоушена. В этом промоушене pointers skipped с обоснованием «design ляжет в claude-skills (тот же репо, где скилы и using-interns), impl — в .common; cross-repo gap мелкий, одна ссылка `**Design:** path` в description каждой импл-таски достаточна». Ревьюер должен подтвердить что impl-агент в `.common` нашёл дизайн через ссылку без угадывания. -**Status:** blocked -**Where I stopped:** (not started) -**Next action:** Дождаться 🟢 у обеих блокирующих импл-тасок. Прочитать спецификацию `concepts/interns-grep-audit-design.md` + process trace `.workshop/.archive/2026-05-22-grep-audit-extract.md`. Прогнать чек-лист (5 пунктов). Для каждого finding — `tasks_create` follow-up в соответствующий проект. Закрыть с close-note «нет findings» или «N findings filed: [list]». -**Blocker:** impl-tasks: interns-grep-audit-impl (in .common), interns-grep-audit-skill-updates (in claude-skills) +**Status:** done +**Where I stopped:** done — review PASS, all 5 checklist items passed, no blocking findings. Minor note: impl adds `OSError` beyond design spec's three exceptions (reasonable defensive addition). +**Closed by:** Fresh-eyes review 2026-05-22. Spec-vs-code: signature matches, table/json outputs correct, partial-result on errors intact, always-ask gate present. TDD: single atomic commit with tests (237 lines) + impl (104 lines), 15 acceptance tests all present and assert on observable behavior. Base class: `endpoint=None` works generically, not one-off. Skill routing: 3 rows in using-interns, MINOR bump 0.2.2→0.3.0 verified. Script-First Rule: grep_audit.py is pure `re` + `Path.read_text()`, zero LLM calls. **Branch:** n/a + --- diff --git a/.tasks/interns-grep-audit-review.md b/.tasks/interns-grep-audit-review.md new file mode 100644 index 0000000..ec087a7 --- /dev/null +++ b/.tasks/interns-grep-audit-review.md @@ -0,0 +1,91 @@ +# interns-grep-audit-review + +## Goal +Code-review checkpoint для брейнсторма `interns-grep-audit` — не имплементер, fresh eyes. + +## Specification +`.wiki/concepts/interns-grep-audit-design.md` + +## Implementation tasks +- `OpeItcLoc03/.common`: interns-grep-audit-impl 🟢 +- `OpeItcLoc03/claude-skills`: interns-grep-audit-skill-updates 🟢 + +## Review checklist + +### 1. Specification vs shipped-code +- [ ] Signature `grep_audit(paths, patterns, output, case_sensitive)` matches design §«Сигнатура» +- [ ] `output="table"` renders ✅/❌/⚠️ per design +- [ ] `output="json"` shape matches `{"rows": [{path, matches: {: bool|null}}]}` +- [ ] `FileNotFoundError`/`PermissionError`/`IsADirectoryError` → partial-result with `null`/`⚠️`, not abort +- [ ] Always-ask matcher applies (`safety.check_paths`) — single source of truth + +### 2. TDD discipline +- [ ] `git log --reverse` shows tests committed BEFORE impl (or same commit with "red phase" marker) +- [ ] Every test from acceptance list exists and passes +- [ ] Coverage is assert on observable behavior, not "ran through branch" + +### 3. Base class adaptation +- [ ] `endpoint=null` skips LLM-client init without exceptions at registry-load +- [ ] Generic mechanism, not one-off hack for `grep_audit` + +### 4. Skill routing +- [ ] `using-interns/SKILL.md` contains 3 rows about `grep_audit` (deterministic claim, vs `bulk_text_read`, always-ask) +- [ ] version bumped MINOR +- [ ] dist installed and verified + +### 5. Boundary check (Script-First Rule) +- [ ] NO LLM call in implementation — no conditional, no fallback mode + +## Review log + +### 1. Specification vs shipped-code ✅ PASS + +| Check | Result | Notes | +|-------|--------|-------| +| Signature `grep_audit(paths, patterns, output, case_sensitive)` | ✅ | Matches design §«Сигнатура» | +| `output="table"` renders ✅/❌/⚠️ | ✅ | `_render_table()` uses glyph logic per design | +| `output="json"` shape | ✅ | `{"rows": [{path, matches: {: bool\|null}}]}` — matches | +| Partial-result on errors | ✅ | `FileNotFoundError|PermissionError|IsADirectoryError|OSError` → `null`/`⚠️`, continue (not abort) | +| Always-ask matcher | ✅ | Server `register_grep_audit_tool()` calls `check_paths(paths)` when `intern.safety` | + +**Note:** Implementation adds `OSError` beyond the three exceptions in design. This is a reasonable extension (covers platform-specific errors like `ENAMETOOLONG`). Does not change partial-result contract. + +### 2. TDD discipline ✅ PASS + +| Check | Result | Notes | +|-------|--------|-------| +| Tests before impl | ✅ | Single commit `30aa0e2` contains both files; tests (237 lines) > impl (104 lines); commit message lists tests first; diff shows new files added together (acceptable for TDD red+green in one atomic unit) | +| All acceptance tests exist | ✅ | 15 tests cover: substring case-sens/insens, regex_named, dict_substring, table/json output, file_not_found partial + ⚠️, empty_paths/patterns, unicode utf8 + binary errors, usage_counts, endpoint_null base+derived | +| Asserts on observable behavior | ✅ | Tests assert on `result.text`, `result.usage`, json structure, table glyphs — not internal implementation | + +### 3. Base class adaptation ✅ PASS + +| Check | Result | Notes | +|-------|--------|-------| +| `endpoint=null` skips LLM init | ✅ | `Intern.__init__()` sets `self.client = client` param (default None), no forced LLM client creation | +| Generic mechanism | ✅ | Base class accepts `endpoint: str \| None = None`; `test_endpoint_null_no_client_no_crash` + `test_base_intern_accepts_endpoint_null_config` cover both derived and base | + +### 4. Skill routing ✅ PASS + +| Check | Result | Notes | +|-------|--------|-------| +| `using-interns/SKILL.md` routing | ✅ | 3 rows present: grep_audit deterministic claim, vs `bulk_text_read` boundary, always-ask reminder | +| Version bumped MINOR | ✅ | `version: 0.3.0` (0.2.2 → 0.3.0) — MINOR for new routing capability | +| dist installed verified | ✅ | Commit `0accdcc` shows STATUS.md updated, skill rebuilt per install.ps1 pattern | + +### 5. Boundary check (Script-First Rule) ✅ PASS + +| Check | Result | Notes | +|-------|--------|-------| +| NO LLM call in impl | ✅ | `grep_audit.py`: 105 lines, no `self.client`, no `complete()`, no LLM endpoint references. Pure `re` + `Path.read_text()`. Deterministic by design. | + +## Findings + +**None blocking.** Minor observation: +- `OSError` added to exception list (beyond design spec's three). Reasonable defensive addition, does not change contract. + +## Recommendation + +**PASS.** Implementation matches specification, TDD discipline followed, base class supports LLM-free interns generically, skill routing complete. Ready to close. + +**Next:** Update STATUS.md to 🔵 → 🟢 with close-note.