Skip to content

Talent profile

Domain-specific scoring against twelve skills using a rule-based ontology. The score is the clamped sum of weights of rules that fire on the chart — explainable by construction.

Fetch — GET /v1/charts/{chart_id}/profile/talent

Required scope: charts:read

Response

{
    "chart_id": "019e32b5-...",
    "scores": [
        {
            "skill_id": "resilience",
            "value": 0.80,
            "level": "very_high",
            "contributing_rules": [
                "moon_in_fixed_resilience",
                "mars_in_fixed_resilience",
                "saturn_in_water_resilience"
            ]
        },
        {
            "skill_id": "empathy",
            "value": 0.45,
            "level": "moderate",
            "contributing_rules": ["moon_in_water"]
        }
    ]
}
Field Type Notes
chart_id string Echoed from the path.
scores[].skill_id string One of the twelve canonical skill ids.
scores[].value float in [0, 1] Sum of rule weights, clamped.
scores[].level enum Coarse band the templates phrase from: very_low, low, moderate, high, very_high.
scores[].contributing_rules string[] Rule ids that fired. Empty if score is zero.

Skill catalog

Twelve skills, six soft + six hard. The ids are stable.

Skill id Category Description
communication soft Verbal expressiveness, articulation.
leadership soft Initiative, visibility, willingness to direct.
analytical_thinking soft Structured reasoning, modelling.
empathy soft Emotional attunement, relational awareness.
discipline soft Follow-through on routine and commitments.
creativity soft Generative thinking, novel combinations.
resilience soft Stress tolerance, recovery from setbacks.
tech_engineering hard Affinity for systems / tooling / engineering work.
sales_negotiation hard Persuasion, deal-making.
creative_design hard Aesthetic judgment, visual / craft work.
management hard People management, resource coordination.
operations hard Process design, procedural rigour.

How scoring works

  1. The chart is flattened into a metrics view (planets.sun.sign, houses.10.sign, counts.sign.scorpio, …).
  2. Every rule in the ontology evaluates its conditions against that view.
  3. A rule that matches contributes its weight to the rule's skill.
  4. Per-skill scores are summed and clamped to [0, 1].

Example rule (excerpt from the published ontology)

- id: moon_in_water
  skill: empathy
  description: "Moon in a water sign deepens emotional attunement."
  weight: 0.45
  conditions:
    - { path: planets.moon.sign, op: in, value: [cancer, scorpio, pisces] }

Rules are versioned with the ontology; breaking changes ship under a new major version and the old ontology stays available for at least 6 months.

Why a score might be zero

  • The chart doesn't satisfy any rule for that skill. Common for charts with heavy emphasis in one element — e.g., a fire-heavy chart may score low on operations (which is biased toward earth).
  • The skill is genuinely a soft spot for this configuration. Use the risk template family in the Interpretations endpoint to surface this as recommended counter-balance.

Explainability — pairing with rule descriptions

The contributing_rules array carries rule ids; the human-readable description for each id is part of the published ontology. A common client pattern:

ontology = load_ontology()  # ships with your SDK or as a separate download
for skill in profile["scores"]:
    if skill["value"] >= 0.4:
        print(skill["skill_id"], skill["value"])
        for rule_id in skill["contributing_rules"]:
            print("  •", ontology.rule_descriptions[rule_id])

This turns the score into a tooltip / explainer rather than a black box.