Install any skill in seconds. Free to start, no credit card required.
Get Started Free →OverKill Hill P³ daily oracle workflow. Use when building or reviewing a stable reading that combines a tarot card, optional zodiac horoscope, and an AI message. Also activate for daily insight, affirmation, card-draw, or consistent word-of-the-day features in a client-only app. Preserve the repo's ISO cache key, deterministic fallback, graceful degradation, and direct-browser security warning; do not add a backend or proxy to this repository.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-14 | ✗→✓ | ▲ Improved | 170% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 51% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 102% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 61% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 226% | 0% |
OverKill Hill P³ · overkillhill.com · github.com/OKHP3
Treat the oracle as a three-layer, once-per-day reading: tarot is the anchor, horoscope is optional context, and the AI message is a best-effort synthesis. The user must still receive a meaningful card and message when network services or the AI key are unavailable.
| In scope | Out of scope | | --- | --- | | tarotapi.dev card fetch with a deterministic Major Arcana fallback | Birth charts, natal calculations, or multi-day forecasts | | Optional freehoroscopeapi.com daily horoscope | Push notifications, external writes, or server-side persistence | | Anthropic message generation through this repo's src/lib/oracle.ts | Adding a backend, Cloudflare Worker, API route, secure proxy, or database | | Per-user, per-day localStorage cache and graceful degradation | Non-Claude AI providers or public multi-user secret management | | Existing useOracle, OracleReading, and OracleCard integration | Replacing the app's state and storage architecture |
When working in Kieran's LifeTrkr, preserve these facts:
src/lib/oracle.ts owns tarot, horoscope, Anthropic access, the fallback, andthe oracle-message cache. src/hooks/useOracle.ts orchestrates the reading; src/components/OracleCard.tsx renders it.
lifetrkr:{userId}:oracle:{YYYY-MM-DD}. The profile sub is the user ID; use guest when no profile exists or parsing fails. The date is new Date().toISOString().split('T')[0], never a locale-formatted date.
MAJOR_ARCANA list andselects MAJOR_ARCANA[dayOfYear % MAJOR_ARCANA.length]. Do not substitute a random card or a static single card, and do not describe a 12-card pool as the repo implementation.
Cloudflare Worker, server, proxy, database, or API route as part of this repository task. A secure public proxy is a separate architecture and is out of scope here.
validation only.
src/lib/oracle.ts, src/hooks/useOracle.ts, src/types.ts, andsrc/components/OracleCard.tsx before editing. Preserve their public names and data flow.
become undefined, and the AI message must fall back to card.meaning_up.
inside this repo, never replace the lifetrkr namespace with myapp.
references/oracle.ts for implementation detail andassets/oracle-component-template.tsx only when a UI template is needed.
text node .agents/skills/okhp3-daily-oracle/scripts/test-oracle-apis.cjs --sign cancer
A non-zero result can be a transient API or CORS failure; it does not remove the fallback requirement. Never put keys or .env files in test output.
YYYY-MM-DD value and two reads. Confirm thesame user/date returns the same message, another user has an isolated key, and guest is used without a profile.
malformed JSON, and offline mode. Each path must render useful output or omit only the optional horoscope. Report unverified external endpoints.
useOracle() hook in the app. Keep network and localstorage work in src/lib/oracle.ts; do not move it into a component.
only when settings.birthSign exists; treat failure as optional.
resulting message or its meaning_up fallback under the exact key above.
stable and prevents unnecessary requests.
OracleReading through the existing OracleCard API. Keep the datein ISO form and expose moon, season, and horoscope context without making the visual layer responsible for fetching it.
Use this compact pattern only when adapting the workflow to another app; replace APP_PREFIX with that app's explicit namespace. In this repository the concrete key must remain lifetrkr:${userId}:oracle:${today}.
typescriptconst today = new Date().toISOString().split('T')[0] const userId = profile?.sub || 'guest' const cacheKey = `${APP_PREFIX}:${userId}:oracle:${today}` const cached = localStorage.getItem(cacheKey) if (cached) return cached // Generate tarot/context/message, then localStorage.setItem(cacheKey, message)
The user ID provides isolation; the ISO date provides daily stability and zero-TTL expiry. Do not use toLocaleDateString(), toDateString(), or Math.random() for the cache or fallback selection.
https://tarotapi.dev/api/v1/cards/random?n=1; require a usable card and fall back deterministically from the 22-card MAJOR_ARCANA array using the Date.now()/getTime() day-of-year calculation and modulo.
https://freehoroscopeapi.com/api/v1/get-horoscope/daily?sign={sign} only when a birth sign is set; return null/undefined on failure and keep the reading usable.
generateOracleMessage(card, moon, season, mercury, birthSign?) and its fallback to card.meaning_up.
horoscope as reflective content, not medical, legal, financial, or predictive advice.
This repository has one intentional exception: src/lib/oracle.ts performs a direct browser request for a personal app. If using that path, preserve all of the following:
typescriptconst apiKey = import.meta.env.VITE_ANTHROPIC_API_KEY // headers include: // 'anthropic-dangerous-direct-browser-access': 'true'
The VITE_ value is embedded in the production JavaScript bundle and can be read by anyone who loads the site. This is acceptable only for a personal or single-user app whose owner accepts exposure and key rotation risk. It is not a secure public deployment pattern. Never commit the key, print it, or imply that Vite hides it. If the user requests public multi-user hardening, explain that a server-side proxy would be the normal solution but is explicitly outside this repository task; do not implement it here.
response.ok and response shape before trusting external JSON.transient loading state or an error object.
userId in the key. A global oracle_${date} key leaks one user'sreading into another user's session.
different card for the same day.
diagnostic, not a production dependency or uptime guarantee.
lifetrkr conventions and src/lib/storage.ts where applicable.
references/oracle.ts — full TypeScript data-layer reference. Read on demand;it is the implementation depth, not a reason to duplicate app modules.
scripts/test-oracle-apis.cjs — network-dependent tarot/horoscope responseshape check; it does not test Anthropic or prove production availability.
assets/oracle-component-template.tsx — UI-only template aligned with therepo's OracleReading/OracleCard boundary. Do not copy API calls into it.
Return the planned data flow, exact cache key, fallback behavior, files changed, validation commands and results, and any API/CORS or key-exposure concern. Do not claim that a live endpoint or benchmark was verified unless it was actually run.
Built by Jamie Hill · OverKill Hill P³ Published at github.com/OKHP3 Part of the OKHP3/skillz Agent Skill library. MIT License -- free to use, fork, and adapt. A nod to the source is appreciated.
Other measured skills in the registry, with their headline benchmark lift.