// Elsie and Anansi’s Box of Stories — complete Ink edition. // Migrated once from pack 0.1.0. This is now the executable source for Ink mode. // The original JSON remains the metadata/evidence/voice contract and legacy edition. // Build directly from this file; do not regenerate it during normal builds. VAR seed = 17 VAR scene_id = "" VAR ending_id = "" VAR counterfactual = false VAR resolver_id = "" VAR outcome_id = "" VAR outcome_weight = 0 VAR outcome_total = 0 VAR v_listening = 0 VAR v_insight = 0 VAR v_care = 0 VAR v_courage = 0 EXTERNAL draw_weight(total) ~ SEED_RANDOM(seed) Long ago, in an Akan tale from Ghana, the world was quiet after sunset because Nyame kept every story in a golden box. Anansi wanted those stories to reach everyone. -> s_village_without_stories === s_village_without_stories === ~ scene_id = "village-without-stories" # scene: village-without-stories // The Quiet After Sunset · Long ago · twilight · setup // Nyame keeps every story in the sky, and the people’s evenings have no tales to carry memory or laughter. + [Listen to the quiet # id: village-hear-quiet # decision: true] -> i_village_hear_quiet + [Follow the silver thread # id: village-follow-thread # decision: true] -> i_village_follow_thread + [Let Elsie guide the opening # id: village-continue] -> i_village_continue + [Ask which story action the listener means # id: village-clarify] -> i_village_clarify === i_village_hear_quiet === ~ resolver_id = "" ~ outcome_id = "" ~ v_listening = MAX(0, MIN(4, v_listening + (1))) # intent: village-hear-quiet # frame: plausible_reconstruction # facts: fact-box-retelling # cues: We listen. Fires crackle, insects hum, but no tale carries from one doorway to the next. Anansi decides that such a quiet world is missing something important. -> s_nyames_price === i_village_follow_thread === ~ resolver_id = "" ~ outcome_id = "" ~ v_courage = MAX(0, MIN(2, v_courage + (1))) # intent: village-follow-thread # frame: plausible_reconstruction # facts: # cues: cue-sky-thread The thread catches moonlight all the way into the clouds. Anansi tests it, gathers his courage, and begins the long climb towards Nyame’s court. -> s_nyames_price === i_village_continue === ~ resolver_id = "" ~ outcome_id = "" ~ v_listening = MAX(0, MIN(4, v_listening + (1))) # intent: village-continue # frame: plausible_reconstruction # facts: # cues: cue-sky-thread Let’s listen once before we climb. The empty evening tells Anansi exactly why the journey matters. Then he places one foot on the silver thread. -> s_nyames_price === i_village_clarify === ~ resolver_id = "" ~ outcome_id = "" # intent: village-clarify # frame: historical_record # facts: # cues: Shall we listen to the quiet around the fires, or follow Anansi’s silver thread into the sky? -> s_village_without_stories === s_nyames_price === ~ scene_id = "nyames-price" # scene: nyames-price // Nyame’s Price · That night · rising_action // The price is designed to sound impossible for someone as small as Anansi. + [Ask why it is so hard # id: price-ask-why # decision: true] -> i_price_ask_why + [Remember every name # id: price-remember # decision: true] -> i_price_remember + [Let Elsie guide the promise # id: price-continue] -> i_price_continue + [Ask which story action the listener means # id: price-clarify] -> i_price_clarify === i_price_ask_why === ~ resolver_id = "" ~ outcome_id = "" ~ v_listening = MAX(0, MIN(4, v_listening + (1))) # intent: price-ask-why # frame: plausible_reconstruction # facts: fact-four-challenges # cues: Nyame says many strong challengers have failed. Anansi hears the hidden clue: strength is not the same as understanding. He repeats the four names before leaving. -> s_aso_weaves_a_plan === i_price_remember === ~ resolver_id = "" ~ outcome_id = "" ~ v_care = MAX(0, MIN(4, v_care + (1))) # intent: price-remember # frame: plausible_reconstruction # facts: fact-four-challenges # cues: Onini. Osebo. Mmoboro. Mmoatia. Anansi repeats the names until none can slip away, then climbs down to tell Aso exactly what Nyame promised. -> s_aso_weaves_a_plan === i_price_continue === ~ resolver_id = "" ~ outcome_id = "" ~ v_care = MAX(0, MIN(4, v_care + (1))) # intent: price-continue # frame: plausible_reconstruction # facts: # cues: Anansi accepts, but he does not rush. He repeats every name and every condition. A promise this important deserves careful listening. -> s_aso_weaves_a_plan === i_price_clarify === ~ resolver_id = "" ~ outcome_id = "" # intent: price-clarify # frame: historical_record # facts: # cues: Should Anansi ask why the price is so hard, or concentrate on remembering all four names? -> s_nyames_price === s_aso_weaves_a_plan === ~ scene_id = "aso-weaves-a-plan" # scene: aso-weaves-a-plan // Aso Spreads the Clues · Later that night · rising_action // Four impossible tasks become four questions about attention rather than strength. + [Notice what they want # id: plan-wants # decision: true] -> i_plan_wants + [Notice what feels safe # id: plan-safety # decision: true] -> i_plan_safety + [Let Aso choose the first clue # id: plan-continue] -> i_plan_continue + [Ask which story action the listener means # id: plan-clarify] -> i_plan_clarify === i_plan_wants === ~ resolver_id = "" ~ outcome_id = "" ~ v_insight = MAX(0, MIN(4, v_insight + (1))) # intent: plan-wants # frame: plausible_reconstruction # facts: fact-aso-partner # cues: Aso agrees. Onini wants his greatness recognized; Mmoatia expects an answer. Wanting can pull as strongly as rope, if Anansi watches carefully. -> s_oninis_measure === i_plan_safety === ~ resolver_id = "" ~ outcome_id = "" ~ v_care = MAX(0, MIN(4, v_care + (1))) # intent: plan-safety # frame: plausible_reconstruction # facts: fact-aso-partner # cues: Aso agrees. A dry gourd can look safe in rain, and a patient distance can calm a dangerous meeting. Care belongs in a clever plan. -> s_oninis_measure === i_plan_continue === ~ resolver_id = "" ~ outcome_id = "" ~ v_insight = MAX(0, MIN(4, v_insight + (1))) # intent: plan-continue # frame: plausible_reconstruction # facts: # cues: Aso begins with wanting. She points to the bamboo pole: Onini is proud of his length. Anansi smiles; the first plan is taking shape. -> s_oninis_measure === i_plan_clarify === ~ resolver_id = "" ~ outcome_id = "" # intent: plan-clarify # frame: historical_record # facts: # cues: Should we begin with what each creature wants, or with what might make each one feel safe? -> s_aso_weaves_a_plan === s_oninis_measure === ~ scene_id = "oninis-measure" # scene: oninis-measure // Onini and the Bamboo Pole · Next morning · rising_action // Onini’s pride creates an opening, but Anansi must not approach carelessly. + [Praise his great length # id: onini-praise # decision: true] -> i_onini_praise + [Ask him to prove it # id: onini-ask # decision: true] -> i_onini_ask + [Let Elsie guide the trick # id: onini-continue] -> i_onini_continue + [Ask which story action the listener means # id: onini-clarify] -> i_onini_clarify === i_onini_praise === ~ resolver_id = "" ~ outcome_id = "" ~ v_insight = MAX(0, MIN(4, v_insight + (1))) # intent: onini-praise # frame: plausible_reconstruction # facts: fact-onini-trick # cues: Anansi admires Onini so warmly that the python stretches beside the pole to prove it. The comparison becomes the opening Aso predicted, and the first challenge is met. -> s_osebos_pit === i_onini_ask === ~ resolver_id = "" ~ outcome_id = "" ~ v_listening = MAX(0, MIN(4, v_listening + (1))) # intent: onini-ask # frame: plausible_reconstruction # facts: fact-onini-trick # cues: Anansi says he may have brought the wrong pole. Onini proudly lines himself up to demonstrate. That willing comparison gives Anansi the opening he needs. -> s_osebos_pit === i_onini_continue === ~ resolver_id = "" ~ outcome_id = "" # intent: onini-continue # frame: plausible_reconstruction # facts: # cues: Anansi chooses praise, because pride is the clue Aso noticed. Onini stretches beside the pole, and the first impossible task becomes possible. -> s_osebos_pit === i_onini_clarify === ~ resolver_id = "" ~ outcome_id = "" # intent: onini-clarify # frame: historical_record # facts: # cues: Should Anansi praise Onini’s extraordinary length, or ask the python to prove the pole is too short? -> s_oninis_measure === s_osebos_pit === ~ scene_id = "osebos-pit" # scene: osebos-pit // A Careful Way Out · The following morning · rising_action // Osebo is powerful, frightened and trapped; Anansi needs distance as well as a lifting plan. + [Test the platform # id: osebo-test # decision: true] -> i_osebo_test + [Wait for calm # id: osebo-wait # decision: true] -> i_osebo_wait + [Let Elsie choose the safe order # id: osebo-continue] -> i_osebo_continue + [Ask which story action the listener means # id: osebo-clarify] -> i_osebo_clarify === i_osebo_test === ~ resolver_id = "" ~ outcome_id = "" ~ v_care = MAX(0, MIN(4, v_care + (1))) # intent: osebo-test # frame: plausible_reconstruction # facts: fact-osebo-trick # cues: Anansi pulls from behind a thick tree. The empty platform rises smoothly. Only then does he lower it to Osebo, keeping a safe trunk between them. -> s_mmoboros_rain === i_osebo_wait === ~ resolver_id = "" ~ outcome_id = "" ~ v_listening = MAX(0, MIN(4, v_listening + (1))) # intent: osebo-wait # frame: plausible_reconstruction # facts: fact-safety-adaptation # cues: Anansi waits until Osebo can hear him. Then he explains the platform one step at a time. Patience makes the lifting trick possible without a wild scramble. -> s_mmoboros_rain === i_osebo_continue === ~ resolver_id = "" ~ outcome_id = "" ~ v_care = MAX(0, MIN(4, v_care + (1))) # intent: osebo-continue # frame: plausible_reconstruction # facts: # cues: We test the platform first, then wait for Osebo to listen. A clever plan is better when it is careful too. The second challenge is met. -> s_mmoboros_rain === i_osebo_clarify === ~ resolver_id = "" ~ outcome_id = "" # intent: osebo-clarify # frame: historical_record # facts: # cues: Should Anansi test the lifting platform first, or wait until Osebo is calm enough to listen? -> s_osebos_pit === s_mmoboros_rain === ~ scene_id = "mmoboros-rain" # scene: mmoboros-rain // Rain from a Leaf · Bright afternoon · crisis // Anansi must make the dry calabash look safer than the wet nest without being stung. + [Show the leaf shelter # id: mmoboro-leaf # decision: true] -> i_mmoboro_leaf + [Tap the dry gourd # id: mmoboro-gourd # decision: true] -> i_mmoboro_gourd + [Let Elsie guide the shelter # id: mmoboro-continue] -> i_mmoboro_continue + [Ask which story action the listener means # id: mmoboro-clarify] -> i_mmoboro_clarify === i_mmoboro_leaf === ~ resolver_id = "" ~ outcome_id = "" ~ v_care = MAX(0, MIN(4, v_care + (1))) # intent: mmoboro-leaf # frame: plausible_reconstruction # facts: fact-mmoboro-trick # cues: cue-leaf-rain Anansi ducks beneath the broad leaf. The Mmoboro follow his example and stream towards the dry calabash. He closes it gently once the last one enters. -> s_mmoatias_clearing === i_mmoboro_gourd === ~ resolver_id = "" ~ outcome_id = "" ~ v_insight = MAX(0, MIN(4, v_insight + (1))) # intent: mmoboro-gourd # frame: plausible_reconstruction # facts: fact-mmoboro-trick # cues: cue-leaf-rain Tap, tap. The calabash sounds hollow and dry while droplets patter on leaves. The Mmoboro find the opening, and the third challenge is met. -> s_mmoatias_clearing === i_mmoboro_continue === ~ resolver_id = "" ~ outcome_id = "" # intent: mmoboro-continue # frame: plausible_reconstruction # facts: # cues: cue-leaf-rain Anansi shelters beneath his leaf so the hornets can see the idea. Soon the whole humming cloud is inside the dry calabash. -> s_mmoatias_clearing === i_mmoboro_clarify === ~ resolver_id = "" ~ outcome_id = "" # intent: mmoboro-clarify # frame: historical_record # facts: # cues: Should Anansi show the hornets his broad leaf shelter, or tap the dry calabash so they notice it? -> s_mmoboros_rain === s_mmoatias_clearing === ~ scene_id = "mmoatias-clearing" # scene: mmoatias-clearing // The Clearing That Listens · Sunset · climax // The last challenge cannot be seen directly, so impatience would ruin Aso’s careful plan. + [Watch the footprints # id: mmoatia-footprints # decision: true] -> i_mmoatia_footprints + [Follow the moving leaves # id: mmoatia-leaves # decision: true] -> i_mmoatia_leaves + [Let Elsie choose patience # id: mmoatia-continue] -> i_mmoatia_continue + [Ask which story action the listener means # id: mmoatia-clarify] -> i_mmoatia_clarify === i_mmoatia_footprints === ~ resolver_id = "" ~ outcome_id = "" ~ v_listening = MAX(0, MIN(4, v_listening + (1))) # intent: mmoatia-footprints # frame: plausible_reconstruction # facts: fact-mmoatia-trick # cues: cue-leaf-whisper Small marks cross the soft earth towards the bowl. Anansi waits. When the unseen visitor loses patience with the silent figure, Aso’s final plan closes. -> s_promise_in_the_sky === i_mmoatia_leaves === ~ resolver_id = "" ~ outcome_id = "" ~ v_insight = MAX(0, MIN(4, v_insight + (1))) # intent: mmoatia-leaves # frame: plausible_reconstruction # facts: fact-aso-partner # cues: cue-leaf-whisper One leaf lifts, then another, though the air is still. Anansi does not rush. The movement reaches the wooden figure, and Aso’s last plan works. -> s_promise_in_the_sky === i_mmoatia_continue === ~ resolver_id = "" ~ outcome_id = "" # intent: mmoatia-continue # frame: plausible_reconstruction # facts: # cues: cue-leaf-whisper We stay quiet and watch the leaves. That patience reveals what eyes alone cannot. The fourth challenge is met, and Anansi turns towards the sky. -> s_promise_in_the_sky === i_mmoatia_clarify === ~ resolver_id = "" ~ outcome_id = "" # intent: mmoatia-clarify # frame: historical_record # facts: # cues: Should Anansi watch the footprints in the soft earth, or stay silent and follow the moving leaves? -> s_mmoatias_clearing === s_promise_in_the_sky === ~ scene_id = "promise-in-the-sky" # scene: promise-in-the-sky // A Promise Must Be Kept · The next night · climax // Anansi has met the price; now the whole court is watching to see whether Nyame keeps his word. + [Name Aso’s ideas first # id: return-credit-aso # decision: true] -> i_return_credit_aso + [Recount all four challenges # id: return-four # decision: true] -> i_return_four + [Let Elsie guide the return # id: return-continue] -> i_return_continue + [Ask which story action the listener means # id: return-clarify] -> i_return_clarify === i_return_credit_aso === ~ resolver_id = "" ~ outcome_id = "" ~ v_care = MAX(0, MIN(4, v_care + (1))) # intent: return-credit-aso # frame: plausible_reconstruction # facts: fact-aso-partner # cues: Anansi begins with Aso: she saw the clues, shaped the plans, and shared the work. Nyame listens, then turns towards the golden box. A promise must be kept. -> s_stories_fly_free === i_return_four === ~ resolver_id = "" ~ outcome_id = "" # intent: return-four # frame: plausible_reconstruction # facts: fact-nyame-promise # cues: Anansi names Onini, Osebo, Mmoboro and Mmoatia, and explains each plan without boasting. Nyame sees that the price has been paid and reaches for the box. -> s_stories_fly_free === i_return_continue === ~ resolver_id = "" ~ outcome_id = "" # intent: return-continue # frame: plausible_reconstruction # facts: # cues: We name Aso’s wisdom and then recount every challenge. Nyame cannot mistake the truth: Anansi has met the price, and the promise belongs to everyone listening. -> s_stories_fly_free === i_return_clarify === ~ resolver_id = "" ~ outcome_id = "" # intent: return-clarify # frame: historical_record # facts: # cues: Should Anansi begin by naming Aso’s ideas, or by recounting the four completed challenges? -> s_promise_in_the_sky === s_stories_fly_free === ~ scene_id = "stories-fly-free" # scene: stories-fly-free // The World Fills with Stories · That same night · resolution // The box is open; the last question is how the listener will receive the story. + [Sit and listen # id: release-listen # decision: true] -> i_release_listen + [Carry it onward # id: release-carry # decision: true] -> i_release_carry + [Let Elsie close by listening # id: release-continue] -> i_release_continue + [Ask which story action the listener means # id: release-clarify] -> i_release_clarify === i_release_listen === ~ resolver_id = "" ~ outcome_id = "" ~ counterfactual = true # intent: release-listen # frame: counterfactual # facts: fact-all-stories # cues: We sit where the firelight reaches us. A voice begins, another answers, and the quiet night is quiet no longer. Our story ends here, in a listening circle. ~ ending_id = "the-listening-circle" -> END === i_release_carry === ~ resolver_id = "" ~ outcome_id = "" ~ counterfactual = true # intent: release-carry # frame: counterfactual # facts: fact-akan-origin,fact-aso-partner # cues: Then take this one gently. Say where it comes from, remember Aso as well as Anansi, and make room for the next teller. Our story ends here, on its way onward. ~ ending_id = "the-story-carrier" -> END === i_release_continue === ~ resolver_id = "" ~ outcome_id = "" ~ counterfactual = true # intent: release-continue # frame: counterfactual # facts: # cues: Let’s listen. Around the first fire, one voice begins and another joins. The quiet world has become a world of stories. Our story ends here. ~ ending_id = "the-listening-circle" -> END === i_release_clarify === ~ resolver_id = "" ~ outcome_id = "" # intent: release-clarify # frame: historical_record # facts: # cues: Would you like to sit by the fire and listen, or carry this story home to tell again? -> s_stories_fly_free // Inky and gameplay use seeded Ink randomness. Analysis may substitute a draw. === function draw_weight(total) === ~ return RANDOM(1, total)