condition_axis.occupation_axis
Occupation condition generation system for character and world building.
This module implements a structured system for generating occupation descriptors across multiple semantic dimensions (legitimacy, visibility, moral weight, etc.).
Unlike simple occupation name lookups, this system generates the contextual characteristics and social positioning of occupations, which can be combined with character conditions to create rich, coherent character backgrounds.
- Design Philosophy:
Occupations are characterized by their relationship to society: - legitimacy: How society views the occupation legally/officially - visibility: How conspicuous the occupation is in daily life - moral_load: The psychological/ethical weight carried by practitioners - dependency: How essential the occupation is to society - risk_exposure: Physical/psychological toll over time
- Example usage:
>>> from condition_axis import generate_occupation_condition >>> occupation = generate_occupation_condition(seed=42) >>> print(occupation) {'legitimacy': 'tolerated', 'visibility': 'discrete', 'moral_load': 'burdened'}
>>> from condition_axis import occupation_condition_to_prompt >>> prompt_fragment = occupation_condition_to_prompt(occupation) >>> print(prompt_fragment) 'tolerated, discrete, burdened'
- Architecture:
OCCUPATION_AXES: Define all possible values for each axis
OCCUPATION_POLICY: Rules for mandatory vs optional axes
OCCUPATION_WEIGHTS: Statistical distribution for realistic variety
OCCUPATION_EXCLUSIONS: Semantic constraints for coherence
Generator: Produces constrained random combinations
Converter: Transforms structured data into prompt text
- Future Integration:
This module can be combined with character_conditions to create complete character profiles. Cross-system exclusions may be needed: - wealth=”decadent” + legitimacy=”illicit” (criminal wealth sources) - age=”young” + dependency=”unavoidable” (unlikely to hold critical roles) - demeanor=”timid” + visibility=”conspicuous” (contradictory behavior)
- condition_axis.occupation_axis.generate_occupation_condition(seed=None)[source]
Generate a coherent occupation condition using weighted random selection.
This function applies the full occupation rule system: 1. Select mandatory axes (legitimacy, visibility) 2. Select 0-N optional axes (moral_load, dependency, risk_exposure) 3. Apply weighted probability distributions 4. Apply semantic exclusion rules 5. Return structured condition data
- Parameters:
seed (
int|None) – Optional random seed for reproducible generation. If None, uses system entropy (non-reproducible).- Return type:
- Returns:
Dictionary mapping axis names to selected values. Example:
{"legitimacy": "tolerated", "visibility": "discrete", "moral_load": "burdened"}
Examples
>>> # Reproducible generation >>> occ1 = generate_occupation_condition(seed=42) >>> occ2 = generate_occupation_condition(seed=42) >>> occ1 == occ2 True
>>> # Non-reproducible (different each call) >>> generate_occupation_condition() {'legitimacy': 'sanctioned', 'visibility': 'routine', 'dependency': 'useful'}
>>> # May include 0-2 optional axes >>> generate_occupation_condition(seed=100) {'legitimacy': 'tolerated', 'visibility': 'discrete'}
- condition_axis.occupation_axis.get_available_occupation_axes()[source]
Get list of all defined occupation condition axes.
Example
>>> get_available_occupation_axes() ['legitimacy', 'visibility', 'moral_load', 'dependency', 'risk_exposure']
- condition_axis.occupation_axis.get_occupation_axis_values(axis)[source]
Get all possible values for a specific occupation axis.
- Parameters:
axis (
str) – Name of the axis (e.g., ‘legitimacy’, ‘visibility’)- Return type:
- Returns:
List of possible values for that axis
- Raises:
KeyError – If axis is not defined in OCCUPATION_AXES
Example
>>> get_occupation_axis_values('legitimacy') ['sanctioned', 'tolerated', 'questioned', 'illicit']
>>> get_occupation_axis_values('moral_load') ['neutral', 'burdened', 'conflicted', 'corrosive']
- condition_axis.occupation_axis.occupation_condition_to_prompt(condition_dict)[source]
Convert structured occupation condition data to a prompt fragment.
This is the canonical serialization format for occupation axis data. The output is designed to be clean and diffusion-friendly.
- Parameters:
condition_dict (
dict[str,str]) – Dictionary mapping axis names to values (output from generate_occupation_condition)- Return type:
- Returns:
Comma-separated string of condition values
Examples
>>> occupation_condition_to_prompt({"legitimacy": "tolerated", "visibility": "discrete"}) 'tolerated, discrete'
>>> occupation_condition_to_prompt({ ... "legitimacy": "sanctioned", ... "visibility": "routine", ... "dependency": "necessary" ... }) 'sanctioned, routine, necessary'
>>> occupation_condition_to_prompt({}) ''
Notes
Order is determined by dict iteration (Python 3.7+ preserves insertion order)
Only includes values, not axis names (for prompt clarity)
Empty dict returns empty string