Policies
Soul is probabilistic. You can put “I don’t write in second person” into Soul as an allergy, and the LLM will try. It might slip.
Policies exist for the rules where “try” is not enough. A policy is a deterministic check on Sadie’s output. It always runs, it always matches the same way, and it does something specific when it matches.
The three kinds
Section titled “The three kinds”- Phrase. A literal string, matched case-insensitively. Good for concrete tokens: “em-dash,” “synergy,” a specific cliche.
- Regex. A trusted regex pattern. Accepts either raw form (
pattern) or delimited form (/pattern/flags); the global flag is forced on. Good for structural rules: “no paragraphs that begin with ‘I apologize’.” - Semantic. A plain-English rule evaluated by an LLM judge. Good for things regex cannot see: negation framing, false certainty, tonal shifts. The judge receives the rule plus the candidate text and returns a JSON verdict with an optional rewrite.
The three actions
Section titled “The three actions”- Rewrite mutates the text. For phrase and regex, uses your
replacement. For semantic, uses the rewrite field returned by the judge. - Block fails the whole output. In Chat, this substitutes an apology message and forces the emotion to serious. In Brief, this suppresses the brief entirely; the compiler logs a dismissed activity instead.
- Warn records the violation and leaves the text alone. Useful when you want to measure drift without intervening.
Scopes
Section titled “Scopes”Every policy picks any subset of chat, studio, brief. Scopes are isolating, not cumulative: a policy scoped only to chat does not run in Studio, even if the pattern would match.
Studio is record-only regardless of action. Your writing surface is your space.
Presets
Section titled “Presets”The Policies view has a Quick add panel with five curated presets:
- No em-dashes (phrase, rewrite) replaces every em-dash with a space-hyphen-space. The product itself uses this. See the example.
- No en-dashes (phrase, rewrite).
- No negation framing (semantic, rewrite). Rewrites constructions like “not X, but Y” to state the positive claim directly.
- No AI openers (regex, rewrite). Strips tired phrases like “in today’s fast-paced world” and “delve into.”
- No servile openers (regex, rewrite, chat only). Drops leading apologies.
Each is one click to add. Presets that already exist auto-hide.
Example: the no em-dashes preset
Section titled “Example: the no em-dashes preset”{ label: "No emdashes", kind: "phrase", pattern: "\u2014", // em-dash character replacement: " - ", // space-hyphen-space action: "rewrite", scopes: ["chat", "studio", "brief"],}Soul allergies vs. policies
Section titled “Soul allergies vs. policies”Both address “I don’t want Sadie to do that.” The difference is enforcement:
- Soul allergies are soft, prompt-level, LLM-attended. They shape the output probabilistically.
- Policies are hard, deterministic, post-hoc (and in chat, prompt-injected as a guardrail so the LLM tries to comply upstream too).
Put behavioral aversions in Soul. Put unconditional bans in Policies. The two are meant to complement each other.
Related
Section titled “Related”- Policy engine - the enforcement model
- Soul - the probabilistic counterpart
- AI providers - semantic policies route through the wiki_lint tier