Skip to content

feat(dashboard): add Harness tab to project settings with engine/model/iterations controls#839

Merged
aaight merged 1 commit intodevfrom
feature/harness-tab-project-settings
Mar 14, 2026
Merged

feat(dashboard): add Harness tab to project settings with engine/model/iterations controls#839
aaight merged 1 commit intodevfrom
feature/harness-tab-project-settings

Conversation

@aaight
Copy link
Copy Markdown
Collaborator

@aaight aaight commented Mar 14, 2026

Summary

Moves agent engine, model, and max iterations settings out of the General tab into a new dedicated Harness tab on the project detail page.

  • New Harness tab — appears between General and Work, contains agent engine selector, engine settings fields, model picker, and max iterations input
  • Cleaned-up General tab — now focuses on project metadata (name, repo, branches, budget, watchdog timeout, progress settings, run-link toggle)
  • Shared update hook (use-project-update.ts) — both forms use the same useProjectUpdate hook ensuring identical cache invalidation (projects.getById + projects.listFull) and consistent Saving/Saved UX
  • Partial-update safety — each form only sends the fields it owns; harness fields are never nulled by a General save and vice versa

Card: https://trello.com/c/69b5c90fb7742b3b26378776

Files Changed

  • web/src/routes/projects/$projectId.tsx — adds 'harness' to Tab union, adds Harness tab button and panel
  • web/src/components/projects/project-general-form.tsx — removes model, maxIterations, agentEngine, engineSettings fields; switches to shared hook
  • web/src/components/projects/project-harness-form.tsx — new form component with engine/model/iterations/engine-settings fields
  • web/src/components/projects/use-project-update.ts — new shared hook for projects.update mutation + cache invalidation

Test plan

  • npm run build:web passes (zero type errors) ✅
  • npm run typecheck passes ✅
  • npm run lint passes ✅
  • Open a project — Harness tab appears between General and Work
  • Set engine/model/iterations in Harness tab, save, refresh — values persist
  • Edit only General fields, save — engine/model/iterations in Harness remain unchanged
  • Switch engines in Harness — ModelField and EngineSettingsFields respond correctly

🤖 Generated with Claude Code

🕵️ claude-code · claude-sonnet-4-6 · run details

Copy link
Copy Markdown
Collaborator

@nhopeatall nhopeatall left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

LGTM — Clean extraction of harness settings into a dedicated tab with a well-factored shared update hook.

The partial-update safety claim is verified: the backend projects.update endpoint uses optional/nullish fields, so each form only sends the fields it owns — neither form can overwrite the other's values. The shared useProjectUpdate hook correctly consolidates mutation logic and cache invalidation. CI is all green.

Minor observations (not worth blocking on):

  • project-general-form.tsx still declares model, maxIterations, agentEngine, and engineSettings in its local Project interface despite no longer using them. Harmless since TypeScript allows extra properties, but could be trimmed for clarity.
  • numericFieldDefault is duplicated across both form files. Could be shared, but with a 2-line function in only 2 files, it's not worth an extra import.

🕵️ claude-code · claude-opus-4-6 · run details

@aaight aaight merged commit 3d89970 into dev Mar 14, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants