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 pipeworks.core.condition_axis import generate_occupation_condition
>>> occupation = generate_occupation_condition(seed=42)
>>> print(occupation)
{'legitimacy': 'tolerated', 'visibility': 'discreet', 'moral_load': 'burdened'}
>>> from pipeworks.core.condition_axis import occupation_condition_to_prompt
>>> prompt_fragment = occupation_condition_to_prompt(occupation)
>>> print(prompt_fragment)
'tolerated, discreet, burdened'
Architecture:
  1. OCCUPATION_AXES: Define all possible values for each axis

  2. OCCUPATION_POLICY: Rules for mandatory vs optional axes

  3. OCCUPATION_WEIGHTS: Statistical distribution for realistic variety

  4. OCCUPATION_EXCLUSIONS: Semantic constraints for coherence

  5. Generator: Produces constrained random combinations

  6. Converter: Transforms structured data into prompt text

Future Integration:

This module can be combined with character_conditions and facial_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:

dict[str, str]

Returns:

Dictionary mapping axis names to selected values. Example: {"legitimacy": "tolerated", "visibility": "discreet", "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': 'discreet'}
condition_axis.occupation_axis.get_available_occupation_axes()[source]

Get list of all defined occupation condition axes.

Return type:

list[str]

Returns:

List of axis names (e.g., [‘legitimacy’, ‘visibility’, …])

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:

list[str]

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:

str

Returns:

Comma-separated string of condition values

Examples

>>> occupation_condition_to_prompt({"legitimacy": "tolerated", "visibility": "discreet"})
'tolerated, discreet'
>>> 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