Claude Skill

let-fate-decide

Draws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, ma

LLM Mart · 0 points · 5 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download trailofbits-skills-plugins_let-fate-decide_skills_let-fate-decide-123037e.zip · 65 KB
trailofbits/skills 7234 616 forks CC-BY-SA-4.0 Updated 11h ago
Part of trailofbits/skills — 100 skills

Install

skills CLI npx skills add https://github.com/trailofbits/skills/tree/main/plugins/let-fate-decide/skills/let-fate-decide
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install trailofbits-skills@llmmart
Git git clone https://github.com/trailofbits/skills.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole trailofbits/skills collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

Let Fate Decide

When the path forward is unclear, let the cards speak.

Quick Start

  1. Run the drawing script:

    uv run --no-config {baseDir}/scripts/draw_cards.py
    
  2. The script outputs JSON for the default 12 Houses of the Zodiac spread: 12 houses, each with 1 Major Arcana card and 2 Minor Arcana cards. Each house and card includes a file path relative to {baseDir}/

  3. Read each house file and each card's meaning file to understand the draw. For faster reads, use --content to include house and card text directly in the JSON:

    uv run --no-config {baseDir}/scripts/draw_cards.py --content
    
  4. Interpret the spread using the guide at /references/INTERPRETATION_GUIDE.md

  5. When the task belongs to a specialized technical workflow, use /references/TECHNICAL_CONTEXT_LENSES.md to translate the reading into an audit, verification, domain, failure-class, or stakeholder lens

  6. Apply the interpretation to the task at hand

When to Use

  • Vague prompts: The user's request is ambiguous and multiple reasonable approaches exist
  • Explicit invocations: "I'm feeling lucky", "let fate decide", "dealer's choice", "surprise me", "whatever you think", "YOLO"
  • Casual delegation: "whatever", "up to you", "your call", "idk", "just do something", "wing it", "I trust you", "doesn't matter", "do what you want", "I don't care", "any approach works", "you pick"
  • Yu-Gi-Oh energy: "Heart of the cards", "I believe in the heart of the cards", "you've activated my trap card", "it's time to duel"
  • Shrug-like brevity: Very short prompts that fully delegate the decision without expressing a preference
  • Redraw requests: "Try again" or "draw again" when no actual system changes occurred (this means draw new cards, not re-run the same approach)
  • Tie-breaking: When you are about to arbitrarily pick between 2+ valid approaches, draw cards instead of silently choosing one

When NOT to Use

  • The user has given clear, specific instructions
  • The task has a single obvious correct approach
  • As the deciding authority for safety-critical work (security, data integrity, production deployments, release approval, incident response)
  • The user explicitly asks you NOT to use Tarot
  • The user's tone is precision-seeking rather than casual -- ask clarifying questions instead to gather actual requirements

Security and Correctness Use

This skill may be used inside a security, audit, or correctness pipeline as a creative lens for discovery: choosing which angle to inspect next, breaking analysis paralysis, generating hypotheses, or surfacing blind spots.

It is never sufficient by itself. In security and correctness contexts, the reading must be followed by ordinary engineering evidence: source review, tests, proofs, traces, reproduction steps, exploitability analysis, or other domain-appropriate verification. Do not treat a favorable card as permission to ship, suppress a finding, skip validation, or overrule a concrete risk.

How It Works

The Draw

The script uses secrets for cryptographic randomness:

  1. Builds separate Major Arcana (22 cards) and Minor Arcana (56 cards) decks
  2. Performs Fisher-Yates shuffles via secrets.randbelow() (no modulo bias)
  3. Deals the default 12 Houses of the Zodiac spread
  4. Each house receives 1 Major Arcana card followed by 2 Minor Arcana cards
  5. Each of the 36 cards independently has a 50% chance of being reversed

The default spread records a conservative unordered-card entropy budget exceeding 100 bits: roughly log2(C(22,12)) bits from Major Arcana selection, log2(C(56,24)) bits from Minor Arcana selection (assuming secrets.randbelow() is cryptographically secure), plus 36 reversal bits. The exact values are computed and reported in the JSON output under entropy_bits. The actual ordered assignment of cards to houses contains more entropy.

The Spread

The default spread is 12 Houses of the Zodiac:

House Represents Question It Answers
1 Self How should this work begin?
2 Resources What values, assets, or constraints matter?
3 Communication What needs to be clarified or connected?
4 Foundations What context or dependency anchors the task?
5 Creativity Where should experimentation or delight shape the work?
6 Practice What quality, maintenance, or execution concern matters?
7 Partnership Who or what must this integrate with?
8 Transformation What risk, shared state, or deep change is present?
9 Exploration What principle or broader strategy guides the path?
10 Calling What delivery or long-term outcome is being served?
11 Community What system, network, or shared aspiration is involved?
12 The Hidden What blind spot, ending, or unconscious factor matters?

Within each house, the Major Arcana card sets the archetypal theme and the two Minor Arcana cards provide practical detail.

For compatibility with older workflows, draw_cards.py --legacy returns the previous 4-card hand, and draw_cards.py --legacy <count> returns a custom hand of 1-78 cards. A positional count without --legacy is rejected, because the new default spread has a fixed shape.

Reference Files

Each house's meaning is in its own markdown file under {baseDir}/houses/. House files describe how the house applies across technical contexts including building new projects, vulnerability discovery, correctness verification, and common audit, verification, domain, failure-class, and stakeholder workflows.

Each card's meaning is in its own markdown file under {baseDir}/cards/:

  • cards/major/ - 22 Major Arcana (archetypal forces)
  • cards/wands/ - 14 Wands (creativity, action, will)
  • cards/cups/ - 14 Cups (emotion, intuition, relationships)
  • cards/swords/ - 14 Swords (intellect, conflict, truth)
  • cards/pentacles/ - 14 Pentacles (material, practical, craft)

Interpretation

After drawing, read each house file and each card file, then synthesize meaning. See /references/INTERPRETATION_GUIDE.md for the full interpretation workflow. For cross-domain translation, see /references/TECHNICAL_CONTEXT_LENSES.md.

Key rules:

  • Reversed cards invert or complicate the upright meaning
  • Major Arcana cards carry more weight than Minor Arcana
  • The spread tells a story across all 12 houses; don't interpret cards in isolation
  • Map abstract meanings to concrete technical decisions
  • In security, audit, and correctness work, use the reading to choose an investigation path, then require evidence before accepting or dismissing any risk
  • Never output interpretation as a text-only turn. Include the interpretation alongside your next tool call (the action that implements the chosen option). Prefer --content so all 36 card meanings and all 12 house meanings are available from the draw output.

Example Session (House-Level Fragment)

A real reading synthesizes all 12 houses; the fragment below shows only what one house contributes so the format is clear. Do not stop after one house in actual use.

User: "I dunno, just make it work somehow"

[Draw cards]
1st House (Self): The Magician (upright), Five of Swords (reversed),
                  Ten of Pentacles (upright)

House contribution: The starting stance is resourceful and tool-rich
(Magician), but the practical details warn against combative edge-case work
(Five of Swords reversed) while still favoring maintainable craft
(Ten of Pentacles). This is one input into the overall reading; combine with
the remaining 11 houses before deciding on an approach.

The named draw agent returns a more compact form for portent questions: 3 concise bullets covering the dominant theme, the main risk or blind spot, and the recommended next action.

Error Handling

If the drawing script fails:

  • Script crashes with traceback: Report the error to the user and skip the reading. Do not invent cards or simulate a draw — the whole point is real entropy.
  • Card file not found: Note the missing file, interpret the card from its name and suit alone, and continue with the reading.
  • Never fake entropy: If the script cannot run, do not simulate a draw using your own "randomness." Tell the user the draw failed.

Rationalizations to Reject

Rationalization Why Wrong
"The cards said to, so I must" Cards inform direction, they don't override safety or correctness
"This reading justifies my pre-existing preference" Be honest if the reading challenges your instinct
"The reversed card means do nothing" Reversed means a different angle, not inaction
"Major Arcana overrides user requirements" User requirements always take priority over card readings
"I'll keep drawing until I get what I want" One draw per decision point; accept the reading
"The reading says the risk is fine" Cards can suggest what to inspect; only evidence can dismiss a security or correctness concern
Files (skills)
  • agents
    • openai.yaml 236 B
      interface:
        display_name: "Let Fate Decide"
        short_description: "Use a random Tarot spread to guide ambiguous plans"
        icon_small: "assets/trail-of-bits-mark.svg"
        icon_large: "assets/trail-of-bits-mark.svg"
        brand_color: "#D83A34"
      
  • assets
    • trail-of-bits-mark.svg 3 KB · in bundle
  • cards
    • cups
      • ace-of-cups.md 627 B
        # Ace of Cups
        
        **Suit**: Cups | **Rank**: Ace
        
        ## Upright
        New feelings, emotional awakening, and a surge of creativity and intuition. This card signals the beginning of a deep emotional or creative journey. Open yourself to the flow of inspiration.
        
        ## Reversed
        Emotional loss, blocked creativity, and a sense of emptiness. You may be suppressing your feelings or struggling to connect with your inner voice. Something is damming the flow.
        
        ## In Technical Context
        Treat intuition as a useful signal, not proof. Build a small prototype, user
        check, or focused test around the approach that feels right before committing
        to it.
        
      • eight-of-cups.md 666 B
        # Eight of Cups
        
        **Suit**: Cups | **Rank**: 8
        
        ## Upright
        Walking away, disillusionment, and leaving behind what no longer serves you. Despite investment, you recognize that this path leads nowhere. It takes courage to turn your back on the familiar.
        
        ## Reversed
        Fear of change, aimless drifting, and avoidance. You know you should leave but cannot bring yourself to act. Clinging to a dead end out of comfort or cowardice.
        
        ## In Technical Context
        Evaluate whether the current approach is still earning its keep. Upright, walk
        away from a path that no longer works; reversed, name the fear or sunk cost
        that is keeping you attached before deciding what to change.
        
      • five-of-cups.md 603 B
        # Five of Cups
        
        **Suit**: Cups | **Rank**: 5
        
        ## Upright
        Loss, grief, and regret dominate your attention. You are fixated on what has spilled and failed, blind to what remains. Disappointment clouds your judgment.
        
        ## Reversed
        Acceptance, moving on, and finding peace. The grieving period ends and you begin to see what was salvaged. Forgiveness—of yourself or others—opens a new path forward.
        
        ## In Technical Context
        Separate the failed investment from the remaining useful pieces. Upright, stop
        letting sunk cost dominate the plan; reversed, convert what was learned into a
        cleaner path forward.
        
      • four-of-cups.md 607 B
        # Four of Cups
        
        **Suit**: Cups | **Rank**: 4
        
        ## Upright
        Apathy, contemplation, and disconnection. You are so focused on what you lack that you miss what is being offered. Reevaluation is needed, but don't let it become paralysis.
        
        ## Reversed
        Sudden awareness, acceptance, and moving forward. The fog lifts and you finally see the opportunity that was always there. A renewed sense of motivation takes hold.
        
        ## In Technical Context
        Step back and inventory what is already available. Upright, an obvious option
        may be getting ignored; reversed, use the renewed clarity to move from
        evaluation into action.
        
      • king-of-cups.md 511 B
        # King of Cups
        
        **Suit**: Cups | **Rank**: King
        
        ## Upright
        Emotional balance, control, and diplomatic generosity. The king masters his feelings without suppressing them. He leads with wisdom tempered by genuine compassion.
        
        ## Reversed
        Emotional manipulation, moodiness, and volatility. Control has curdled into repression or weaponized into coercion. The calm surface hides a turbulent undercurrent.
        
        ## In Technical Context
        Balance technical excellence with empathy. Mentor the team through this complexity.
        
      • knight-of-cups.md 478 B
        # Knight of Cups
        
        **Suit**: Cups | **Rank**: Knight
        
        ## Upright
        Romance, charm, and imagination guide the way. The knight follows the heart toward an elegant vision. Grace and beauty are valued over brute force.
        
        ## Reversed
        Moodiness, unrealistic expectations, and disappointment. The pursuit of perfection has become self-indulgent. Elegance without substance is just decoration.
        
        ## In Technical Context
        Pursue the elegant solution. Prioritize beautiful code and clean APIs.
        
      • nine-of-cups.md 634 B
        # Nine of Cups
        
        **Suit**: Cups | **Rank**: 9
        
        ## Upright
        Satisfaction, emotional stability, and contentment. Known as the "wish card," it signals that what you desire is within reach. Enjoy the luxury of a job well done.
        
        ## Reversed
        Inner dissatisfaction lurking beneath surface success. Materialism or vanity may be substituting for genuine fulfillment. What you wanted isn't what you needed.
        
        ## In Technical Context
        The approach may have strong user or maintainer fit, but validate the happy
        path end to end before calling it done. If reversed, check whether surface
        satisfaction is hiding a missing requirement or weak tradeoff.
        
      • page-of-cups.md 518 B
        # Page of Cups
        
        **Suit**: Cups | **Rank**: Page
        
        ## Upright
        Creative opportunity, curiosity, and fresh ideas bubble up from unexpected places. The inner child stirs with wonder. A new emotional or artistic impulse arrives bearing a message.
        
        ## Reversed
        Emotional immaturity, creative block, and insecurity. Self-doubt smothers the spark before it can catch. You are too afraid of looking foolish to try something new.
        
        ## In Technical Context
        Think creatively. The unconventional solution might be the best one here.
        
      • queen-of-cups.md 502 B
        # Queen of Cups
        
        **Suit**: Cups | **Rank**: Queen
        
        ## Upright
        Compassion, calm, and emotional security. The queen holds space for others with deep intuitive understanding. Comfort flows naturally from genuine empathy and presence.
        
        ## Reversed
        Codependency, neglected inner feelings, and forgotten self-care. You have given so much to others that nothing remains for yourself. Boundaries must be restored.
        
        ## In Technical Context
        Prioritize the user experience. How will the end user feel using this?
        
      • seven-of-cups.md 497 B
        # Seven of Cups
        
        **Suit**: Cups | **Rank**: 7
        
        ## Upright
        Fantasy, illusion, and wishful thinking. Too many choices shimmer before you, each more tempting than the last. Not all that glitters is real—discernment is essential.
        
        ## Reversed
        Alignment with personal values and becoming grounded. The illusions dissolve and clarity emerges. You finally see which option is real and which was smoke.
        
        ## In Technical Context
        Too many options causing analysis paralysis. Ground yourself and pick one.
        
      • six-of-cups.md 496 B
        # Six of Cups
        
        **Suit**: Cups | **Rank**: 6
        
        ## Upright
        Nostalgia, childhood memories, and innocence. A reunion with the past brings comfort and clarity. Simple joys and familiar patterns offer guidance.
        
        ## Reversed
        Stuck in the past and clinging to unrealistic expectations. Nostalgia has become a trap rather than a guide. You must let go of how things were to see how they could be.
        
        ## In Technical Context
        Look at how this was solved before. Past patterns or prior art may hold the answer.
        
      • ten-of-cups.md 536 B
        # Ten of Cups
        
        **Suit**: Cups | **Rank**: 10
        
        ## Upright
        Harmony, happiness, and complete fulfillment. Everything aligns—heart, mind, and circumstance. This is the emotional culmination, where relationships and efforts reach their ideal state.
        
        ## Reversed
        Broken harmony, disillusionment, and misalignment. The picture-perfect vision has cracked. Values are at odds with reality, and the dream doesn't match what was built.
        
        ## In Technical Context
        Full alignment between implementation and requirements. This is the ideal solution.
        
      • three-of-cups.md 482 B
        # Three of Cups
        
        **Suit**: Cups | **Rank**: 3
        
        ## Upright
        Celebration, friendship, and joyful collaboration. The community comes together in shared success. This is a time for collective effort and mutual support.
        
        ## Reversed
        Overindulgence, gossip, and isolation. The group dynamic has soured, or you've withdrawn from those who could help. Social excess may be masking deeper issues.
        
        ## In Technical Context
        Involve the team. This is a collaborative effort, not a solo mission.
        
      • two-of-cups.md 500 B
        # Two of Cups
        
        **Suit**: Cups | **Rank**: 2
        
        ## Upright
        Partnership, unity, and mutual respect form the core of this card. A meaningful connection or collaboration is forming. Two forces come together in balanced harmony.
        
        ## Reversed
        Breakup, imbalance, and lack of harmony. A partnership may be strained or one side is giving far more than the other. Misaligned expectations are eroding trust.
        
        ## In Technical Context
        Pair program or collaborate closely. This task benefits from two perspectives.
        
    • major
      • 00-the-fool.md 563 B
        # The Fool
        
        **Arcana**: Major | **Number**: 0
        
        ## Upright
        New beginnings, innocence, and spontaneity. The Fool steps forward without fear, trusting the journey ahead. This card suggests embracing the unknown and taking a leap of faith.
        
        ## Reversed
        Recklessness, carelessness, and negligence. The reversed Fool rushes in without thinking, ignoring obvious risks. Naivety becomes a liability rather than a strength.
        
        ## In Technical Context
        Suggests starting fresh -- a greenfield approach or unfamiliar technology. Embrace experimentation, but have a safety net.
        
      • 01-the-magician.md 648 B
        # The Magician
        
        **Arcana**: Major | **Number**: I
        
        ## Upright
        Manifestation, resourcefulness, and skilled action. The Magician has all the tools needed and knows how to use them. This card says you have everything required to make it happen -- focus your intent and execute.
        
        ## Reversed
        Manipulation, trickery, and unused potential. The reversed Magician either misuses their talents or fails to use them at all. Cleverness without integrity leads nowhere good.
        
        ## In Technical Context
        You already have the tools and knowledge to solve this. Stop researching and start building. The answer is in your existing toolkit, not in another dependency.
        
      • 02-the-high-priestess.md 710 B
        # The High Priestess
        
        **Arcana**: Major | **Number**: II
        
        ## Upright
        Intuition, unconscious knowledge, and hidden truth. The High Priestess sits at the threshold between the seen and unseen. Trust what you sense beneath the surface -- the answer is there but not yet articulated.
        
        ## Reversed
        Secrets, withdrawal, and repressed intuition. The reversed High Priestess warns that important information is being hidden or ignored. Silence here is not wisdom but avoidance.
        
        ## In Technical Context
        The bug or design flaw is there but not obvious yet. Trust your instinct that something feels off. Dig into the logs, read between the lines of the error messages, and investigate the quiet corners of the codebase.
        
      • 03-the-empress.md 645 B
        # The Empress
        
        **Arcana**: Major | **Number**: III
        
        ## Upright
        Abundance, nurturing, and creative growth. The Empress cultivates and sustains, bringing ideas to fruition through patient care. This card suggests fostering what exists rather than forcing something new.
        
        ## Reversed
        Dependence, smothering, and creative emptiness. The reversed Empress over-invests in one thing at the expense of everything else. Nurturing becomes suffocating when there are no boundaries.
        
        ## In Technical Context
        Invest in developer experience, documentation, and onboarding. Grow the project by making it welcoming and sustainable, not by adding more features.
        
      • 04-the-emperor.md 651 B
        # The Emperor
        
        **Arcana**: Major | **Number**: IV
        
        ## Upright
        Authority, structure, and disciplined control. The Emperor brings order from chaos through clear rules and firm boundaries. This card calls for establishing systems, setting standards, and leading with decisive action.
        
        ## Reversed
        Tyranny, rigidity, and inflexibility. The reversed Emperor demands compliance without reason and resists all change. Structure becomes a cage when it cannot adapt.
        
        ## In Technical Context
        Establish clear architecture, coding standards, and review processes. The project needs governance and structure right now -- but keep it pragmatic, not authoritarian.
        
      • 05-the-hierophant.md 685 B
        # The Hierophant
        
        **Arcana**: Major | **Number**: V
        
        ## Upright
        Tradition, established systems, and conventional wisdom. The Hierophant preserves knowledge and teaches through proven methods. This card advises following established patterns and learning from those who came before.
        
        ## Reversed
        Rebellion, subversiveness, and challenging the status quo. The reversed Hierophant questions orthodoxy and breaks from tradition. Sometimes the established way is wrong and a new approach is needed.
        
        ## In Technical Context
        Follow the well-documented, battle-tested approach. Use the standard library, adopt the framework's conventions, and read the RFCs. Now is not the time to be clever.
        
      • 06-the-lovers.md 715 B
        # The Lovers
        
        **Arcana**: Major | **Number**: VI
        
        ## Upright
        Harmony, meaningful choices, and alignment of values. The Lovers represent a crossroads where the decision reflects who you truly are. This card says the choice matters deeply -- pick the option that aligns with your principles.
        
        ## Reversed
        Disharmony, imbalance, and misalignment. The reversed Lovers signal a mismatch between values and actions, or a partnership that is not working. Avoiding the choice is itself a choice.
        
        ## In Technical Context
        You face a genuine architectural fork. Evaluate the trade-offs honestly between competing approaches. Pick the one that aligns with the project's long-term values, not the one that is merely expedient.
        
      • 07-the-chariot.md 704 B
        # The Chariot
        
        **Arcana**: Major | **Number**: VII
        
        ## Upright
        Willpower, determination, and hard-won victory. The Chariot charges forward through sheer force of will, holding opposing forces in balance. This card says push through obstacles with focus and discipline.
        
        ## Reversed
        Lack of direction, scattered effort, and aggression without purpose. The reversed Chariot crashes when willpower becomes stubbornness. Momentum without steering is just a faster way to fail.
        
        ## In Technical Context
        Push through the hard part. The implementation is tough but achievable with focused effort. Set a deadline, minimize distractions, and ship it -- but make sure you are driving toward the right destination.
        
      • 08-strength.md 689 B
        # Strength
        
        **Arcana**: Major | **Number**: VIII
        
        ## Upright
        Courage, patience, and quiet influence. Strength tames not through force but through compassion and persistence. This card advises gentle determination -- the problem yields to steady, patient effort rather than brute force.
        
        ## Reversed
        Self-doubt, weakness, and insecurity. The reversed Strength card signals a loss of confidence or trying to force what requires finesse. Raw power without patience makes things worse.
        
        ## In Technical Context
        The brute-force solution will not work here. Apply patience: profile before optimizing, refactor incrementally, and persuade the team through working examples rather than arguments.
        
      • 09-the-hermit.md 644 B
        # The Hermit
        
        **Arcana**: Major | **Number**: IX
        
        ## Upright
        Introspection, solitude, and inner guidance. The Hermit withdraws from noise to find clarity through deep contemplation. This card says step back, reflect, and let understanding come before action.
        
        ## Reversed
        Isolation, loneliness, and excessive withdrawal. The reversed Hermit retreats too far and loses connection with reality. Solitude becomes avoidance when it has no end.
        
        ## In Technical Context
        Step away and think deeply before coding. Read the docs, study the problem space, and resist the urge to jump in. The answer will come from understanding, not from typing faster.
        
      • 10-wheel-of-fortune.md 723 B
        # Wheel of Fortune
        
        **Arcana**: Major | **Number**: X
        
        ## Upright
        Change, cycles, and decisive turning points. The Wheel spins and what was down comes up -- nothing stays the same forever. This card signals that forces beyond your control are shifting things in a new direction.
        
        ## Reversed
        Bad luck, resistance to change, and clinging to the old cycle. The reversed Wheel warns against fighting inevitable transitions. The harder you grip the current state, the more painful the change will be.
        
        ## In Technical Context
        The landscape is shifting -- a new version, a deprecation, a market change. Adapt now rather than later. What worked before may not work going forward, and that is not a failure, it is just the cycle.
        
      • 11-justice.md 664 B
        # Justice
        
        **Arcana**: Major | **Number**: XI
        
        ## Upright
        Fairness, truth, and cause and effect. Justice weighs evidence impartially and renders a clear verdict. This card demands honesty, accountability, and accepting consequences of past decisions.
        
        ## Reversed
        Unfairness, dishonesty, and avoiding accountability. The reversed Justice card signals bias, blame-shifting, or a system that rewards the wrong behavior. Someone is not playing fair.
        
        ## In Technical Context
        Apply rigorous, objective evaluation. Benchmark before choosing, measure before claiming improvement, and hold all options to the same standard. Let the data decide, not opinions or politics.
        
      • 12-the-hanged-man.md 709 B
        # The Hanged Man
        
        **Arcana**: Major | **Number**: XII
        
        ## Upright
        Surrender, letting go, and radical new perspective. The Hanged Man sees the world upside down and finds wisdom in the inversion. This card advises pausing, releasing control, and looking at the problem from a completely different angle.
        
        ## Reversed
        Delays, resistance to sacrifice, and stalling. The reversed Hanged Man refuses to let go or change perspective, trapped by stubbornness. The pause has become paralysis.
        
        ## In Technical Context
        Invert your assumptions. If you have been trying to make the data fit the schema, change the schema. If the test keeps failing, maybe the test is right and the code is wrong. Look at it upside down.
        
      • 13-death.md 702 B
        # Death
        
        **Arcana**: Major | **Number**: XIII
        
        ## Upright
        Endings, transformation, and necessary transition. Death clears away what no longer serves to make room for what comes next. This card does not mean literal death -- it means something must end so something better can begin.
        
        ## Reversed
        Resistance to change, stagnation, and inability to let go. The reversed Death card clings to what is already gone, refusing the transformation. Decay accelerates when you will not let the dead thing die.
        
        ## In Technical Context
        Kill the feature, deprecate the API, or delete the legacy code. It served its purpose and now it is holding you back. The longer you keep it on life support, the more it costs.
        
      • 14-temperance.md 706 B
        # Temperance
        
        **Arcana**: Major | **Number**: XIV
        
        ## Upright
        Balance, moderation, and purposeful patience. Temperance blends opposing elements into something harmonious through careful, measured action. This card advises finding the middle path and taking a long-term view.
        
        ## Reversed
        Imbalance, excess, and lack of long-term vision. The reversed Temperance card warns of overindulgence in one direction -- too fast, too much, too soon. Haste and extremes undermine what patience would achieve.
        
        ## In Technical Context
        Balance speed with quality, features with stability, innovation with reliability. The right answer is probably a measured combination of approaches, not an all-in bet on one extreme.
        
      • 15-the-devil.md 699 B
        # The Devil
        
        **Arcana**: Major | **Number**: XV
        
        ## Upright
        Bondage, materialism, and the shadow self. The Devil represents chains that are self-imposed -- addictions, dependencies, and patterns you choose to keep. This card exposes what controls you by revealing you have always had the power to leave.
        
        ## Reversed
        Release, breaking free, and reclaiming power. The reversed Devil signals liberation from what held you captive. The chains fall away once you decide to remove them.
        
        ## In Technical Context
        You are trapped by a dependency, vendor lock-in, or sunk-cost fallacy. Acknowledge the chain, then break it. The migration cost is real but finite; the cost of staying is ongoing and growing.
        
      • 16-the-tower.md 723 B
        # The Tower
        
        **Arcana**: Major | **Number**: XVI
        
        ## Upright
        Sudden upheaval, revelation, and the destruction of false structures. The Tower is struck by lightning and what was built on a weak foundation crumbles. This card says the collapse is necessary -- truth cannot be built on lies.
        
        ## Reversed
        Fear of change, averting disaster, and delaying the inevitable. The reversed Tower tries to prop up what is already crumbling. You can delay the fall, but the foundation is still broken.
        
        ## In Technical Context
        Something fundamental about the current approach is wrong. Tear it down and rebuild rather than patching. The outage, the security breach, or the architectural failure is revealing a truth you need to act on.
        
      • 17-the-star.md 653 B
        # The Star
        
        **Arcana**: Major | **Number**: XVII
        
        ## Upright
        Hope, inspiration, and serene renewal. The Star appears after destruction, offering calm guidance and restored faith. This card says healing is underway -- trust the process and let clarity return naturally.
        
        ## Reversed
        Despair, disconnection, and loss of faith. The reversed Star has lost sight of the guiding light and feels adrift. Without hope, even good options look bleak.
        
        ## In Technical Context
        After the incident or the failed launch, take a breath. The path forward exists and the team can recover. Focus on the north star of what you are building and let that guide the rebuild.
        
      • 18-the-moon.md 759 B
        # The Moon
        
        **Arcana**: Major | **Number**: XVIII
        
        ## Upright
        Illusion, fear, and the murky subconscious. The Moon casts shadows that distort perception -- things are not what they seem. This card warns that anxiety and uncertainty are clouding judgment, and the path is less dangerous than it appears.
        
        ## Reversed
        Release of fear, emerging clarity, and truth surfacing. The reversed Moon signals that illusions are fading and reality is becoming visible. What seemed terrifying in the dark is manageable in the light.
        
        ## In Technical Context
        You do not fully understand the system yet and your assumptions may be wrong. Do not trust the documentation at face value -- write tests, add logging, and verify behavior empirically before building on top of it.
        
      • 19-the-sun.md 722 B
        # The Sun
        
        **Arcana**: Major | **Number**: XIX
        
        ## Upright
        Joy, success, vitality, and radiant confidence. The Sun shines without reservation, illuminating everything clearly. This card signals a period of energy, clarity, and well-earned success -- things are going well and will continue to.
        
        ## Reversed
        Diminished joy, sadness beneath the surface, and overconfidence. The reversed Sun warns that excessive optimism may be masking real problems. The light is still there but something is blocking it.
        
        ## In Technical Context
        The approach is working and the team has momentum. Lean into it -- ship the feature, celebrate the milestone, and build on the success. But do not skip the tests just because things feel good.
        
      • 20-judgement.md 701 B
        # Judgement
        
        **Arcana**: Major | **Number**: XX
        
        ## Upright
        Reflection, reckoning, and awakening to purpose. Judgement calls you to honestly evaluate the past, learn from it, and rise renewed. This card demands a clear-eyed accounting of what worked, what failed, and what you are meant to do next.
        
        ## Reversed
        Self-doubt, refusal to learn, and harsh self-judgment. The reversed Judgement card either avoids reflection entirely or drowns in it. Neither denial nor self-flagellation produces growth.
        
        ## In Technical Context
        Conduct a proper retrospective. Review the post-mortem, audit the technical debt, and honestly assess what needs to change. Learn the lesson so you do not repeat the incident.
        
      • 21-the-world.md 731 B
        # The World
        
        **Arcana**: Major | **Number**: XXI
        
        ## Upright
        Completion, accomplishment, and wholeness. The World represents the successful end of a cycle -- everything has come together. This card signals fulfillment, integration, and the satisfying close of a chapter before the next begins.
        
        ## Reversed
        Incompletion, shortcuts, and lingering loose ends. The reversed World warns that the finish line was crossed but the work is not truly done. Declaring victory too early leaves gaps that will haunt you.
        
        ## In Technical Context
        The project is ready to ship -- or it should be. Tie up the loose ends, write the migration guide, update the changelog, and close the milestone properly. A clean ending sets up a clean beginning.
        
    • pentacles
      • ace-of-pentacles.md 458 B
        # Ace of Pentacles
        
        **Suit**: Pentacles | **Rank**: Ace
        
        ## Upright
        New financial opportunity, prosperity, and manifestation. A seed of material
        success is being planted. The foundation for something tangible is here.
        
        ## Reversed
        Lost opportunity, poor planning, and scarcity. A promising start slips away
        due to lack of preparation or follow-through.
        
        ## In Technical Context
        A solid foundation to build on. Start with the fundamentals and get them right.
        
      • eight-of-pentacles.md 486 B
        # Eight of Pentacles
        
        **Suit**: Pentacles | **Rank**: 8
        
        ## Upright
        Diligence, mastery, and skill development. Repetitive, detail-oriented work
        that builds expertise. The apprentice honing their craft one piece at a time.
        
        ## Reversed
        Perfectionism, lack of motivation, and scattered focus. The pursuit of mastery
        becomes an excuse to never ship, or effort lacks direction.
        
        ## In Technical Context
        Heads-down, detailed craftsmanship. Focus on getting the implementation exactly
        right.
        
      • five-of-pentacles.md 427 B
        # Five of Pentacles
        
        **Suit**: Pentacles | **Rank**: 5
        
        ## Upright
        Financial loss, insecurity, and hardship. Difficult times and material worry.
        Resources are thin and the path forward feels bleak.
        
        ## Reversed
        Recovery from hardship, inner scarcity, or accepting help. The worst is
        passing, but the scars of scarcity linger.
        
        ## In Technical Context
        Resources are scarce. Work within constraints rather than wishing for more.
        
      • four-of-pentacles.md 436 B
        # Four of Pentacles
        
        **Suit**: Pentacles | **Rank**: 4
        
        ## Upright
        Security, conservation, and control. Holding tightly to what you have out of
        fear of loss. Stability maintained through a scarcity mindset.
        
        ## Reversed
        Greed, materialism, and reluctance to let go. Over-control stifles growth and
        prevents necessary change.
        
        ## In Technical Context
        Don't over-protect or over-abstract. Release your grip on the code and let it
        evolve.
        
      • king-of-pentacles.md 459 B
        # King of Pentacles
        
        **Suit**: Pentacles | **Rank**: King
        
        ## Upright
        Wealth, business acumen, and disciplined leadership. Security built through
        steady, responsible stewardship. The master of the material world.
        
        ## Reversed
        Financially inept, obsessed with wealth, or stubbornly rigid. Leadership
        devolves into greed or an inability to adapt.
        
        ## In Technical Context
        Enterprise-grade thinking. Build with discipline, reliability, and production
        readiness.
        
      • knight-of-pentacles.md 471 B
        # Knight of Pentacles
        
        **Suit**: Pentacles | **Rank**: Knight
        
        ## Upright
        Efficiency, routine, and methodical progress. The most reliable and
        conservative of the knights. Steady effort without flash or shortcuts.
        
        ## Reversed
        Boredom, laziness, and feeling stuck. Methodical progress stalls into
        perfectionism or an inability to adapt when the plan needs changing.
        
        ## In Technical Context
        Slow, steady, reliable progress. No shortcuts—follow the process methodically.
        
      • nine-of-pentacles.md 447 B
        # Nine of Pentacles
        
        **Suit**: Pentacles | **Rank**: 9
        
        ## Upright
        Abundance, luxury, and self-sufficiency. Financial independence earned through
        discipline and effort. Enjoying the fruits of sustained work.
        
        ## Reversed
        Over-investment in work at the expense of everything else. Superficial success
        that masks deeper dissatisfaction.
        
        ## In Technical Context
        The solution is self-contained and elegant. Minimal dependencies, maximum
        reliability.
        
      • page-of-pentacles.md 465 B
        # Page of Pentacles
        
        **Suit**: Pentacles | **Rank**: Page
        
        ## Upright
        Ambition, desire to learn, and studiousness. A new venture approached with
        diligence and curiosity. Grounded enthusiasm for mastering something tangible.
        
        ## Reversed
        Lack of progress, procrastination, and learning without doing. Endless
        preparation that never translates into action.
        
        ## In Technical Context
        Study the problem domain first. Read the docs, understand the data model, then
        code.
        
      • queen-of-pentacles.md 452 B
        # Queen of Pentacles
        
        **Suit**: Pentacles | **Rank**: Queen
        
        ## Upright
        Practicality, nurturing, and financial security. A grounded provider who makes
        things work reliably. Comfort built through attentive, steady care.
        
        ## Reversed
        Self-centeredness, jealousy, and neglecting priorities. Practical wisdom gives
        way to misplaced focus or resentment.
        
        ## In Technical Context
        Practical, nurturing approach. Make it work reliably before making it clever.
        
      • seven-of-pentacles.md 461 B
        # Seven of Pentacles
        
        **Suit**: Pentacles | **Rank**: 7
        
        ## Upright
        Patience, long-term investment, and perseverance. The work has been done and
        now you wait for the harvest. Rewards come to those who endure.
        
        ## Reversed
        Impatience, poor returns, and frustration. The effort invested feels wasted,
        or the temptation to abandon a long-term plan grows.
        
        ## In Technical Context
        Long-term investment in quality. Write the tests, document the API, build it
        right.
        
      • six-of-pentacles.md 428 B
        # Six of Pentacles
        
        **Suit**: Pentacles | **Rank**: 6
        
        ## Upright
        Generosity, charity, and sharing wealth. Giving and receiving in balance.
        Resources flow where they are needed most.
        
        ## Reversed
        Strings attached, debt, and one-sided charity. Generosity with hidden motives
        or an imbalance of power in the exchange.
        
        ## In Technical Context
        Share knowledge and reuse existing work. Open source it or leverage what others
        built.
        
      • ten-of-pentacles.md 459 B
        # Ten of Pentacles
        
        **Suit**: Pentacles | **Rank**: 10
        
        ## Upright
        Wealth, inheritance, and legacy. Long-term success that extends beyond the
        individual. Building something that endures for those who come after.
        
        ## Reversed
        Financial failure, loss of legacy, and short-term focus. What was built
        crumbles because no one planned for succession.
        
        ## In Technical Context
        Build for the long term. Think about maintainability, succession, and future
        developers.
        
      • three-of-pentacles.md 468 B
        # Three of Pentacles
        
        **Suit**: Pentacles | **Rank**: 3
        
        ## Upright
        Teamwork, collaboration, and craftsmanship. Skilled people working together
        produce something greater than any individual could. Learning through doing.
        
        ## Reversed
        Disharmony, misalignment, and working alone. The team is out of sync, or
        someone insists on doing everything themselves.
        
        ## In Technical Context
        This requires collaboration and craft. Code review, pair programming, shared
        ownership.
        
      • two-of-pentacles.md 448 B
        # Two of Pentacles
        
        **Suit**: Pentacles | **Rank**: 2
        
        ## Upright
        Balance, adaptability, and juggling priorities. Multiple demands compete for
        attention, and skillful time management keeps everything in motion.
        
        ## Reversed
        Overwhelmed, disorganized, and overcommitted. Too many spinning plates lead
        to dropped responsibilities and burnout.
        
        ## In Technical Context
        Juggle the competing priorities. Balance speed and quality—neither can be zero.
        
    • swords
      • ace-of-swords.md 477 B
        # Ace of Swords
        
        **Suit**: Swords | **Rank**: Ace
        
        ## Upright
        A breakthrough moment of mental clarity and truth. A new idea cuts through confusion like a blade, revealing the path forward. Raw intellectual power at its sharpest.
        
        ## Reversed
        Confusion and chaos cloud your thinking. Lack of clarity leads to poor decisions. The truth is obscured or distorted.
        
        ## In Technical Context
        A breakthrough insight. Cut through the noise—the answer is clear if you think precisely.
        
      • eight-of-swords.md 508 B
        # Eight of Swords
        
        **Suit**: Swords | **Rank**: 8
        
        ## Upright
        Feeling trapped, restricted, and imprisoned by circumstances. Self-limiting beliefs create walls that aren't really there. The bindings are looser than they appear.
        
        ## Reversed
        A new perspective breaks the illusion of captivity. Self-acceptance frees you from mental prison. The constraints were never as real as they seemed.
        
        ## In Technical Context
        You're more constrained than you need to be. Question the assumptions limiting your approach.
        
      • five-of-swords.md 498 B
        # Five of Swords
        
        **Suit**: Swords | **Rank**: 5
        
        ## Upright
        Conflict and disagreement where winning comes at too high a cost. Competition turns toxic and the victory feels hollow. Someone walks away defeated and resentful.
        
        ## Reversed
        Reconciliation after conflict becomes possible. Forgiveness opens the door to moving forward. The desire to be right gives way to the desire for resolution.
        
        ## In Technical Context
        Winning the argument isn't worth it. Find the solution everyone can live with.
        
      • four-of-swords.md 453 B
        # Four of Swords
        
        **Suit**: Swords | **Rank**: 4
        
        ## Upright
        Rest and recuperation after mental exhaustion. Contemplation and solitude restore clarity. Step back from the battle to regain your strength.
        
        ## Reversed
        Restlessness and burnout from refusing to pause. Pushing through exhaustion leads to diminishing returns. The mind demands rest it is not getting.
        
        ## In Technical Context
        Take a break before continuing. Rest and return with fresh eyes.
        
      • king-of-swords.md 518 B
        # King of Swords
        
        **Suit**: Swords | **Rank**: King
        
        ## Upright
        Intellectual power and authority grounded in truth. Clear thinking and fair judgment command respect. Logic and evidence guide every decision with precision.
        
        ## Reversed
        Manipulative and tyrannical misuse of intellectual power. Authority wielded without fairness or compassion. The mind becomes a weapon against others rather than a tool for truth.
        
        ## In Technical Context
        Apply rigorous analytical thinking. Let logic and evidence drive the decision.
        
      • knight-of-swords.md 615 B
        # Knight of Swords
        
        **Suit**: Swords | **Rank**: Knight
        
        ## Upright
        Ambition and determination charge forward at full speed. Fast thinking and decisive action cut through obstacles. The drive to succeed overpowers hesitation.
        
        ## Reversed
        Reckless action without direction or regard for consequences. Restlessness leads to scattered energy and unfinished work. Speed without purpose causes collateral damage.
        
        ## In Technical Context
        Move decisively and cut away ambiguity, but do not outrun the evidence.
        Precision matters more than raw speed: identify the key fact, test it, and act
        without endless deliberation.
        
      • nine-of-swords.md 597 B
        # Nine of Swords
        
        **Suit**: Swords | **Rank**: 9
        
        ## Upright
        Anxiety, worry, and fear keep you awake at night. Overthinking spirals into nightmares about what might go wrong. The mind tortures itself with worst-case scenarios.
        
        ## Reversed
        Hope returns as despair loosens its grip. Reaching out to others brings comfort and perspective. Recovery from anxiety begins with a single honest conversation.
        
        ## In Technical Context
        Separate the real failure mode from the imagined one. Verify the concern with a
        test, trace, or concrete reproduction, then proceed based on evidence rather
        than anxiety.
        
      • page-of-swords.md 504 B
        # Page of Swords
        
        **Suit**: Swords | **Rank**: Page
        
        ## Upright
        Curiosity and mental energy drive a thirst for knowledge. Restless and eager, full of new ideas and questions. The mind is sharp but lacks experience to temper its edge.
        
        ## Reversed
        Deception and manipulation replace honest inquiry. All talk and no action—ideas without follow-through. Cunning used for the wrong purposes.
        
        ## In Technical Context
        Investigate before implementing. Read the source, check the docs, understand the system.
        
      • queen-of-swords.md 517 B
        # Queen of Swords
        
        **Suit**: Swords | **Rank**: Queen
        
        ## Upright
        Perceptive, clear-thinking, and fiercely independent. Direct communication cuts through pretense and ambiguity. Wisdom earned through experience sharpens every word.
        
        ## Reversed
        Coldness and bitterness replace clarity. Emotions overwhelm rational thought, or rationality suppresses necessary feeling. Sharp words wound rather than illuminate.
        
        ## In Technical Context
        Be precise and direct. Write clear code, clear commits, clear docs. No ambiguity.
        
      • seven-of-swords.md 495 B
        # Seven of Swords
        
        **Suit**: Swords | **Rank**: 7
        
        ## Upright
        Deception, stealth, and strategic maneuvering. Someone is getting away with something through cleverness rather than honesty. A shortcut that avoids confrontation but carries risk.
        
        ## Reversed
        Coming clean and letting conscience guide you. Confession and honesty replace cunning. The deception unravels and truth surfaces.
        
        ## In Technical Context
        Watch for hidden assumptions or shortcuts that seem clever but will bite you later.
        
      • six-of-swords.md 494 B
        # Six of Swords
        
        **Suit**: Swords | **Rank**: 6
        
        ## Upright
        Transition and moving on toward calmer waters. Leaving behind what no longer serves you. The journey is quiet and bittersweet, but necessary.
        
        ## Reversed
        Resistance to change keeps you anchored to the past. Unfinished business and emotional baggage weigh you down. The crossing is delayed but cannot be avoided forever.
        
        ## In Technical Context
        Migrate away from the old approach. The transition will be uncomfortable but necessary.
        
      • ten-of-swords.md 612 B
        # Ten of Swords
        
        **Suit**: Swords | **Rank**: 10
        
        ## Upright
        A painful, decisive ending. Rock bottom has been reached and there is nowhere to go but up. Betrayal or total defeat marks the close of a chapter.
        
        ## Reversed
        Resisting an inevitable ending only prolongs the suffering. Recovery and regeneration are possible, but only after accepting what is truly over. The dawn follows the darkest hour.
        
        ## In Technical Context
        Treat this as a decisive boundary. Upright, the current approach has failed and
        needs a clean replacement; reversed, stop prolonging the failure mode and plan
        the recovery deliberately.
        
      • three-of-swords.md 457 B
        # Three of Swords
        
        **Suit**: Swords | **Rank**: 3
        
        ## Upright
        Heartbreak, sorrow, and grief from a painful truth. The clarity of swords cuts deep here—what you learn hurts, but it is real. Honesty wounds before it heals.
        
        ## Reversed
        Recovery and forgiveness begin. The pain is fading and you are moving on. Lessons from sorrow start to take root.
        
        ## In Technical Context
        A painful truth about the codebase. Accept the tech debt and address it honestly.
        
      • two-of-swords.md 497 B
        # Two of Swords
        
        **Suit**: Swords | **Rank**: 2
        
        ## Upright
        A difficult choice between two seemingly equal options creates a stalemate. Avoidance and indecision keep you frozen. The blindfold must come off before progress can be made.
        
        ## Reversed
        Information overload makes the decision even harder. Indecision deepens into confusion. The cost of not choosing grows by the minute.
        
        ## In Technical Context
        Two equally valid options and you're stuck. Gather more data or just pick one and commit.
        
    • wands
      • ace-of-wands.md 461 B
        # Ace of Wands
        
        **Suit**: Wands | **Rank**: Ace
        
        ## Upright
        Inspiration, new opportunity, creative spark. A burst of energy ignites a
        fresh beginning. The seed of something powerful is being offered to you.
        
        ## Reversed
        Delays, lack of motivation, missed opportunity. The spark is there but you
        are not acting on it. Creative blocks or false starts hold you back.
        
        ## In Technical Context
        A new project or feature idea with real potential. Start the prototype.
        
      • eight-of-wands.md 443 B
        # Eight of Wands
        
        **Suit**: Wands | **Rank**: 8
        
        ## Upright
        Speed, swift action, movement, rapid progress. Everything aligns and
        momentum carries you forward. Strike while conditions are favorable.
        
        ## Reversed
        Delays, frustration, waiting, scattered energy. The rush has stalled and
        impatience makes things worse. Regroup before pushing ahead.
        
        ## In Technical Context
        Move fast. This is a straightforward implementation--don't overthink it.
        
      • five-of-wands.md 482 B
        # Five of Wands
        
        **Suit**: Wands | **Rank**: 5
        
        ## Upright
        Competition, conflict, disagreements, tension. Multiple forces clash and
        no one is listening. The chaos is unproductive without a unifying direction.
        
        ## Reversed
        Avoiding conflict, compromise, finding common ground. The tension eases as
        parties move toward resolution. Peace comes from choosing cooperation.
        
        ## In Technical Context
        Competing approaches or team disagreements. Resolve the design debate before
        proceeding.
        
      • four-of-wands.md 461 B
        # Four of Wands
        
        **Suit**: Wands | **Rank**: 4
        
        ## Upright
        Celebration, harmony, milestones, homecoming. A joyful achievement deserves
        recognition. The foundation is solid and the community gathers around it.
        
        ## Reversed
        Lack of harmony, transition, personal celebration. The milestone is reached
        but something feels incomplete. Celebrate privately even if others don't notice.
        
        ## In Technical Context
        Celebrate the milestone. Ship what you have--it's ready.
        
      • king-of-wands.md 467 B
        # King of Wands
        
        **Suit**: Wands | **Rank**: King
        
        ## Upright
        Big vision, leadership, entrepreneurial spirit, honor. A natural leader who
        sees the whole board and moves with decisive authority. Vision inspires action.
        
        ## Reversed
        Impulsiveness, overbearing, hasty decisions. The desire to lead outpaces
        wisdom. Grand plans collapse without patience and follow-through.
        
        ## In Technical Context
        Think big-picture. Set the technical vision and let the details follow.
        
      • knight-of-wands.md 547 B
        # Knight of Wands
        
        **Suit**: Wands | **Rank**: Knight
        
        ## Upright
        Energy, passion, adventure, impulsiveness. A bold charge forward fueled by
        conviction. Action first, questions later.
        
        ## Reversed
        Haste, delays, frustration, recklessness. Speed without direction causes
        collisions. The fire burns out of control without discipline.
        
        ## In Technical Context
        Use the momentum for a bold prototype or implementation push, with guardrails
        that keep the blast radius small. If reversed, slow down enough to restore
        direction before adding more energy.
        
      • nine-of-wands.md 414 B
        # Nine of Wands
        
        **Suit**: Wands | **Rank**: 9
        
        ## Upright
        Resilience, persistence, last stand, boundaries. You carry the scars of
        effort but remain standing. One final push will see you through.
        
        ## Reversed
        Exhaustion, giving up, paranoia. Wounds accumulate and the will to continue
        fades. Rest before collapse, not after.
        
        ## In Technical Context
        You're almost done but tired. Push through the last edge cases.
        
      • page-of-wands.md 449 B
        # Page of Wands
        
        **Suit**: Wands | **Rank**: Page
        
        ## Upright
        Exploration, enthusiasm, discovery, free spirit. A young energy full of
        curiosity and wonder. New ideas arrive without the burden of past failures.
        
        ## Reversed
        Lack of direction, setbacks to plans, procrastination. Enthusiasm scatters
        without focus. The explorer wanders but never arrives.
        
        ## In Technical Context
        Spike it. Build a quick experiment to test the idea before committing.
        
      • queen-of-wands.md 466 B
        # Queen of Wands
        
        **Suit**: Wands | **Rank**: Queen
        
        ## Upright
        Courage, determination, independence, confidence. A commanding presence who
        inspires through warmth and conviction. Lead boldly and others will follow.
        
        ## Reversed
        Selfishness, jealousy, demanding nature. Confidence curdles into
        domineering control. The fire that inspires can also burn those nearby.
        
        ## In Technical Context
        Lead with confidence. Own the technical direction and trust your judgment.
        
      • seven-of-wands.md 525 B
        # Seven of Wands
        
        **Suit**: Wands | **Rank**: 7
        
        ## Upright
        Defiance, standing your ground, perseverance. Challenges come from all sides
        but your position is strong. Hold firm against opposition.
        
        ## Reversed
        Exhaustion, giving up, overwhelmed. The constant defense is wearing you down.
        Know when persistence becomes stubbornness.
        
        ## In Technical Context
        Pressure-test the technical decision instead of folding at the first pushback.
        Hold your ground when the evidence supports it, but distinguish real critique
        from noise.
        
      • six-of-wands.md 587 B
        # Six of Wands
        
        **Suit**: Wands | **Rank**: 6
        
        ## Upright
        Victory, recognition, success, public acknowledgment. You have earned
        your triumph and others see it. Confidence is well-placed after hard work.
        
        ## Reversed
        Fall from grace, egotism, lack of recognition. Success breeds arrogance or
        the win goes unnoticed. Stay grounded regardless of external validation.
        
        ## In Technical Context
        The approach has signs of success, so make the win reproducible. Finish the
        verification, document why this path worked, and communicate the result without
        letting confidence turn into complacency.
        
      • ten-of-wands.md 438 B
        # Ten of Wands
        
        **Suit**: Wands | **Rank**: 10
        
        ## Upright
        Burden, responsibility, overcommitment, hard work. You carry too much and
        the weight is crushing. Success has become its own trap.
        
        ## Reversed
        Letting go, delegating, breaking under pressure. Relief comes from releasing
        what is not yours to carry. Shed obligations before they break you.
        
        ## In Technical Context
        Scope is too large. Break it down or delegate parts of the task.
        
      • three-of-wands.md 464 B
        # Three of Wands
        
        **Suit**: Wands | **Rank**: 3
        
        ## Upright
        Expansion, progress, foresight, looking ahead. Early efforts are bearing
        fruit and the horizon is widening. Momentum is building in your favor.
        
        ## Reversed
        Delays, obstacles to growth, playing it small. Progress stalls because you
        are not thinking big enough. Unexpected setbacks test your patience.
        
        ## In Technical Context
        Your initial work is paying off. Think about scalability and what comes next.
        
      • two-of-wands.md 445 B
        # Two of Wands
        
        **Suit**: Wands | **Rank**: 2
        
        ## Upright
        Planning, decisions about direction, future vision. You hold the world in
        your hands and must choose a path. Bold decisions now shape what comes next.
        
        ## Reversed
        Fear of the unknown, poor planning. Indecision keeps you stuck in familiar
        territory. You are avoiding the leap that growth requires.
        
        ## In Technical Context
        Time to plan architecture before coding. Evaluate your options.
        
  • houses
    • 01-first-house.md 1.4 KB
      # First House
      
      **Domain**: Self, identity, agency, and first motion
      
      ## Core Meaning
      The First House describes how the work presents itself and how to begin. It
      sets the operating stance: decisive or exploratory, cautious or bold, solo or
      collaborative.
      
      ## Building New Projects
      Use this house to choose the initial shape of the project. It points to the
      first interface, the first workflow, and the identity the system should have
      before supporting details accumulate.
      
      ## Vulnerability Discovery
      Use this house to identify the attacker's first foothold. It maps to entry
      points, externally reachable behavior, trust boundaries, and the first action
      that turns a codebase into an attack surface.
      
      ## Correctness Verification
      Use this house to define what "correct" means at the boundary. It maps to
      preconditions, initial states, public APIs, input domains, and the first
      invariant that must hold before deeper reasoning is useful.
      
      ## Technical Workflow Lenses
      - Audit pipeline: scope the first entry points, trust boundaries, and initial
        assumptions before deeper discovery.
      - Evidence mode: produce a minimal source trace, call graph, reproduction, or
        boundary test that proves where the work begins.
      - Human context: name the decision owner and the first handoff needed to keep
        the effort from drifting.
      
      ## Technical Prompt
      What is the right stance for beginning, and what first move makes the rest of
      the work easier to reason about?
      
    • 02-second-house.md 1.5 KB
      # Second House
      
      **Domain**: Resources, values, constraints, and preservation
      
      ## Core Meaning
      The Second House describes what is available, what is scarce, and what must not
      be wasted. It asks which resources, values, or invariants should constrain the
      plan.
      
      ## Building New Projects
      Use this house to reason about budgets: time, complexity, dependencies,
      platform limits, team expertise, and which pieces deserve durable foundations.
      
      ## Vulnerability Discovery
      Use this house to examine assets and incentives. It maps to funds, secrets,
      privileges, quotas, availability, and anything an attacker could steal,
      degrade, lock, or manipulate.
      
      Contrast with the Eighth House: the Second House treats secrets and privileges
      as assets to protect; the Eighth House focuses on how they change hands,
      escalate, or become exposed during transitions.
      
      ## Correctness Verification
      Use this house to protect invariants. It maps to conservation properties,
      resource accounting, bounds, ownership, permissions, and state that must remain
      consistent across transitions.
      
      ## Technical Workflow Lenses
      - Audit pipeline: enumerate assets, privileges, quotas, budgets, and incentives
        before ranking risk.
      - Evidence mode: prefer accounting tests, invariant checks, permission traces,
        dimensional analysis, or scarcity proofs.
      - Domain lens: in DeFi and crypto, treat units, balances, keys, randomness, and
        token behavior as first-class resources.
      
      ## Technical Prompt
      What resource or invariant gives this task its real value, and what would be
      costly to lose?
      
    • 03-third-house.md 1.3 KB
      # Third House
      
      **Domain**: Communication, learning, interfaces, and local connections
      
      ## Core Meaning
      The Third House describes exchange: names, messages, protocols, documentation,
      small decisions, and the local links between parts of a system.
      
      ## Building New Projects
      Use this house to shape APIs, component boundaries, naming, docs, schemas, and
      the early developer experience. It favors clarity over cleverness.
      
      ## Vulnerability Discovery
      Use this house to inspect parsers, protocol handling, serialization,
      deserialization, request routing, logs, CLI arguments, and any place where
      meaning crosses a boundary.
      
      ## Correctness Verification
      Use this house to verify contracts between components. It maps to type
      boundaries, message formats, state synchronization, error propagation, and
      whether two parts of the system agree on the same facts.
      
      ## Technical Workflow Lenses
      - Audit pipeline: inspect parsers, schemas, protocol messages, logs, CLI
        arguments, and API contracts where meaning crosses a boundary.
      - Evidence mode: use parser fuzzing, schema tests, protocol diagrams, static
        rules, or spec-to-code comparisons.
      - Human context: improve names, docs, and report language when ambiguity is the
        thing creating risk.
      
      ## Technical Prompt
      Where is meaning being translated, and what misunderstanding would cause the
      system to fail?
      
    • 04-fourth-house.md 1.6 KB
      # Fourth House
      
      **Domain**: Foundations, history, context, and hidden dependencies
      
      ## Core Meaning
      The Fourth House describes what the work rests on. It points to inherited
      architecture, assumptions, persistence layers, deployment context, and the
      history that shaped the current state.
      
      ## Building New Projects
      Use this house to decide the base architecture, storage model, configuration
      strategy, and migration path. It warns against building attractive surfaces on
      unstable ground.
      
      ## Vulnerability Discovery
      Use this house to inspect implicit trust, legacy behavior, configuration
      defaults, environment assumptions, deployment topology, and persistent state
      that outlives a single request.
      
      Contrast with the Twelfth House: the Fourth House covers foundations that still
      shape the system; the Twelfth House covers forgotten paths and assumptions that
      should be retired or revalidated.
      
      ## Correctness Verification
      Use this house to verify initialization, recovery, migrations, persistence,
      default values, and assumptions inherited from previous states.
      
      ## Technical Workflow Lenses
      - Audit pipeline: build architectural context before hunting; map persistence,
        deployment topology, privileged foundations, and legacy behavior.
      - Evidence mode: use initialization tests, migration checks, config review,
        code graph summaries, or environment reproductions.
      - Domain lens: for operations and supply chain work, include devcontainers,
        CI defaults, deployment paths, and dependency roots.
      
      ## Technical Prompt
      What foundation is this work standing on, and what assumption has become
      invisible because it has always been there?
      
    • 05-fifth-house.md 1.5 KB
      # Fifth House
      
      **Domain**: Creativity, experimentation, expressiveness, and delight
      
      ## Core Meaning
      The Fifth House describes the creative opening. It points to prototypes, user
      delight, sharp examples, playful exploration, and the part of the work that
      benefits from imagination.
      
      ## Building New Projects
      Use this house to identify the prototype, demo path, interactive loop, or
      opinionated product choice that makes the project feel alive.
      
      ## Vulnerability Discovery
      Use this house to try unusual inputs, creative abuse cases, unexpected feature
      combinations, and behavior that appears harmless because it was built for
      convenience or delight. It maps to debug or demo endpoints, feature flags that
      skip validation, overly flexible APIs, upload or template features, and
      convenience modes that quietly bypass normal controls.
      
      ## Correctness Verification
      Use this house to generate examples, edge cases, model-based scenarios,
      property tests, and small experiments that reveal whether the abstraction
      behaves as intended.
      
      ## Technical Workflow Lenses
      - Audit pipeline: turn intuition into concrete abuse cases, weird feature
        combinations, fuzz dictionaries, and exploratory probes.
      - Evidence mode: prefer prototypes, fuzz harnesses, property tests, mutation
        survivors, screenshots, or small proof-of-concept experiments.
      - Domain lens: in product and UX work, validate delight with real workflows
        rather than assuming novelty is useful.
      
      ## Technical Prompt
      Where would a creative experiment teach more than another round of analysis?
      
    • 06-sixth-house.md 1.3 KB
      # Sixth House
      
      **Domain**: Practice, service, quality, routine, and maintenance
      
      ## Core Meaning
      The Sixth House describes the work of making systems reliable. It points to
      tests, cleanup, repeatable process, health checks, observability, and the small
      habits that compound into quality.
      
      ## Building New Projects
      Use this house to define the development loop: tests, linting, CI, local setup,
      error handling, deploy hygiene, and the maintenance burden the team is willing
      to carry.
      
      ## Vulnerability Discovery
      Use this house to inspect routine paths: retries, cleanup, cron jobs, queues,
      rate limits, background workers, monitoring gaps, and ordinary code that rarely
      gets dramatic attention.
      
      ## Correctness Verification
      Use this house to focus on regression tests, invariants in common workflows,
      fuzz harness stability, determinism, resource cleanup, and operational
      repeatability.
      
      ## Technical Workflow Lenses
      - Audit pipeline: convert discoveries into repeatable checks, regression tests,
        coverage targets, and maintenance tasks.
      - Evidence mode: use CI results, sanitizer output, fuzz coverage, mutation
        scores, invariants, logs, and observability data.
      - Human context: reduce recurring toil with documented workflows, ownership,
        and boring automation.
      
      ## Technical Prompt
      What ordinary practice would prevent this system from drifting into failure?
      
    • 07-seventh-house.md 1.3 KB
      # Seventh House
      
      **Domain**: Partnership, contracts, users, and external counterparts
      
      ## Core Meaning
      The Seventh House describes the other side of the relationship. It points to
      users, peers, APIs, vendors, collaborators, adversaries, and any contract that
      requires two parties to agree.
      
      ## Building New Projects
      Use this house to shape user workflows, integration contracts, partner APIs,
      permissions, handoffs, and the obligations the system accepts on behalf of
      others.
      
      ## Vulnerability Discovery
      Use this house to examine trust between parties: authentication,
      authorization, delegation, OAuth flows, webhooks, multi-tenant boundaries, and
      third-party integrations.
      
      ## Correctness Verification
      Use this house to verify contracts, compatibility, permissions, cross-service
      state, idempotency, and behavior at integration boundaries.
      
      ## Technical Workflow Lenses
      - Audit pipeline: inspect authentication, authorization, delegation, webhooks,
        OAuth flows, vendors, and multi-tenant boundaries.
      - Evidence mode: use integration tests, contract tests, permission matrices,
        captured traffic, and cross-service traces.
      - Human context: clarify obligations between teams, users, APIs, reviewers, and
        external counterparties.
      
      ## Technical Prompt
      Who is on the other side of this interface, and what agreement could fail under
      pressure?
      
    • 08-eighth-house.md 1.7 KB
      # Eighth House
      
      **Domain**: Transformation, risk, shared state, secrets, and deep change
      
      ## Core Meaning
      The Eighth House describes what changes under pressure. It points to risk,
      shared ownership, irreversible transitions, secrets, migrations, and places
      where failure has second-order effects.
      
      ## Building New Projects
      Use this house to reason about migrations, data ownership, auth, secret
      handling, payment flows, destructive actions, and architectural choices that
      will be expensive to reverse.
      
      ## Vulnerability Discovery
      Use this house to inspect privilege escalation, confused deputy behavior,
      secret exposure, shared mutable state, reentrancy, unsafe migrations, and
      operations that transform authority or value.
      
      Contrast with the Second House: the Second House asks what assets need
      protection; the Eighth House asks what can go wrong when those assets,
      permissions, or states are transferred, transformed, or partially updated.
      
      ## Correctness Verification
      Use this house to verify state transitions, rollback behavior, atomicity,
      authorization invariants, data lifecycle rules, and whether partial failure
      leaves the system in a dangerous state.
      
      ## Technical Workflow Lenses
      - Audit pipeline: hunt transition bugs: escalation, reentrancy, races, partial
        updates, migrations, secret movement, and shared authority.
      - Evidence mode: use state-machine analysis, concurrency tests, exploit PoCs,
        rollback tests, invariant checks, or transaction traces.
      - Domain lens: in smart contracts and protocols, focus on value movement,
        authority changes, replay, lifecycle transitions, and cross-component state.
      
      ## Technical Prompt
      What changes irreversibly here, and what risk appears only when ownership or
      state is shared?
      
    • 09-ninth-house.md 1.4 KB
      # Ninth House
      
      **Domain**: Exploration, principles, standards, and broader strategy
      
      ## Core Meaning
      The Ninth House describes the larger frame. It points to research, standards,
      philosophy, long-term bets, portability, and the principles that should guide
      local decisions.
      
      ## Building New Projects
      Use this house to choose frameworks, platform strategy, architectural
      principles, documentation philosophy, and which constraints should be treated
      as long-term design commitments.
      
      ## Vulnerability Discovery
      Use this house to look beyond local code: specs, threat models, ecosystem
      patterns, upstream assumptions, cross-runtime or cross-platform behavior, and
      classes of bugs known in similar systems.
      
      ## Correctness Verification
      Use this house to compare implementation against specifications, formalize
      properties, check standards compliance, and identify whether the system's
      model matches the domain's deeper rules.
      
      ## Technical Workflow Lenses
      - Audit pipeline: bring in external standards, prior vulnerabilities, threat
        models, protocol specs, and ecosystem patterns.
      - Evidence mode: use spec-to-code compliance, formal models, property suites,
        protocol diagrams, Wycheproof-style vectors, or standards checklists.
      - Domain lens: for crypto and protocols, translate messages, keys, roles,
        secrecy, authentication, and replay assumptions into explicit properties.
      
      ## Technical Prompt
      What larger principle or external standard should govern the local choice?
      
    • 10-tenth-house.md 1.4 KB
      # Tenth House
      
      **Domain**: Delivery, reputation, public outcome, and long-term direction
      
      ## Core Meaning
      The Tenth House describes what the work becomes in public. It points to
      shipping, reliability, responsibility, reputation, leadership, and the outcome
      that will be judged by others.
      
      ## Building New Projects
      Use this house to define the release target, production bar, operational
      ownership, success metrics, and what must be true before the work is fit to
      ship.
      
      ## Vulnerability Discovery
      Use this house to prioritize exploitable, high-impact findings over merely
      interesting behavior. It maps to production exposure, impact, likelihood,
      blast radius, and reportability.
      
      ## Correctness Verification
      Use this house to focus on user-visible guarantees, service-level behavior,
      release blockers, acceptance criteria, and whether correctness holds in the
      environment where the system will be judged.
      
      ## Technical Workflow Lenses
      - Audit pipeline: prioritize reportable impact, exploitability, remediation
        clarity, release blockers, and regression coverage.
      - Evidence mode: use production telemetry, acceptance tests, reproducible PoCs,
        severity scoring, report drafts, and stakeholder-ready summaries.
      - Human context: make accountability explicit: who signs off, who communicates,
        and what must be true before shipping.
      
      ## Technical Prompt
      What outcome will this work be accountable for once it leaves the workbench?
      
    • 11-eleventh-house.md 1.5 KB
      # Eleventh House
      
      **Domain**: Community, networks, systems, and shared aspirations
      
      ## Core Meaning
      The Eleventh House describes the broader system of people and tools around the
      work. It points to teams, ecosystems, shared infrastructure, conventions, and
      the future others are trying to build with you.
      
      ## Building New Projects
      Use this house to reason about extensibility, plugin points, team workflows,
      shared libraries, open-source fit, deployment ecosystems, and how the project
      will participate in a larger technical community.
      
      ## Vulnerability Discovery
      Use this house to inspect supply-chain risk, dependency trust, shared services,
      multi-party workflows, governance, network effects, and vulnerabilities that
      emerge only across a system of participants.
      
      ## Correctness Verification
      Use this house to verify distributed assumptions, compatibility across
      versions, shared schemas, ecosystem contracts, and behavior under many users or
      many components.
      
      ## Technical Workflow Lenses
      - Audit pipeline: inspect dependency trust, CI/CD workflows, agentic actions,
        shared infrastructure, open-source health, and governance.
      - Evidence mode: use dependency analysis, ownership maps, workflow review,
        compatibility tests, ecosystem scans, and blast-radius analysis.
      - Human context: account for communities, maintainers, reviewers, customers,
        and teams who inherit the decision.
      
      ## Technical Prompt
      What network or community does this work depend on, and how could that shared
      context change the right answer?
      
    • 12-twelfth-house.md 1.6 KB
      # Twelfth House
      
      **Domain**: Blind spots, hidden costs, endings, and unconscious assumptions
      
      ## Core Meaning
      The Twelfth House describes what is hard to see directly. It points to hidden
      state, deferred cleanup, unresolved risk, unclear ownership, stale assumptions,
      and endings that need to be handled deliberately.
      
      ## Building New Projects
      Use this house to identify what should be left out, retired, documented as a
      risk, or postponed consciously. It warns against invisible complexity and
      features that quietly become obligations.
      
      ## Vulnerability Discovery
      Use this house to inspect forgotten paths: debug modes, test fixtures,
      backdoors, stale credentials, abandoned endpoints, implicit fallbacks, and
      assumptions no one has revalidated.
      
      Contrast with the Fourth House: the Fourth House asks what foundational context
      must be understood; the Twelfth House asks what hidden or obsolete context is
      quietly creating risk.
      
      ## Correctness Verification
      Use this house to test teardown, cancellation, cleanup, error paths,
      unreachable states, timeouts, and any case that is easy to exclude from the
      happy-path model.
      
      ## Technical Workflow Lenses
      - Audit pipeline: look for forgotten endpoints, debug paths, stale credentials,
        dead code, false assumptions, hidden scope, and discarded findings.
      - Evidence mode: use negative tests, cleanup checks, unreachable-state review,
        log review, secret scans, and false-positive validation.
      - Human context: document deferred risk, cleanup ownership, escalation needs,
        and what should intentionally end.
      
      ## Technical Prompt
      What is hidden, unfinished, or quietly assumed, and what needs to end cleanly?
      
  • references
    • INTERPRETATION_GUIDE.md 7.2 KB
      # Interpretation Guide
      
      How to read the 12 Houses of the Zodiac Tarot spread and map it to technical
      decisions.
      
      ## The Spread Positions
      
      Each house contains 3 cards:
      
      - The first card is always Major Arcana and sets the house's archetypal theme.
      - The second and third cards are Minor Arcana and supply practical details.
      - The house file under `houses/` explains how that house maps to technical
        contexts such as building, vulnerability discovery, and correctness work.
      - `TECHNICAL_CONTEXT_LENSES.md` maps common technical workflows to reusable
        audit, evidence, domain, failure-class, and human/organizational lenses.
      
      | House | Role | Maps To |
      |-------|------|---------|
      | 1 - Self | Identity, agency, first impulse | How to begin, the operating stance |
      | 2 - Resources | Values, assets, limits | Constraints, dependencies, budget, invariants |
      | 3 - Communication | Learning and exchange | Interfaces, naming, docs, coordination |
      | 4 - Foundations | Roots and context | Existing architecture, history, hidden coupling |
      | 5 - Creativity | Experimentation and play | Prototypes, UI choices, expressive design |
      | 6 - Practice | Service and routine | Testing, quality, maintenance, workflow |
      | 7 - Partnership | Others and contracts | Users, APIs, integrations, collaboration |
      | 8 - Transformation | Risk and shared state | Migrations, secrets, permissions, deep refactors |
      | 9 - Exploration | Principles and broad vision | Strategy, standards, research, long-term bets |
      | 10 - Calling | Public outcome and reputation | Delivery, reliability, production readiness |
      | 11 - Community | Groups and systems | Ecosystem fit, shared tooling, team impact |
      | 12 - The Hidden | Blind spots and endings | Unknown risks, cleanup, deferred costs |
      
      ## Reading the Cards
      
      ### Step 1: Read Each House and Card File
      
      For each house, read its house file. For each drawn card, read its meaning
      file. Note both the upright and reversed meanings. Use whichever matches the
      card's orientation in the draw.
      
      The `In Technical Context` section in a card file is a starting translation,
      not a replacement for the orientation. If that technical note sounds too
      decisive for the card's reversed meaning, adapt it through the reversed text
      instead of following the sentence literally.
      
      ### Step 2: Map to Context
      
      Translate the card's archetypal meaning into the current technical situation:
      
      **Major Arcana** represent big-picture forces:
      - Architectural decisions, paradigm shifts, fundamental approaches
      - These carry more interpretive weight
      
      **Minor Arcana** represent practical details:
      - **Wands** (fire): Action, initiative, creativity, velocity, building
      - **Cups** (water): Collaboration, user experience, intuition, satisfaction
      - **Swords** (air): Analysis, logic, debugging, cutting through complexity, hard truths
      - **Pentacles** (earth): Quality, craft, reliability, testing, maintenance, tangible results
      
      **Court Cards** can represent approaches or roles:
      - **Page**: Learning, experimenting, prototyping, beginner's mind
      - **Knight**: Focused pursuit, rapid movement, single-minded effort
      - **Queen**: Mastery with empathy, nurturing growth, mature judgment
      - **King**: Authority, established patterns, proven approaches
      
      When the task resembles a specialized skill workflow, choose the relevant lens
      from `TECHNICAL_CONTEXT_LENSES.md` before deciding what action the reading
      supports. This keeps the reading grounded in the actual mode of work: audit
      pipeline stage, evidence type, technical domain, failure class, or stakeholder
      coordination.
      
      ### Step 3: Synthesize the Story
      
      Read all 12 houses as a narrative:
      
      1. "The beginning stance is [House 1]..."
      2. "The available resources and constraints are [House 2]..."
      3. "The communication or interface concern is [House 3]..."
      4. "The foundation or hidden dependency is [House 4]..."
      5. "The creative opening is [House 5]..."
      6. "The quality and maintenance requirement is [House 6]..."
      7. "The integration or collaboration point is [House 7]..."
      8. "The transformation or risk is [House 8]..."
      9. "The guiding principle is [House 9]..."
      10. "The delivery target is [House 10]..."
      11. "The ecosystem or team impact is [House 11]..."
      12. "The blind spot or closure is [House 12]..."
      
      When time is tight, prioritize House 1 for the initial stance, House 6 for
      execution quality, House 8 for risk, House 10 for delivery, and House 12 for
      blind spots.
      
      ### Step 4: Make a Decision
      
      The reading should bias you toward one of the viable approaches. State:
      - Which approach the reading supports
      - How specific cards influenced the choice
      - What the reading suggests you should watch out for
      
      For vulnerability discovery and correctness verification, the decision should
      be about where to investigate next or which hypothesis to test. The reading can
      prioritize attention, but it cannot prove safety, dismiss a finding, or replace
      reproduction, testing, formal reasoning, or source-level evidence.
      
      ## Reversed Cards
      
      Reversed cards don't mean "bad." They indicate:
      - The energy is internalized rather than expressed
      - The quality is blocked, delayed, or needs extra attention
      - An alternative or inverted interpretation applies
      - Shadow aspects of the card's theme
      
      ## Special Patterns
      
      The 12-house spread deals 12 Major Arcana, 24 Minor Arcana, and an
      independent reversal flag per card. The patterns below are calibrated to those
      baselines (one Major per house is guaranteed, so "multiple Majors" is not a
      signal in this spread).
      
      ### Heavy Reversal Count
      The spread averages 18 reversed cards out of 36. If 24 or more are reversed
      (roughly the top 3% of draws), the reading is telling you that many
      things are blocked, inverted, or shadowed. Step back and reconsider the
      assumptions driving the work before proceeding.
      
      ### Heavy Minor Suit Concentration
      Each Minor suit is expected to contribute about 6 of the 24 Minor draws. If
      one suit contributes 10 or more, the reading carries that suit's thematic
      emphasis across many houses:
      - Heavy Wands: Focus on action, momentum, and creative drive
      - Heavy Cups: Focus on user needs, team dynamics, and emotional state
      - Heavy Swords: Focus on analysis, conflict, and clear thinking
      - Heavy Pentacles: Focus on craft, resources, and practical quality
      
      ### Weighty Majors in Critical Houses
      Death, The Tower, The Devil, Judgement, or The World landing in House 1
      (Self), House 8 (Transformation), or House 12 (The Hidden) amplifies themes
      of identity, deep change, or unseen factors. Treat these as cues to slow
      down and investigate before committing.
      
      ### Court Cards Clustering in People Houses
      Court cards (Page, Knight, Queen, King) appearing in Houses 3 (Communication),
      7 (Partnership), or 11 (Community) reinforce a people-oriented reading: the
      work hinges on collaboration, contracts, or social dynamics rather than purely
      technical execution.
      
      ## What the Reading Is NOT
      
      - Not a substitute for requirements gathering when requirements are gettable
      - Not permission to ignore best practices
      - Not evidence that a security or correctness concern is real or false
      - Not a way to avoid thinking critically
      - Not deterministic (it's entropy, that's the point)
      
      The reading adds a creative nudge to break analysis paralysis. The cards don't make the decision; they give you a direction to explore when you otherwise have none.
      
    • TECHNICAL_CONTEXT_LENSES.md 4.6 KB
      # Technical Context Lenses
      
      These lenses apply across a wide range of technical workflows, but they cluster
      into a small set of recurring patterns. Use them to translate a house or card
      into the kind of work currently being done.
      
      ## Audit Pipeline Stage
      
      Use this lens when the task is part of a security review or codebase critique.
      Map the spread to the current phase:
      
      - Scoping and setup: what is in scope, what is excluded, and what must be
        understood first.
      - Attack-surface mapping: entry points, trust boundaries, privileged paths,
        assets, state transitions, and external dependencies.
      - Discovery: creative hypotheses, known bug classes, unusual inputs, and
        paths that ordinary review may miss.
      - Validation: source traces, tests, fuzz cases, proofs, exploitability checks,
        and false-positive elimination.
      - Reporting and regression: impact, reproduction, remediation, and tests that
        keep the issue from returning.
      
      ## Evidence Mode
      
      Use this lens to decide what kind of evidence should follow the reading. A
      Tarot spread can prioritize attention, but the next step should produce one of
      these evidence types:
      
      - Source-level trace or code graph path.
      - Unit, integration, property, fuzz, mutation, or regression test.
      - Static-analysis query, SARIF finding, or semgrep/codeql rule.
      - Protocol diagram, formal model, invariant, or spec-to-code comparison.
      - Exploit proof, crash reproducer, timing measurement, or production telemetry.
      - Written rationale, report section, decision log, or stakeholder-ready summary.
      
      ## Domain Lens
      
      Use this lens to adapt general language to the actual domain:
      
      - Smart contracts and DeFi: assets, access control, arithmetic precision,
        state machines, hooks, bridges, governance, MEV, and token behavior.
      - Crypto and protocols: transcripts, roles, keys, randomness, authentication,
        secrecy, replay, side channels, and formal security properties.
      - Appsec, web, and mobile: endpoints, parsers, sessions, OAuth, uploads,
        webhooks, cloud backends, and captured traffic.
      - Native, binary, and systems work: memory safety, integer behavior, races,
        debug data, reverse engineering, crashes, and sanitizer results.
      - CI/CD, supply chain, and operations: dependencies, workflow permissions,
        agentic actions, deploy paths, production errors, and ownership.
      - Product, docs, and stakeholder work: requirements, usability, report quality,
        positioning, scope, status, and handoff clarity.
      
      ## Failure Class Lens
      
      Use this lens when the reading needs to become a concrete bug-hunting prompt:
      
      - Access control, confused deputy behavior, authorization bypass, and privilege
        escalation.
      - State-machine mistakes, broken lifecycle transitions, races, retries, and
        partial failure.
      - Arithmetic, precision, unit, dimensional, bounds, overflow, and accounting
        errors.
      - Parser, serialization, protocol, type-safety, and interface mismatches.
      - Secrets, information leakage, side channels, logging exposure, and insecure
        defaults.
      - Supply-chain compromise, dependency takeover, CI injection, sandbox escape,
        and unsafe automation.
      - Missing tests, weak harnesses, unreachable coverage, survived mutants, and
        unverified invariants.
      
      ## Human and Organizational Lens
      
      Use this lens when the work depends on people, teams, or decisions rather than
      only code:
      
      - Who owns the decision, risk, artifact, or follow-up?
      - What needs to be escalated, documented, or turned into a report?
      - What context is missing from stakeholders, users, maintainers, or reviewers?
      - What would reduce ambiguity for the next person to touch the work?
      - What is the team's capacity, confidence, and tolerance for change?
      
      ## House Affinity Map
      
      | House | Strongest Corpus Lenses |
      |-------|--------------------------|
      | 1 - Self | Scoping, entry points, first assumptions, initial attack surface |
      | 2 - Resources | Assets, invariants, budgets, ownership, scarcity |
      | 3 - Communication | APIs, protocols, parsers, schemas, docs, logs |
      | 4 - Foundations | Architecture, persistence, deployment context, legacy assumptions |
      | 5 - Creativity | Fuzzing, abuse cases, prototypes, exploratory testing |
      | 6 - Practice | CI, harnesses, regression tests, observability, maintenance |
      | 7 - Partnership | Integrations, auth contracts, users, vendors, external APIs |
      | 8 - Transformation | State transitions, migrations, secrets, escalation, shared authority |
      | 9 - Exploration | Specs, standards, formal models, protocol reasoning, research |
      | 10 - Calling | Release readiness, impact, reportability, production accountability |
      | 11 - Community | Supply chain, ecosystem, shared infrastructure, governance |
      | 12 - The Hidden | Forgotten paths, cleanup, stale assumptions, blind spots |
      
  • scripts
    • draw_cards.py 9.3 KB
      #!/usr/bin/env python3
      """Draw Tarot cards using the secrets module for cryptographic randomness.
      
      The default draw is the 12 Houses of the Zodiac spread: each house gets one
      Major Arcana card plus two Minor Arcana cards. Each card has an independent
      50/50 chance of being reversed.
      """
      # /// script
      # requires-python = ">=3.11"
      # dependencies = []
      # ///
      
      import json
      import math
      import os
      import secrets
      import sys
      
      SPREAD_NAME = "12 Houses of the Zodiac"
      
      
      def _entropy_bits():
          """Conservative unordered-card entropy budget for the default spread."""
          major = math.log2(math.comb(22, 12))
          minor = math.log2(math.comb(56, 24))
          reversals = 36.0
          return {
              "major_arcana": round(major, 2),
              "minor_arcana": round(minor, 2),
              "reversals": reversals,
              "total": round(major + minor + reversals, 2),
          }
      
      
      ENTROPY_BITS = _entropy_bits()
      
      MAJOR_ARCANA = (
          ("major", "00-the-fool"),
          ("major", "01-the-magician"),
          ("major", "02-the-high-priestess"),
          ("major", "03-the-empress"),
          ("major", "04-the-emperor"),
          ("major", "05-the-hierophant"),
          ("major", "06-the-lovers"),
          ("major", "07-the-chariot"),
          ("major", "08-strength"),
          ("major", "09-the-hermit"),
          ("major", "10-wheel-of-fortune"),
          ("major", "11-justice"),
          ("major", "12-the-hanged-man"),
          ("major", "13-death"),
          ("major", "14-temperance"),
          ("major", "15-the-devil"),
          ("major", "16-the-tower"),
          ("major", "17-the-star"),
          ("major", "18-the-moon"),
          ("major", "19-the-sun"),
          ("major", "20-judgement"),
          ("major", "21-the-world"),
      )
      
      RANKS = (
          "ace",
          "two",
          "three",
          "four",
          "five",
          "six",
          "seven",
          "eight",
          "nine",
          "ten",
          "page",
          "knight",
          "queen",
          "king",
      )
      
      SUITS = ("wands", "cups", "swords", "pentacles")
      
      ZODIAC_HOUSES = (
          (
              "First House",
              "Self, identity, agency, and first motion",
              "01-first-house",
          ),
          (
              "Second House",
              "Resources, values, constraints, and preservation",
              "02-second-house",
          ),
          (
              "Third House",
              "Communication, learning, interfaces, and local connections",
              "03-third-house",
          ),
          (
              "Fourth House",
              "Foundations, history, context, and hidden dependencies",
              "04-fourth-house",
          ),
          (
              "Fifth House",
              "Creativity, experimentation, expressiveness, and delight",
              "05-fifth-house",
          ),
          (
              "Sixth House",
              "Practice, service, quality, routine, and maintenance",
              "06-sixth-house",
          ),
          (
              "Seventh House",
              "Partnership, contracts, users, and external counterparts",
              "07-seventh-house",
          ),
          (
              "Eighth House",
              "Transformation, risk, shared state, secrets, and deep change",
              "08-eighth-house",
          ),
          (
              "Ninth House",
              "Exploration, principles, standards, and broader strategy",
              "09-ninth-house",
          ),
          (
              "Tenth House",
              "Delivery, reputation, public outcome, and long-term direction",
              "10-tenth-house",
          ),
          (
              "Eleventh House",
              "Community, networks, systems, and shared aspirations",
              "11-eleventh-house",
          ),
          (
              "Twelfth House",
              "Blind spots, hidden costs, endings, and unconscious assumptions",
              "12-twelfth-house",
          ),
      )
      
      
      def build_deck():
          """Build the full 78-card Tarot deck."""
          return list(MAJOR_ARCANA) + build_minor_deck()
      
      
      def build_minor_deck():
          """Build the 56-card Minor Arcana deck."""
          return [(suit, f"{rank}-of-{suit}") for suit in SUITS for rank in RANKS]
      
      
      def fisher_yates_shuffle(deck):
          """Shuffle deck in-place using Fisher-Yates with secrets.randbelow()."""
          for i in range(len(deck) - 1, 0, -1):
              j = secrets.randbelow(i + 1)
              deck[i], deck[j] = deck[j], deck[i]
          return deck
      
      
      def is_reversed():
          """Return True with 50% probability using secrets.randbits()."""
          return secrets.randbits(1) == 1
      
      
      def card_record(suit, card_id, position, role, include_content=False):
          """Return the JSON-serializable record for a drawn card."""
          card = {
              "suit": suit,
              "card_id": card_id,
              "reversed": is_reversed(),
              "position": position,
              "role": role,
              "file": f"cards/{suit}/{card_id}.md",
          }
          if include_content:
              script_dir = os.path.dirname(os.path.abspath(__file__))
              cards_dir = os.path.join(os.path.dirname(script_dir), "cards")
              path = os.path.join(cards_dir, suit, f"{card_id}.md")
              try:
                  with open(path) as f:
                      card["content"] = f.read()
              except OSError as e:
                  card["content"] = f"(error reading card file {path}: {e})"
          return card
      
      
      def read_reference_file(relative_file):
          """Read a skill-local reference file for --content output."""
          script_dir = os.path.dirname(os.path.abspath(__file__))
          skill_dir = os.path.dirname(script_dir)
          path = os.path.join(skill_dir, relative_file)
          try:
              with open(path) as f:
                  return f.read()
          except OSError as e:
              return f"(error reading reference file {path}: {e})"
      
      
      def draw_cards(n=4, include_content=False):
          """Shuffle the full deck and draw n cards, each possibly reversed."""
          if not isinstance(n, int) or isinstance(n, bool):
              raise TypeError(f"n must be int, got {type(n).__name__}")
          deck = build_deck()
          fisher_yates_shuffle(deck)
          hand = []
          for i in range(min(n, len(deck))):
              suit, card_id = deck[i]
              hand.append(card_record(suit, card_id, i + 1, "card", include_content))
          return hand
      
      
      def _build_house_record(
          *,
          house_number,
          house_meta,
          major_card,
          minor_pair,
          position,
          include_content,
      ):
          """Build the JSON record for one zodiac house."""
          house_name, focus, house_id = house_meta
          major_suit, major_id = major_card
          (m1_suit, m1_id), (m2_suit, m2_id) = minor_pair
          house_file = f"houses/{house_id}.md"
          record = {
              "house": house_number,
              "name": house_name,
              "focus": focus,
              "file": house_file,
              "cards": [
                  card_record(major_suit, major_id, position, "major_arcana", include_content),
                  card_record(m1_suit, m1_id, position + 1, "minor_arcana_1", include_content),
                  card_record(m2_suit, m2_id, position + 2, "minor_arcana_2", include_content),
              ],
          }
          if include_content:
              record["content"] = read_reference_file(house_file)
          return record
      
      
      def draw_zodiac_spread(include_content=False):
          """Draw the default 12 Houses of the Zodiac spread."""
          major_deck = list(MAJOR_ARCANA)
          minor_deck = build_minor_deck()
          fisher_yates_shuffle(major_deck)
          fisher_yates_shuffle(minor_deck)
      
          houses = []
          for i, house_meta in enumerate(ZODIAC_HOUSES):
              houses.append(
                  _build_house_record(
                      house_number=i + 1,
                      house_meta=house_meta,
                      major_card=major_deck[i],
                      minor_pair=(minor_deck[2 * i], minor_deck[2 * i + 1]),
                      position=1 + 3 * i,
                      include_content=include_content,
                  )
              )
      
          bits = ENTROPY_BITS
          return {
              "spread": SPREAD_NAME,
              "houses": houses,
              "entropy_bits": bits,
              "entropy_note": (
                  "Assumes secrets.randbelow() provides cryptographically secure "
                  "bounded draws. This is a conservative unordered-card budget: "
                  f"{bits['major_arcana']} bits from Major Arcana selection, "
                  f"{bits['minor_arcana']} bits from Minor Arcana selection, and "
                  f"{bits['reversals']} reversal bits. Ordered house assignment "
                  "contains more entropy."
              ),
          }
      
      
      USAGE = "Usage: draw_cards.py [--content] [--legacy [count]]"
      
      
      def _parse_args(argv):
          """Parse CLI argv into (include_content, legacy, count). Exits on error."""
          args = list(argv)
          include_content = "--content" in args
          if include_content:
              args.remove("--content")
          legacy = "--legacy" in args
          if legacy:
              args.remove("--legacy")
          count = None
          if args:
              if not legacy:
                  print(
                      f"Error: positional count requires --legacy. {USAGE}",
                      file=sys.stderr,
                  )
                  sys.exit(1)
              try:
                  count = int(args[0])
              except ValueError:
                  print(
                      f"Error: '{args[0]}' is not a valid integer. {USAGE}",
                      file=sys.stderr,
                  )
                  sys.exit(1)
              if count < 1 or count > 78:
                  print(f"Error: card count must be 1-78, got {count}", file=sys.stderr)
                  sys.exit(1)
          return include_content, legacy, count
      
      
      def main():
          include_content, legacy, count = _parse_args(sys.argv[1:])
          try:
              if legacy:
                  hand = draw_cards(count if count is not None else 4, include_content=include_content)
              else:
                  hand = draw_zodiac_spread(include_content=include_content)
          except OSError as e:
              print(f"Error: failed to read system entropy source: {e}", file=sys.stderr)
              sys.exit(1)
          print(json.dumps(hand, indent=2))
      
      
      if __name__ == "__main__":
          try:
              main()
          except Exception as e:
              print(f"Error: draw_cards.py failed: {e}", file=sys.stderr)
              sys.exit(1)
      
    • pyproject.toml 144 B
      [project]
      name = "let-fate-decide-scripts"
      version = "0.0.0"
      requires-python = ">=3.11"
      
      [tool.ruff]
      line-length = 100
      target-version = "py311"
      
    • test_draw_cards.py 14.1 KB
      #!/usr/bin/env python3
      """Tests for draw_cards.py."""
      # /// script
      # requires-python = ">=3.11"
      # dependencies = []
      # ///
      
      import json
      import math
      import subprocess
      import sys
      from collections import Counter
      from pathlib import Path
      
      # Import the module under test
      sys.path.insert(0, str(Path(__file__).parent))
      import draw_cards
      
      SKILL_DIR = Path(__file__).parent.parent
      
      
      def test_build_deck_has_78_cards():
          deck = draw_cards.build_deck()
          assert len(deck) == 78, f"Expected 78 cards, got {len(deck)}"
      
      
      def test_build_deck_has_22_major_arcana():
          deck = draw_cards.build_deck()
          majors = [c for c in deck if c[0] == "major"]
          assert len(majors) == 22, f"Expected 22 major arcana, got {len(majors)}"
      
      
      def test_build_deck_has_56_minor_arcana():
          deck = draw_cards.build_deck()
          minors = [c for c in deck if c[0] != "major"]
          assert len(minors) == 56, f"Expected 56 minor arcana, got {len(minors)}"
      
      
      def test_build_minor_deck_has_56_cards():
          deck = draw_cards.build_minor_deck()
          assert len(deck) == 56, f"Expected 56 minor cards, got {len(deck)}"
      
      
      def test_build_minor_deck_excludes_major_arcana():
          deck = draw_cards.build_minor_deck()
          assert all(suit != "major" for suit, _ in deck)
      
      
      def test_build_deck_all_unique():
          deck = draw_cards.build_deck()
          card_ids = [c[1] for c in deck]
          assert len(card_ids) == len(set(card_ids)), "Duplicate card IDs found"
      
      
      def test_build_deck_four_suits_14_each():
          deck = draw_cards.build_deck()
          suits = Counter(c[0] for c in deck if c[0] != "major")
          for suit in ["wands", "cups", "swords", "pentacles"]:
              assert suits[suit] == 14, f"Expected 14 {suit}, got {suits[suit]}"
      
      
      def test_draw_cards_returns_requested_count():
          for n in [1, 2, 4, 10]:
              hand = draw_cards.draw_cards(n)
              assert len(hand) == n, f"draw({n}) returned {len(hand)} cards"
      
      
      def test_draw_cards_default_is_4():
          hand = draw_cards.draw_cards()
          assert len(hand) == 4
      
      
      def test_draw_zodiac_spread_default_shape():
          hand = draw_cards.draw_zodiac_spread()
          assert hand["spread"] == draw_cards.SPREAD_NAME
          assert len(hand["houses"]) == 12
      
      
      def test_draw_cards_clamps_to_78():
          hand = draw_cards.draw_cards(100)
          assert len(hand) == 78
      
      
      def test_draw_cards_zero_returns_empty():
          hand = draw_cards.draw_cards(0)
          assert len(hand) == 0
      
      
      def test_draw_cards_card_structure():
          hand = draw_cards.draw_cards(1)
          card = hand[0]
          assert "suit" in card
          assert "card_id" in card
          assert "reversed" in card
          assert "position" in card
          assert "file" in card
          assert isinstance(card["reversed"], bool)
          assert card["position"] == 1
          assert card["file"].startswith("cards/")
          assert card["file"].endswith(".md")
      
      
      def test_draw_cards_positions_are_sequential():
          hand = draw_cards.draw_cards(4)
          positions = [c["position"] for c in hand]
          assert positions == [1, 2, 3, 4]
      
      
      def test_draw_cards_no_duplicate_cards():
          hand = draw_cards.draw_cards(78)
          card_ids = [c["card_id"] for c in hand]
          assert len(card_ids) == len(set(card_ids)), "Duplicate cards drawn"
      
      
      def test_zodiac_spread_shape():
          spread = draw_cards.draw_zodiac_spread()
          assert spread["spread"] == "12 Houses of the Zodiac"
          bits = spread["entropy_bits"]
          expected_major = round(math.log2(math.comb(22, 12)), 2)
          expected_minor = round(math.log2(math.comb(56, 24)), 2)
          assert bits["major_arcana"] == expected_major
          assert bits["minor_arcana"] == expected_minor
          assert bits["reversals"] == 36.0
          assert bits["total"] == round(expected_major + expected_minor + 36.0, 2)
          assert bits["total"] >= 100, "Entropy budget must clear the 100-bit floor"
          assert len(spread["houses"]) == 12
          for house in spread["houses"]:
              assert set(house) == {"house", "name", "focus", "file", "cards"}
              assert house["file"].startswith("houses/")
              assert house["file"].endswith(".md")
              assert len(house["cards"]) == 3
      
      
      def test_zodiac_house_files_exist():
          spread = draw_cards.draw_zodiac_spread()
          for house in spread["houses"]:
              path = SKILL_DIR / house["file"]
              assert path.exists(), f"Missing house file: {path}"
      
      
      def test_zodiac_focus_matches_house_domain():
          spread = draw_cards.draw_zodiac_spread()
          for house in spread["houses"]:
              text = (SKILL_DIR / house["file"]).read_text()
              domain = next(
                  line[len("**Domain**: ") :].strip()
                  for line in text.splitlines()
                  if line.startswith("**Domain**: ")
              )
              assert house["focus"] == domain, (
                  f"focus/Domain drift in {house['file']}: {house['focus']!r} != {domain!r}"
              )
      
      
      def test_zodiac_house_files_cover_technical_contexts():
          spread = draw_cards.draw_zodiac_spread()
          for house in spread["houses"]:
              text = (SKILL_DIR / house["file"]).read_text()
              assert "## Building New Projects" in text
              assert "## Vulnerability Discovery" in text
              assert "## Correctness Verification" in text
              assert "## Technical Workflow Lenses" in text
      
      
      def test_technical_context_lenses_reference_exists():
          reference = SKILL_DIR / "references" / "TECHNICAL_CONTEXT_LENSES.md"
          text = reference.read_text()
          assert "## Audit Pipeline Stage" in text
          assert "## Evidence Mode" in text
          assert "## Domain Lens" in text
          assert "## Failure Class Lens" in text
          assert "## Human and Organizational Lens" in text
          assert "## House Affinity Map" in text
      
      
      def test_security_framing_requires_evidence():
          skill_text = (SKILL_DIR / "SKILL.md").read_text()
          guide_text = (SKILL_DIR / "references" / "INTERPRETATION_GUIDE.md").read_text()
          assert "Security and Correctness Use" in skill_text
          assert "never sufficient by itself" in skill_text
          assert "only evidence can dismiss a security or correctness concern" in skill_text
          assert "cannot prove safety, dismiss a finding, or replace" in guide_text
      
      
      def test_numbered_ranks_are_numeric_across_all_suits():
          word_ranks = ("Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten")
          for card_file in (SKILL_DIR / "cards").glob("*/*.md"):
              if card_file.parent.name == "major":
                  continue
              text = card_file.read_text()
              for word in word_ranks:
                  assert f"**Rank**: {word}" not in text, (
                      f"{card_file} still uses word-form rank '{word}'; use the digit form"
                  )
      
      
      def test_reviewed_cards_avoid_unsafe_shortcuts():
          """Regression guard: these exact phrases were removed in 1.2.0; do not reintroduce.
      
          This is an exact-string blacklist, not a semantic check. Add new bad phrases
          here as they are identified during review; rewordings of existing phrases
          will not trip this test and must be caught manually.
          """
          risky_phrases = (
              "Follow your intuition on this one",
              "The solution that feels right probably is",
              "Ship it.",
              "The approach is sound.",
              "The approach will succeed.",
              "Speed matters here—refine later.",
          )
          for card_file in (SKILL_DIR / "cards").glob("*/*.md"):
              text = card_file.read_text()
              for phrase in risky_phrases:
                  assert phrase not in text, f"{phrase!r} still appears in {card_file}"
      
      
      def test_zodiac_spread_content_includes_house_content():
          spread = draw_cards.draw_zodiac_spread(include_content=True)
          for house in spread["houses"]:
              assert "content" in house
              assert house["content"].startswith("# ")
      
      
      def test_zodiac_spread_uses_one_major_per_house():
          spread = draw_cards.draw_zodiac_spread()
          major_cards = []
          for house in spread["houses"]:
              card = house["cards"][0]
              assert card["role"] == "major_arcana"
              assert card["suit"] == "major"
              major_cards.append(card["card_id"])
          assert len(major_cards) == 12
          assert len(set(major_cards)) == 12
      
      
      def test_zodiac_spread_uses_two_minors_per_house():
          spread = draw_cards.draw_zodiac_spread()
          minor_cards = []
          for house in spread["houses"]:
              for card in house["cards"][1:]:
                  assert card["role"] in {"minor_arcana_1", "minor_arcana_2"}
                  assert card["suit"] != "major"
                  minor_cards.append(card["card_id"])
          assert len(minor_cards) == 24
          assert len(set(minor_cards)) == 24
      
      
      def test_zodiac_spread_all_cards_can_be_reversed():
          spread = draw_cards.draw_zodiac_spread()
          cards = [card for house in spread["houses"] for card in house["cards"]]
          assert len(cards) == 36
          assert all(isinstance(card["reversed"], bool) for card in cards)
      
      
      def test_zodiac_spread_positions_are_sequential():
          spread = draw_cards.draw_zodiac_spread()
          positions = [card["position"] for house in spread["houses"] for card in house["cards"]]
          assert positions == list(range(1, 37))
      
      
      def test_fisher_yates_preserves_elements():
          deck = draw_cards.build_deck()
          original = sorted(deck)
          draw_cards.fisher_yates_shuffle(deck)
          assert sorted(deck) == original, "Shuffle changed deck elements"
      
      
      def test_fisher_yates_single_element():
          deck = [("major", "00-the-fool")]
          draw_cards.fisher_yates_shuffle(deck)
          assert deck == [("major", "00-the-fool")]
      
      
      def test_fisher_yates_empty():
          deck = []
          draw_cards.fisher_yates_shuffle(deck)
          assert deck == []
      
      
      def test_is_reversed_returns_bool():
          for _ in range(20):
              assert isinstance(draw_cards.is_reversed(), bool)
      
      
      def test_shuffle_produces_varying_orders():
          """Run 5 shuffles; at least 2 should differ (p(all same) ~ 0)."""
          orders = []
          for _ in range(5):
              deck = draw_cards.build_deck()
              draw_cards.fisher_yates_shuffle(deck)
              orders.append(tuple(c[1] for c in deck))
          assert len(set(orders)) >= 2, "All 5 shuffles identical"
      
      
      def test_reversal_produces_both_values():
          """Over 100 flips, both True and False should appear."""
          results = {draw_cards.is_reversed() for _ in range(100)}
          assert True in results, "Never got reversed=True in 100 flips"
          assert False in results, "Never got reversed=False in 100 flips"
      
      
      def test_no_os_urandom_import():
          """Verify os.urandom is not used; os may be imported for path operations."""
          source = Path(__file__).parent / "draw_cards.py"
          text = source.read_text()
          assert "os.urandom" not in text, "os.urandom still referenced"
      
      
      def test_uses_secrets_module():
          """Verify secrets module is used."""
          source = Path(__file__).parent / "draw_cards.py"
          text = source.read_text()
          assert "import secrets" in text
          assert "secrets.randbelow" in text
          assert "secrets.randbits" in text
      
      
      def test_cli_default_output():
          """Run the script and verify JSON output with the default spread."""
          result = subprocess.run(
              [sys.executable, str(Path(__file__).parent / "draw_cards.py")],
              capture_output=True,
              text=True,
          )
          assert result.returncode == 0
          spread = json.loads(result.stdout)
          assert spread["spread"] == draw_cards.SPREAD_NAME
          assert len(spread["houses"]) == 12
      
      
      def test_cli_legacy_custom_count():
          result = subprocess.run(
              [sys.executable, str(Path(__file__).parent / "draw_cards.py"), "--legacy", "2"],
              capture_output=True,
              text=True,
          )
          assert result.returncode == 0
          cards = json.loads(result.stdout)
          assert len(cards) == 2
      
      
      def test_cli_legacy_default_count():
          result = subprocess.run(
              [sys.executable, str(Path(__file__).parent / "draw_cards.py"), "--legacy"],
              capture_output=True,
              text=True,
          )
          assert result.returncode == 0
          cards = json.loads(result.stdout)
          assert len(cards) == 4
      
      
      def test_cli_positional_count_without_legacy_is_error():
          """Positional count requires --legacy; the new default has a fixed shape."""
          result = subprocess.run(
              [sys.executable, str(Path(__file__).parent / "draw_cards.py"), "4"],
              capture_output=True,
              text=True,
          )
          assert result.returncode == 1
          assert "--legacy" in result.stderr
      
      
      def test_cli_invalid_arg():
          result = subprocess.run(
              [sys.executable, str(Path(__file__).parent / "draw_cards.py"), "--legacy", "abc"],
              capture_output=True,
              text=True,
          )
          assert result.returncode == 1
          assert "Error" in result.stderr
      
      
      def test_cli_out_of_range():
          result = subprocess.run(
              [sys.executable, str(Path(__file__).parent / "draw_cards.py"), "--legacy", "0"],
              capture_output=True,
              text=True,
          )
          assert result.returncode == 1
      
          result = subprocess.run(
              [sys.executable, str(Path(__file__).parent / "draw_cards.py"), "--legacy", "79"],
              capture_output=True,
              text=True,
          )
          assert result.returncode == 1
      
      
      def test_no_secure_randbelow_function():
          """Regression: the custom secure_randbelow must be removed."""
          source = Path(__file__).parent / "draw_cards.py"
          text = source.read_text()
          assert "def secure_randbelow" not in text, "Custom secure_randbelow still exists"
      
      
      def test_constants_are_immutable():
          """Constants must be tuples to prevent mutation."""
          assert isinstance(draw_cards.MAJOR_ARCANA, tuple), "MAJOR_ARCANA is not a tuple"
          assert isinstance(draw_cards.RANKS, tuple), "RANKS is not a tuple"
          assert isinstance(draw_cards.SUITS, tuple), "SUITS is not a tuple"
          assert isinstance(draw_cards.ZODIAC_HOUSES, tuple), "ZODIAC_HOUSES is not a tuple"
      
      
      def test_draw_cards_rejects_non_int():
          """draw_cards() must reject non-int types cleanly."""
          for bad in [None, "3", 2.5, True, False, [4]]:
              try:
                  draw_cards.draw_cards(bad)
                  assert False, f"draw_cards({bad!r}) should have raised TypeError"
              except TypeError:
                  pass
      
      
      if __name__ == "__main__":
          tests = [v for k, v in sorted(globals().items()) if k.startswith("test_")]
          passed = failed = 0
          for test in tests:
              try:
                  test()
                  passed += 1
                  print(f"  PASS  {test.__name__}")
              except AssertionError as e:
                  failed += 1
                  print(f"  FAIL  {test.__name__}: {e}")
              except Exception as e:
                  failed += 1
                  print(f"  ERROR {test.__name__}: {e}")
          print(f"\n{passed} passed, {failed} failed, {passed + failed} total")
          sys.exit(1 if failed else 0)
      
  • SKILL.md 9.7 KB
    ---
    name: let-fate-decide
    description: "Draws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over asking clarifying questions when the user's tone is casual or playful rather than precision-seeking."
    allowed-tools: Bash Read Grep Glob
    ---
    
    # Let Fate Decide
    
    When the path forward is unclear, let the cards speak.
    
    ## Quick Start
    
    1. Run the drawing script:
       ```bash
       uv run --no-config {baseDir}/scripts/draw_cards.py
       ```
    
    2. The script outputs JSON for the default 12 Houses of the Zodiac spread:
       12 houses, each with 1 Major Arcana card and 2 Minor Arcana cards. Each
       house and card includes a `file` path relative to `{baseDir}/`
    
    3. Read each house file and each card's meaning file to understand the draw.
       For faster reads, use `--content` to include house and card text directly
       in the JSON:
       ```bash
       uv run --no-config {baseDir}/scripts/draw_cards.py --content
       ```
    
    4. Interpret the spread using the guide at [{baseDir}/references/INTERPRETATION_GUIDE.md]({baseDir}/references/INTERPRETATION_GUIDE.md)
    
    5. When the task belongs to a specialized technical workflow, use
       [{baseDir}/references/TECHNICAL_CONTEXT_LENSES.md]({baseDir}/references/TECHNICAL_CONTEXT_LENSES.md)
       to translate the reading into an audit, verification, domain, failure-class,
       or stakeholder lens
    
    6. Apply the interpretation to the task at hand
    
    ## When to Use
    
    - **Vague prompts**: The user's request is ambiguous and multiple reasonable approaches exist
    - **Explicit invocations**: "I'm feeling lucky", "let fate decide", "dealer's choice", "surprise me", "whatever you think", "YOLO"
    - **Casual delegation**: "whatever", "up to you", "your call", "idk", "just do something", "wing it", "I trust you", "doesn't matter", "do what you want", "I don't care", "any approach works", "you pick"
    - **Yu-Gi-Oh energy**: "Heart of the cards", "I believe in the heart of the cards", "you've activated my trap card", "it's time to duel"
    - **Shrug-like brevity**: Very short prompts that fully delegate the decision without expressing a preference
    - **Redraw requests**: "Try again" or "draw again" when no actual system changes occurred (this means draw new cards, not re-run the same approach)
    - **Tie-breaking**: When you are about to arbitrarily pick between 2+ valid approaches, draw cards instead of silently choosing one
    
    ## When NOT to Use
    
    - The user has given clear, specific instructions
    - The task has a single obvious correct approach
    - As the deciding authority for safety-critical work (security, data integrity,
      production deployments, release approval, incident response)
    - The user explicitly asks you NOT to use Tarot
    - The user's tone is precision-seeking rather than casual -- ask clarifying questions instead to gather actual requirements
    
    ## Security and Correctness Use
    
    This skill may be used inside a security, audit, or correctness pipeline as a
    creative lens for discovery: choosing which angle to inspect next, breaking
    analysis paralysis, generating hypotheses, or surfacing blind spots.
    
    It is never sufficient by itself. In security and correctness contexts, the
    reading must be followed by ordinary engineering evidence: source review,
    tests, proofs, traces, reproduction steps, exploitability analysis, or other
    domain-appropriate verification. Do not treat a favorable card as permission to
    ship, suppress a finding, skip validation, or overrule a concrete risk.
    
    ## How It Works
    
    ### The Draw
    
    The script uses `secrets` for cryptographic randomness:
    
    1. Builds separate Major Arcana (22 cards) and Minor Arcana (56 cards) decks
    2. Performs Fisher-Yates shuffles via `secrets.randbelow()` (no modulo bias)
    3. Deals the default 12 Houses of the Zodiac spread
    4. Each house receives 1 Major Arcana card followed by 2 Minor Arcana cards
    5. Each of the 36 cards independently has a 50% chance of being reversed
    
    The default spread records a conservative unordered-card entropy budget
    exceeding 100 bits: roughly `log2(C(22,12))` bits from Major Arcana selection,
    `log2(C(56,24))` bits from Minor Arcana selection (assuming
    `secrets.randbelow()` is cryptographically secure), plus 36 reversal bits. The
    exact values are computed and reported in the JSON output under `entropy_bits`.
    The actual ordered assignment of cards to houses contains more entropy.
    
    ### The Spread
    
    The default spread is **12 Houses of the Zodiac**:
    
    | House | Represents | Question It Answers |
    |-------|------------|---------------------|
    | 1 | **Self** | How should this work begin? |
    | 2 | **Resources** | What values, assets, or constraints matter? |
    | 3 | **Communication** | What needs to be clarified or connected? |
    | 4 | **Foundations** | What context or dependency anchors the task? |
    | 5 | **Creativity** | Where should experimentation or delight shape the work? |
    | 6 | **Practice** | What quality, maintenance, or execution concern matters? |
    | 7 | **Partnership** | Who or what must this integrate with? |
    | 8 | **Transformation** | What risk, shared state, or deep change is present? |
    | 9 | **Exploration** | What principle or broader strategy guides the path? |
    | 10 | **Calling** | What delivery or long-term outcome is being served? |
    | 11 | **Community** | What system, network, or shared aspiration is involved? |
    | 12 | **The Hidden** | What blind spot, ending, or unconscious factor matters? |
    
    Within each house, the Major Arcana card sets the archetypal theme and the two
    Minor Arcana cards provide practical detail.
    
    For compatibility with older workflows, `draw_cards.py --legacy` returns the
    previous 4-card hand, and `draw_cards.py --legacy <count>` returns a custom
    hand of 1-78 cards. A positional count without `--legacy` is rejected, because
    the new default spread has a fixed shape.
    
    ### Reference Files
    
    Each house's meaning is in its own markdown file under `{baseDir}/houses/`.
    House files describe how the house applies across technical contexts including
    building new projects, vulnerability discovery, correctness verification, and
    common audit, verification, domain, failure-class, and stakeholder workflows.
    
    Each card's meaning is in its own markdown file under `{baseDir}/cards/`:
    
    - `cards/major/` - 22 Major Arcana (archetypal forces)
    - `cards/wands/` - 14 Wands (creativity, action, will)
    - `cards/cups/` - 14 Cups (emotion, intuition, relationships)
    - `cards/swords/` - 14 Swords (intellect, conflict, truth)
    - `cards/pentacles/` - 14 Pentacles (material, practical, craft)
    
    ### Interpretation
    
    After drawing, read each house file and each card file, then synthesize
    meaning. See [{baseDir}/references/INTERPRETATION_GUIDE.md]({baseDir}/references/INTERPRETATION_GUIDE.md) for the full interpretation workflow.
    For cross-domain translation, see
    [{baseDir}/references/TECHNICAL_CONTEXT_LENSES.md]({baseDir}/references/TECHNICAL_CONTEXT_LENSES.md).
    
    Key rules:
    - Reversed cards invert or complicate the upright meaning
    - Major Arcana cards carry more weight than Minor Arcana
    - The spread tells a story across all 12 houses; don't interpret cards in isolation
    - Map abstract meanings to concrete technical decisions
    - In security, audit, and correctness work, use the reading to choose an
      investigation path, then require evidence before accepting or dismissing any
      risk
    - **Never output interpretation as a text-only turn.** Include the
      interpretation alongside your next tool call (the action that
      implements the chosen option). Prefer `--content` so all 36 card
      meanings and all 12 house meanings are available from the draw output.
    
    ## Example Session (House-Level Fragment)
    
    A real reading synthesizes all 12 houses; the fragment below shows only what
    one house contributes so the format is clear. Do not stop after one house in
    actual use.
    
    ```
    User: "I dunno, just make it work somehow"
    
    [Draw cards]
    1st House (Self): The Magician (upright), Five of Swords (reversed),
                      Ten of Pentacles (upright)
    
    House contribution: The starting stance is resourceful and tool-rich
    (Magician), but the practical details warn against combative edge-case work
    (Five of Swords reversed) while still favoring maintainable craft
    (Ten of Pentacles). This is one input into the overall reading; combine with
    the remaining 11 houses before deciding on an approach.
    ```
    
    The named `draw` agent returns a more compact form for portent questions:
    3 concise bullets covering the dominant theme, the main risk or blind spot,
    and the recommended next action.
    
    ## Error Handling
    
    If the drawing script fails:
    - **Script crashes with traceback**: Report the error to the user and skip the reading. Do not invent cards or simulate a draw — the whole point is real entropy.
    - **Card file not found**: Note the missing file, interpret the card from its name and suit alone, and continue with the reading.
    - **Never fake entropy**: If the script cannot run, do not simulate a draw using your own "randomness." Tell the user the draw failed.
    
    ## Rationalizations to Reject
    
    | Rationalization | Why Wrong |
    |----------------|-----------|
    | "The cards said to, so I must" | Cards inform direction, they don't override safety or correctness |
    | "This reading justifies my pre-existing preference" | Be honest if the reading challenges your instinct |
    | "The reversed card means do nothing" | Reversed means a different angle, not inaction |
    | "Major Arcana overrides user requirements" | User requirements always take priority over card readings |
    | "I'll keep drawing until I get what I want" | One draw per decision point; accept the reading |
    | "The reading says the risk is fine" | Cards can suggest what to inspect; only evidence can dismiss a security or correctness concern |
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related