{"slug": "the-clockwork-dark", "title": "The ClockWork Dark", "summary": "A reactive game world called The ClockWork Dark uses a deterministic engine for mechanics, two autonomous LLM agents for improvisation, and a governance layer to maintain coherence. The system balances AI freedom with engine-enforced rules to ensure surprising yet fair storytelling, featuring a Doom Clock that reshapes the world as players confront the Dark.", "body_md": "The world is no longer static scenery — it **reacts**.\n\n`unmake`\n\nreckoning at the tower. The narrative spine is complete: tunnels open → descend → Hollow Hill → name the Hollow Crown → carry the older name → unmake the Dark.`:focus-visible`\n\n; `prefers-reduced-motion`\n\n.A deterministic engine holds all mechanical truth; two autonomous LLM agents improvise on top; a governance layer reins them in; OKFS feeds them canon; media renders it.\n\n```\nflowchart TB\n    subgraph HARD[\"Hard Engine — engine/game/ (the only authority)\"]\n        STATE[\"GameState · dice · combat · crafting · travel<br/>evil_ticker · DoomClock · challenges · contracts\"]\n        SKILLS[\"@skill registry — engine/skills/<br/>roll_dice · resolve_combat · craft_item · move_to · confront_darkness\"]\n    end\n    subgraph AGENTS[\"Two Agents — engine/agents/\"]\n        DRIVER[\"Storyteller / Driver<br/>big model · drives world · Evaluator gate + retry\"]\n        ASSIST[\"Assistant<br/>small model · unreliable companion<br/>AssistantDirector: when / with-what / how-reliably\"]\n    end\n    subgraph GOV[\"Governance — engine/governance/ + engine/mcp/\"]\n        PRE[\"PRE interceptors — shape the prompt<br/>LoreInject · DoomBeat · EvilPhaseTone · StorytellerMind · AwarenessGate\"]\n        POST[\"POST audit — SceneRulesEngine R001-R005<br/>RulesGovernor records LLM overreach\"]\n    end\n    subgraph KNOW[\"OKFS Knowledge — knowledge/\"]\n        OKFS[\"one concept per .md + frontmatter + links<br/>lore · NPCs · items · arcs · runbooks · metrics<br/>content-hashed _index.json\"]\n    end\n    subgraph MEDIA[\"Media — engine/media/ (graceful degradation)\"]\n        IMG[\"ComfyUI images / cutscenes\"]\n        VOICE[\"Voxtral TTS / STT\"]\n    end\n    OBS[\"Oracle — engine/observability/ · /api/metrics\"]\n\n    SKILLS <--> STATE\n    AGENTS -- \"propose, never decide\" --> SKILLS\n    PRE --> AGENTS --> POST\n    KNOW -. \"RAG / progressive disclosure\" .-> AGENTS\n    AGENTS --> MEDIA\n    AGENTS --> OBS\n    POST --> OBS\n```\n\nThe balance we chase: let the AIs run loose enough to **surprise**; rein them with the engine + governance enough to stay **coherent and fair**.\n\n| System | What it does | Key tools |\n|---|---|---|\nDeterministic dice / skill engine |\nAll randomness is engine-rolled and reproducible. The LLM must call a tool before narrating any outcome. |\n`roll_dice` , `resolve_skill_check` |\nGrounded combat |\nEngine-authoritative d20 to-hit, damage dice, fear/exhaustion, fleeing, defending, and sympathy — the “unmaking” damage that works against clockwork foes. |\n`resolve_combat` , `query_combat_state` |\nCrafting |\nBaking, herbalism, tinkering. Engine consumes inputs, grants output; recipes gate on location & ingredients. | `craft_item` , `list_recipes` |\nThe Doom Clock |\nTurns evil drift into a story — arcs `quiet_life → whisper → march → convergence → consumed` , once-only world-sign beats (cog-harvesters, brass scarecrow, vines, the opened tunnels, the tower), and the terminal consumed ending if you never push back. Engagement (rising when you confront the Dark) slows the tick ~40%, but decays — so you must keep pushing. |\n`confront_darkness` |\nThe reactive world |\nDoom Clock beats reshape the map — each fires declarative effects (flags, discoveries, rumors, NPC relocations) onto `GameState` . Crossing a beat unlocks new ground, displaces villagers, and gates notice-board postings. The world remembers. |\n`apply_beat_effects` |\nSet-pieces |\nAuthored, world-gated challenges — the tunnel-mouth (a branching underground descent) and the warden barrow (Hollow Hill — learn the older name or trust the faceless Assistant). Presented by the engine, resolved by the standard challenge system, with per-node scene art and riddles. |\n`start_set_piece` |\nNPC movement |\nNamed villagers relocate as the Dark spreads — Aldric abandons the forest margin, Greta leaves the shrine, the gate thins. `npcs_at` reflects it; displaced villagers are marked and wear road-worn faces. Maris does not move. |\n`npc_moves` effects |\nThe Forge |\nBrann Holt’s smithy off the square — station-gated recipes (mend a blade, forge a warded blade, reforge a relic). The mundane anchor: honest anti-Dark gear, craftable only at the anvil. | `craft_item` (station: forge) |\nThe convergence |\nThe approach to the clockwork tower as ordered reckoning beats and the player’s last engine-resolved choice (`stand` / `unmake` / `walk_away` ), adjudicated on d20 + engagement vs a progress-scaled DC. Learning the older name in Hollow Hill sharpens the `unmake` roll. |\n`resolve_reckoning` |\nThe unreliable Assistant Director |\nEach turn, from trust, your struggle, the evil phase, and how recently it last appeared, decides whether the Assistant shows up, with what (quip / hint / lore / warning / gift), and how reliably (low trust → its advice may mislead). Help feels earned and uncertain, never owed. |\n`grant_hint` , `reveal_lore` , `change_form` , `assistant_gift` |\nEphemeral structured challenges (the novel bit) |\nThe Storyteller can compose a rule-bound encounter mid-narration — a `skill_gauntlet` , `decision_tree` , `puzzle` , or `dice_table` — by handing the engine a declarative spec validated against a fixed schema. The AI supplies structure; the engine adjudicates the outcome. An improvising narrator that can’t cheat its own dice. |\n`start_challenge` , `resolve_challenge` |\nNotice board & contracts |\nOpt-in work in three tempers: `mundane` (dawn-bread, a tinker’s lost cog), `bounty` (the wandering scarecrow), and `anti_dark` (still the harvester — raises engagement). The board reacts to the world — postings appear as their beat-flags fire, with signpost poster art. Rewards are engine-granted on genuine completion. |\n`list_contracts` , `accept_contract` , `complete_contract` |\nChance encounters |\nSeeded, deterministic rolls on arrival — from the destination edge’s `danger_dc` and the evil phase. Yields `none` (calm), a harmless `discovery` (engine-granted reward), or an `ambush` naming a clockwork-tagged foe. |\n`query_encounter_foes` |\nThe Oracle |\nA slim observability backbone. Every turn — latency, eval score, governance violations, the Assistant’s intervention/gift rate, evil drift — is recorded and rolled into aggregates at `/api/metrics` , so pacing (the heart of the dread) stays visible. |\n`GET /api/metrics` |\nKnowledge at runtime |\nAgents search the OKFS bundle and pull a single concept’s body — progressive disclosure, not 3,000 lines at once. | `query_knowledge` , `read_concept` |", "url": "https://wpnews.pro/news/the-clockwork-dark", "canonical_source": "https://discuss.huggingface.co/t/the-clockwork-dark/177032#post_4", "published_at": "2026-06-22 01:33:59+00:00", "updated_at": "2026-06-22 01:45:34.824053+00:00", "lang": "en", "topics": ["artificial-intelligence", "large-language-models", "ai-agents", "ai-safety", "ai-ethics"], "entities": ["ClockWork Dark", "Doom Clock", "Hollow Hill", "Hollow Crown", "Aldric", "Greta", "Maris", "ComfyUI"], "alternates": {"html": "https://wpnews.pro/news/the-clockwork-dark", "markdown": "https://wpnews.pro/news/the-clockwork-dark.md", "text": "https://wpnews.pro/news/the-clockwork-dark.txt", "jsonld": "https://wpnews.pro/news/the-clockwork-dark.jsonld"}}