JobKindConfig fase 6 (workers): /settings/job-kinds admin-UI #55

Merged
janpeter merged 5 commits from claude/job-kind-config-phase6 into main 2026-06-17 19:22:46 +02:00
Owner

JobKindConfig — fase 6 (workers): /settings/job-kinds admin-UI

De laatste fase van het JobKindConfig-spoor. Voegt een admin-pagina toe waarop per ClaudeJobKind (alle 9) de JobKindConfig-rij bekeken en bewerkt wordt: model per runtime, thinking_budget (+ effort-helper), permissie/sandbox per runtime, max_turns, allowed_tools, skills, allow_all_tools. De server-action doet een upsert per kind met zod-validatie tegen de Fase-1-registries.

Alleen UI + action — geen resolutie-logica. Schrijven gebeurt live in JobKindConfig; omdat Fase 3 (mcp) op claim-time DB-leading resolvet, raakt elke wijziging onmiddellijk de volgende geclaimde job (ook reeds-gequeuede).

Wijzigingen

  • lib/settings/job-kind-config.tsjobKindConfigInputSchema (zod) + drift-guarded spiegel-constanten (CLAUDE_MODELS/PERMISSION_MODES via as const satisfies), CODEX_MODELS (UI-curated), KIND_ORDER/KIND_LABELS, JobKindConfigRow. Tools/skills worden hard tegen isKnownTool/isKnownSkill gevalideerd (security-grens); codex_model is bewust vrije string (geen grens, modelnamen evolueren).
  • actions/job-kind-config.tsupsertJobKindConfigAction: requireWorkersAdminsafeParseprisma.jobKindConfig.upsert({ where:{kind} })revalidatePath. Discriminated {ok:true} | {ok:false,error}.
  • components/settings/job-kind-config-editor.tsx'use client' editor met een kaart per kind, useTransition, per-veld runtime-notitie (welke flag/runtime het veld raakt), live effort-preview, checkbox-fieldsets voor tools/skills (bestaande multi-select-conventie). allow_all_tools disable't de tool-picker visueel; de action blijft de bron van waarheid.
  • app/(app)/settings/job-kinds/page.tsx + loading.tsx — server-page (guard + force-dynamic + prisma-fetch van alle 9 rijen) + skeleton.
  • components/shared/nav-bar.tsx — nav-link Job-kinds/mcp-tester ingevoegd (bestaande /worker-logs bewust behouden).

Verify

npm run verify groen: lint + typecheck + 613 tests passed | 2 skipped (97 files). Twee nieuwe testbestanden: __tests__/lib/job-kind-config-schema.test.ts (14) + __tests__/actions/job-kind-config.test.ts (7), TDD (RED→GREEN).

Adversariële review

Multi-dimensie-review (contract/security/spec/conventie/edge) + per-finding adversariële verificatie: 0 blocker/major. Twee nits geadresseerd in e9a4bc2 (budget-preview spiegelt nu de server-validatie; tool-picker gebruikt een native <fieldset disabled> i.p.v. een inerte aria-disabled-div). Twee findings terecht afgewezen als bewuste, spec-gedocumenteerde keuzes (codex_model vrije string; allow_all_tools negeert de lijst downstream).

Voorwaarden / niet hierin

  • Submodule staat al op shared-7c85a6c (Fase 1 + .js-fix) — komt mee via main; geen aparte bump-commit nodig.
  • Geen migratie (workers draait alleen prisma generate). De job_kind_config-tabel + seed landen via scrum4me-web (Fase 2 + 5a, gemerged). Tot de seed gedraaid is (npm run seed op deploy) toont de pagina lege/code-default-rijen — de upsert maakt een rij aan zodra een kind wordt opgeslagen.

Hiermee is het JobKindConfig-spoor compleet (fasen 1-6).

🤖 Generated with Claude Code

## JobKindConfig — fase 6 (workers): `/settings/job-kinds` admin-UI De laatste fase van het JobKindConfig-spoor. Voegt een admin-pagina toe waarop per `ClaudeJobKind` (alle 9) de `JobKindConfig`-rij **bekeken en bewerkt** wordt: model per runtime, thinking_budget (+ effort-helper), permissie/sandbox per runtime, max_turns, allowed_tools, skills, allow_all_tools. De server-action doet een **upsert per kind** met zod-validatie tegen de Fase-1-registries. **Alleen UI + action — geen resolutie-logica.** Schrijven gebeurt live in `JobKindConfig`; omdat Fase 3 (mcp) op claim-time DB-leading resolvet, raakt elke wijziging onmiddellijk de volgende geclaimde job (ook reeds-gequeuede). ### Wijzigingen - **`lib/settings/job-kind-config.ts`** — `jobKindConfigInputSchema` (zod) + drift-guarded spiegel-constanten (`CLAUDE_MODELS`/`PERMISSION_MODES` via `as const satisfies`), `CODEX_MODELS` (UI-curated), `KIND_ORDER`/`KIND_LABELS`, `JobKindConfigRow`. Tools/skills worden hard tegen `isKnownTool`/`isKnownSkill` gevalideerd (security-grens); `codex_model` is bewust vrije string (geen grens, modelnamen evolueren). - **`actions/job-kind-config.ts`** — `upsertJobKindConfigAction`: `requireWorkersAdmin` → `safeParse` → `prisma.jobKindConfig.upsert({ where:{kind} })` → `revalidatePath`. Discriminated `{ok:true} | {ok:false,error}`. - **`components/settings/job-kind-config-editor.tsx`** — `'use client'` editor met een kaart per kind, `useTransition`, per-veld runtime-notitie (welke flag/runtime het veld raakt), live effort-preview, checkbox-fieldsets voor tools/skills (bestaande multi-select-conventie). `allow_all_tools` disable't de tool-picker visueel; de action blijft de bron van waarheid. - **`app/(app)/settings/job-kinds/page.tsx` + `loading.tsx`** — server-page (guard + `force-dynamic` + prisma-fetch van alle 9 rijen) + skeleton. - **`components/shared/nav-bar.tsx`** — nav-link `Job-kinds` ná `/mcp-tester` ingevoegd (bestaande `/worker-logs` bewust behouden). ### Verify `npm run verify` groen: lint + typecheck + **613 tests passed | 2 skipped** (97 files). Twee nieuwe testbestanden: `__tests__/lib/job-kind-config-schema.test.ts` (14) + `__tests__/actions/job-kind-config.test.ts` (7), TDD (RED→GREEN). ### Adversariële review Multi-dimensie-review (contract/security/spec/conventie/edge) + per-finding adversariële verificatie: **0 blocker/major**. Twee nits geadresseerd in `e9a4bc2` (budget-preview spiegelt nu de server-validatie; tool-picker gebruikt een native `<fieldset disabled>` i.p.v. een inerte `aria-disabled`-div). Twee findings terecht afgewezen als bewuste, spec-gedocumenteerde keuzes (codex_model vrije string; allow_all_tools negeert de lijst downstream). ### Voorwaarden / niet hierin - **Submodule** staat al op shared-`7c85a6c` (Fase 1 + `.js`-fix) — komt mee via main; geen aparte bump-commit nodig. - **Geen migratie** (workers draait alleen `prisma generate`). De `job_kind_config`-tabel + seed landen via scrum4me-web (Fase 2 + 5a, gemerged). Tot de seed gedraaid is (`npm run seed` op deploy) toont de pagina lege/code-default-rijen — de upsert maakt een rij aan zodra een kind wordt opgeslagen. Hiermee is het **JobKindConfig-spoor compleet** (fasen 1-6). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Nav-link na /mcp-tester ingevoegd; /worker-logs (PR #53) bewust behouden.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adversariële review (0 blocker/major). Twee nits geadresseerd:
- thinking_budget-preview toont geen effort-mapping meer voor ongeldige
  (decimale/>200k) tussenwaarden die de save tóch weigert; + step/max op de input.
- tool-picker: aria-disabled op een roleless div was inert → native
  <fieldset disabled> (disable't de groep + wordt aan AT gemeld).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
janpeter/scrum4me-workers!55
No description provided.