Product direction
Design a personalization menu for the primary reader in Shipyard / Woven Map so the user can control how Raven speaks, what Raven is allowed to remember/use, and how Vault relationship context participates in readings.
The goal is not to make Raven generic or user-flattering. The goal is to give the primary reader explicit control over voice preferences, data confidence, relationship context, and read behavior so Raven does not have to infer all of this indirectly from chat turns.
Keeper rule:
Personalization should reduce guessing, not weaken doctrine.
Core idea
Add a Raven Personalization / Reader Settings surface connected to the Vault.
This menu should let the primary reader configure:
- Raven’s conversational style
- Raven’s formal-read style
- response depth / brevity
- use of symbolic language
- use of practical advice
- relationship-context handling
- data provenance / birth-time confidence behavior
- fallback/degraded-read behavior during development vs production
- whether Raven may propose Vault updates, with confirmation
This should be treated as a user-facing control layer, not hidden prompt magic.
Proposed settings model
type RavenReaderPreferences = {
profileId: string;
voice: {
defaultRegister:
| 'observant_grounded'
| 'plain_direct'
| 'more_mythic'
| 'more_practical'
| 'minimal_symbolism';
symbolicDensity: 'low' | 'medium' | 'high';
humor: 'none' | 'dry_light' | 'playful_when_safe';
directness: 'gentle' | 'balanced' | 'blunt';
responseLength: 'brief' | 'normal' | 'expanded';
avoidTherapyTone: boolean;
avoidRitualClosers: boolean;
avoidIndustrialMysticism: boolean;
};
readingBehavior: {
preferPracticalFirstForDistress: boolean;
symbolicMomentRequiresExplicitCommand: boolean;
allowConversationalRavenAlways: boolean;
allowDegradedReadsInDev: boolean;
showDataLimitationsFrontstage: boolean;
askBeforeUsingApproximateHouses: boolean;
};
dataUse: {
allowNatal: boolean;
allowTransits: boolean;
allowProgressions: boolean;
allowSolarReturns: boolean;
allowSynastry: boolean;
allowRelationshipContext: boolean;
requireVerifiedBirthTimeForHouses: boolean;
defaultLocationAnchor:
| 'current_location'
| 'natal_birthplace'
| 'ask_each_time';
};
vaultActions: {
ravenMaySuggestProfileUpdates: boolean;
ravenMaySuggestRelationshipContextUpdates: boolean;
requireConfirmationForAllVaultWrites: true;
allowUseOnceWithoutSaving: boolean;
};
};
Voice settings
The user should be able to choose how Raven sounds without changing the truth rules.
Examples:
- Observant & grounded: conversational, perceptive, specific, not theatrical.
- Plain/direct: less symbolic, more practical.
- More mythic: richer language, still grounded in computed geometry.
- Minimal symbolism: ordinary-life translation first.
Important:
Do not implement this as freeform prompt injection. Use enum-based settings that map to controlled prompt fragments.
Bad:
Better:
symbolicDensity: 'low' | 'medium' | 'high'
directness: 'gentle' | 'balanced' | 'blunt'
Relationship context integration
This should interact with existing Vault relationship context.
For each relationship edge, the user should be able to set:
type RelationshipContextPreferences = {
primaryProfileId: string;
counterpartProfileId: string;
relationshipLabel?:
| 'friend'
| 'partner'
| 'ex'
| 'family'
| 'collaborator'
| 'client'
| 'other';
currentStatus?:
| 'active_contact'
| 'low_contact'
| 'no_contact'
| 'unclear'
| 'ended'
| 'deceased';
interpretationBoundary: {
allowRelationalSymbolicMoment: boolean;
allowSynastry: boolean;
allowComposite: boolean;
allowMessagingHelp: boolean;
allowSpeculationAboutOtherPerson: false;
};
voicePreferenceForThisBond?: {
directness?: 'gentle' | 'balanced' | 'blunt';
avoidRomanticOvertone?: boolean;
avoidFateLanguage?: boolean;
emphasizeBoundaries?: boolean;
};
userNotes?: string;
lastConfirmedAt?: string;
};
Rules:
- Relationship context is per edge, not blended across people.
- Raven may use the context to reduce distortion.
- Raven may not diagnose the other person’s inner state from the user’s side alone.
- In relational reads, speak about the room/dynamic/interface, not as if Raven knows both people’s private experience.
Vault update flow
Raven should be allowed to propose Vault updates, but never silently mutate the Vault.
Flow:
Raven detects missing/stale data
→ proposes a Vault action
→ user confirms / edits / rejects
→ server applies update
→ reading continues or reruns
Suggested action:
type VaultProposedAction = {
id: string;
kind:
| 'update_profile_location'
| 'set_location_anchor'
| 'update_birth_time_confidence'
| 'update_relationship_context'
| 'stage_profile'
| 'update_reader_preferences';
profileId?: string;
counterpartProfileId?: string;
proposedValue: unknown;
reason: string;
requiresConfirmation: true;
allowUseOnce?: boolean;
};
UI should offer:
- Save to Vault
- Use once
- Edit first
- Cancel
No silent writes.
Data provenance settings
The personalization menu should make birth-data status visible.
Show:
- birth date known/unknown
- birth time verified/approximate/default/unknown
- birth location known/unknown
- house frame measured/degraded/unavailable
- current location anchor
If the user lacks verified birth time, Raven should not confidently use houses/chambers unless the user explicitly allows degraded reads.
But during development/debug, the primary reader may choose:
allowDegradedReadsInDev: true
Then Raven may speak with warnings instead of choking behind fallback copy.
UI design suggestion
Add a “Raven Settings” or “Reader Preferences” panel near the Operator Menu / Vault controls.
Possible tabs:
- Voice
- Reading behavior
- Data & provenance
- Relationships
- Vault permissions
- Developer/debug
Voice tab
- Symbolic density
- Directness
- Humor
- Response length
- Avoid therapy-tone toggle
- Avoid ritualized closers toggle
- Avoid industrial-mysticism toggle
Reading behavior tab
- Practical-first for distress
- Symbolic Moment requires explicit command
- Always allow conversational Raven
- Ask before using approximate houses
- Show data limitations
Data tab
- Birth data status
- House-frame confidence
- Default location anchor
- Allow degraded development reads
Relationships tab
- list relationship edges
- edit context per person
- set status and boundaries
- confirm relationship notes
Vault permissions tab
- allow Raven to suggest updates
- require confirmation for writes
- allow use-once without saving
Prompt assembly / runtime rules
Reader preferences should be injected as a compact structured block, not as long prose.
Example:
readerPreferences: {
voice: 'observant_grounded',
symbolicDensity: 'medium',
directness: 'balanced',
preferPracticalFirstForDistress: true,
avoidTherapyTone: true,
avoidRitualClosers: true,
allowRelationshipContext: true
}
The prompt builder maps this to short, controlled instructions.
Do not inject the entire settings object if not needed. Lane-gate it.
- Free chat needs voice/practical preferences.
- Symbolic Moment needs voice + data provenance.
- Relationship lane needs relationship edge context.
- Creator diagnostic can show raw settings for debug.
Acceptance criteria
- Primary reader can configure Raven’s voice without freeform prompt injection.
- Raven settings persist in Vault/profile state.
- Relationship context remains per-counterpart/per-edge.
- Raven can propose but not silently apply Vault changes.
- “Use once” vs “Save to Vault” distinction exists.
- Birth-data provenance is visible and affects Raven’s confidence.
- Settings are lane-gated and do not bloat every prompt.
- Practical/free-chat can be distinct from formal Symbolic Moment without making Raven generic.
- Existing lane resolver remains server-authoritative.
- Tests cover settings serialization, defaults, Vault update confirmation, and relationship context scoping.
Keeper rule:
Personalization is not permission for Raven to flatter the user. It is a control surface for voice, data boundaries, and context ownership.
Product direction
Design a personalization menu for the primary reader in Shipyard / Woven Map so the user can control how Raven speaks, what Raven is allowed to remember/use, and how Vault relationship context participates in readings.
The goal is not to make Raven generic or user-flattering. The goal is to give the primary reader explicit control over voice preferences, data confidence, relationship context, and read behavior so Raven does not have to infer all of this indirectly from chat turns.
Keeper rule:
Personalization should reduce guessing, not weaken doctrine.
Core idea
Add a Raven Personalization / Reader Settings surface connected to the Vault.
This menu should let the primary reader configure:
This should be treated as a user-facing control layer, not hidden prompt magic.
Proposed settings model
Voice settings
The user should be able to choose how Raven sounds without changing the truth rules.
Examples:
Important:
Do not implement this as freeform prompt injection. Use enum-based settings that map to controlled prompt fragments.
Bad:
customPrompt: stringBetter:
Relationship context integration
This should interact with existing Vault relationship context.
For each relationship edge, the user should be able to set:
Rules:
Vault update flow
Raven should be allowed to propose Vault updates, but never silently mutate the Vault.
Flow:
Raven detects missing/stale data
→ proposes a Vault action
→ user confirms / edits / rejects
→ server applies update
→ reading continues or reruns
Suggested action:
UI should offer:
No silent writes.
Data provenance settings
The personalization menu should make birth-data status visible.
Show:
If the user lacks verified birth time, Raven should not confidently use houses/chambers unless the user explicitly allows degraded reads.
But during development/debug, the primary reader may choose:
allowDegradedReadsInDev: trueThen Raven may speak with warnings instead of choking behind fallback copy.
UI design suggestion
Add a “Raven Settings” or “Reader Preferences” panel near the Operator Menu / Vault controls.
Possible tabs:
Voice tab
Reading behavior tab
Data tab
Relationships tab
Vault permissions tab
Prompt assembly / runtime rules
Reader preferences should be injected as a compact structured block, not as long prose.
Example:
The prompt builder maps this to short, controlled instructions.
Do not inject the entire settings object if not needed. Lane-gate it.
Acceptance criteria
Keeper rule:
Personalization is not permission for Raven to flatter the user. It is a control surface for voice, data boundaries, and context ownership.