+
+ These defaults shape AI-generated writing across Ghostwriter and
+ resume tailoring.
+
+
+
+
+ Preset
+
+
{
+ if (value === "custom") return;
+
+ const preset = WRITING_STYLE_PRESETS.find(
+ (item) => item.id === value,
+ );
+ if (!preset) return;
+
+ setValue("chatStyleTone", preset.values.tone, {
+ shouldDirty: true,
+ });
+ setValue("chatStyleFormality", preset.values.formality, {
+ shouldDirty: true,
+ });
+ setValue("chatStyleConstraints", preset.values.constraints, {
+ shouldDirty: true,
+ });
+ setValue("chatStyleDoNotUse", preset.values.doNotUse, {
+ shouldDirty: true,
+ });
+ }}
+ disabled={isLoading || isSaving}
+ >
+
+
+
+
+ {WRITING_STYLE_PRESETS.map((preset) => (
+
+ {preset.label}
+
+ ))}
+ Custom
+
+
+
+ {selectedPresetId === "custom"
+ ? "Your current values are custom."
+ : (WRITING_STYLE_PRESETS.find(
+ (preset) => preset.id === selectedPresetId,
+ )?.description ?? "")}
+
+
+
@@ -49,7 +156,7 @@ export const ChatSettingsSection: React.FC = ({
control={control}
render={({ field }) => (
field.onChange(value)}
disabled={isLoading || isSaving}
>
@@ -79,7 +186,7 @@ export const ChatSettingsSection: React.FC = ({
control={control}
render={({ field }) => (
field.onChange(value)}
disabled={isLoading || isSaving}
>
@@ -97,23 +204,54 @@ export const ChatSettingsSection: React.FC = ({
-
+
+
+ Constraints
+
+
+
+ Optional global writing constraints applied to Ghostwriter replies
+ and resume tailoring.
+
+
+ Current:{" "}
+ {constraints.effective || "—"}
+
+
-
+
+
+ Do-not-use terms
+
+
+ setValue("chatStyleDoNotUse", nextValues.join(", "), {
+ shouldDirty: true,
+ })
+ }
+ placeholder='e.g. "synergize", "leverage"'
+ helperText="Optional words or phrases the AI should avoid when generating text. This is guidance to the model, not a guaranteed blocklist."
+ removeLabelPrefix="Remove do-not-use term"
+ disabled={isLoading || isSaving}
+ />
+
+ Current:{" "}
+ {doNotUse.effective || "—"}
+
+
diff --git a/orchestrator/src/client/pages/settings/components/ScoringSettingsSection.tsx b/orchestrator/src/client/pages/settings/components/ScoringSettingsSection.tsx
index e227458..19a8a54 100644
--- a/orchestrator/src/client/pages/settings/components/ScoringSettingsSection.tsx
+++ b/orchestrator/src/client/pages/settings/components/ScoringSettingsSection.tsx
@@ -12,6 +12,7 @@ import {
} from "@/components/ui/accordion";
import { Checkbox } from "@/components/ui/checkbox";
import { Separator } from "@/components/ui/separator";
+import { Textarea } from "@/components/ui/textarea";
type ScoringSettingsSectionProps = {
values: ScoringValues;
@@ -36,6 +37,7 @@ export const ScoringSettingsSection: React.FC
= ({
missingSalaryPenalty,
autoSkipScoreThreshold,
blockedCompanyKeywords,
+ scoringInstructions,
} = values;
const { control, watch, setValue } = useFormContext();
const [blockedCompanyKeywordDraft, setBlockedCompanyKeywordDraft] =
@@ -168,6 +170,44 @@ export const ScoringSettingsSection: React.FC = ({
+
+
+ Scoring Instructions
+
+
(
+
+ )}
+ />
+
+
+
+
= ({
Default: {autoSkipScoreThreshold.default ?? "Disabled"}
+