How to write zen rules for new SIGNAL levels — idiomatic Go detection, jolts, suggestions, testing
Zen rules live in src/lib/game/zen.ts. They detect idiomatic Go patterns in player code, award bonus XP, and trigger Maya's "memory jolt" narrative. Every new challenge step needs corresponding zen rules.
interface ZenRule {
id: string; // snake_case, unique across all rules
principle: string; // short label, e.g. "grouped imports"
check: (code: string) => boolean; // heuristic — regex or string ops
isRelevant?: (code: string) => boolean; // skip rule if irrelevant to player's code
bonusXP: number; // 5-15 per rule
jolt: string; // Maya's memory returning (player followed the rule)
suggestion: string; // Maya's hint (player didn't follow the rule)
getSuggestion?: (code: string) => string; // context-aware suggestion (overrides static suggestion)
}
STEP_ZEN_RULES — key is the step ID (e.g. "chapter-04:errors").zen.test.ts for the new step.Checks are heuristic — regex and string ops only. No AST parsing.
// GOOD — simple, targeted regex