# gate3card: судья-карточки (линзы) + видимость стадии — Implementation Plan (v2)
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Завести набор линз судьи `gate3card` (сверка пользовательской карточки с продуктом) и чистый помощник видимости `gate3CardSurfaceRecord`, чтобы будущая живая петля приёмки (Сессия E) могла судить карточку и показывать её вердикт в снимке+баннере.
**Architecture:** Две аддитивные правки существующих файлов. (1) В `judge-engine.mjs` добавляется ключ `gate3card` в замороженный `VOTE_LAYOUTS`; `requiredLensesFor` уже generic по любому ключу — отдельной правки логики не требует, проверяется тестом. (2) В `enforce-gate3-loop.mjs` добавляется чистый экспорт `gate3CardSurfaceRecord` — зеркало существующего `gate3SurfaceRecord`, но со стадией `judge:gate3card`. Живая проводка вызова судьи-карточки в петлю — Сессия E (вне этого плана).
**Граница (вне объёма, по замечанию наставника на спеку):** честность пометки `delivery` в судье плана (gate-2) и тест неизвестного delivery — **Сессия D**; формат предъявления карточки владельцу в Stop-хуке, таймаут-эскалация, живой вызов судьи-карточки — **Сессия E**. Здесь только линзы + чистый помощник видимости.
**NB по треку B:**`judge-engine.mjs` параллельно правит трек B. Правлю ТОЛЬКО `VOTE_LAYOUTS` (аддитивный ключ), функции не трогаю — слияние позже бесконфликтно.
## Структура файлов
- Изменить (тест): `tools/judge-engine.test.mjs` — тест линз `gate3card` в `requiredLensesFor`.
- Изменить: `tools/judge-engine.mjs` — добавить ключ `gate3card` в `VOTE_LAYOUTS`.
- Изменить (тест): `tools/enforce-gate3-loop.test.mjs` — тесты `gate3CardSurfaceRecord`.
{"op":"Bash","object":"npx vitest run tools/enforce-gate3-loop.test.mjs --reporter dot --config vitest.config.tools.mjs --no-file-parallelism","ref":"u4"},
{"op":"Bash","object":"npx vitest run --reporter dot --config vitest.config.tools.mjs --no-file-parallelism","ref":"u9"}
]
```
```verified-context-json
[{"id":"vc1","kind":"EXTRACTED","ref":"tools/judge-engine.mjs","anchor":"export const VOTE_LAYOUTS"},{"id":"vc2","kind":"EXTRACTED","ref":"tools/enforce-gate3-loop.mjs","anchor":"export function gate3SurfaceRecord"}]
```
---
### Task 1: Линзы `gate3card` в judge-engine (§u4)
- [ ] **Step 1 (Edit `tools/judge-engine.test.mjs`): падающий тест линз**
В блок `describe('requiredLensesFor (§7 раскладка голосов по функциям)', ...)` после теста про риск (перед закрытием `});`) добавить:
Run: `npx vitest run --reporter dot --config vitest.config.tools.mjs --no-file-parallelism`
Expected: PASS — база + новые тесты, 0 регрессий (в т.ч. `gate3SurfaceRecord`, `buildJudgePrompt`, `decideGate3Closure`). (Под Claude harness-collapse; авторитетный свод — терминал владельца.)
- **Видимость {#deferred}** — Task 2: чистый `gate3CardSurfaceRecord` со стадией `judge:gate3card`, зеркало `gate3SurfaceRecord`. Живая запись `writeStage`/`pushVerdict` и сам вызов судьи-карточки — Сессия E. ✓
- **DR-1** — мутирующие шаги 1,3,5,7 сопровождены Bash (2,4,6,8); каждый файл правится ровно ОДИН раз → двух Edit одного файла подряд нет; RED/GREEN — разная неопределённость. ✓
- **Трек B** — правлю только `VOTE_LAYOUTS` (аддитивный ключ), функции judge-engine не трогаю. ✓
- **Обратная совместимость** — оба изменения чисто аддитивные (новый ключ / новый экспорт); существующее поведение не меняется. ✓
- **Вне объёма** — честность delivery на gate-2 + тест неизвестного delivery (Сессия D); показ карточки/таймаут/живой вызов (Сессия E). ✓
@@ -22,6 +22,13 @@ describe('requiredLensesFor (§7 раскладка голосов по функ
expect(l).toContain('attacker');
expect(l).toContain('money');
});
it('gate3card несёт 3 линзы сверки карточки с продуктом',()=>{
constl=requiredLensesFor('gate3card');
expect(l).toEqual(VOTE_LAYOUTS.gate3card);
expect(l).toContain('card_matches_product');
expect(l).toContain('no_overstatement');
expect(l).toContain('verify_steps_real');
});
});
describe('buildJudgePrompt (чистая, детерминированная; слепа к переписке)',()=>{
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.