How-to
Open campaigns and lessons
Keep stable ids, witnessed plans and review status with authored content.
Find content by stable id
import { levelManifest,getLevel,getTutorial,tutorialManifest,createLevel } from "@johnmorrisdotca/houseki/falling-triplets";
const level=levelManifest[0];
console.log(getLevel(level.id)?.number,getTutorial(tutorialManifest[0].id)?.title.en,createLevel(level.id).phase);1 Cycle and Land fallingArray indices start at zero; display numbers start at one. Persist the stable id rather than a display number because campaign ordering may change in a future release. getLevel, getTutorial and getLesson return undefined for absent ids; creation functions reject missing content.
Preserve proof and review separately
import { GEM_SWAP_CAMPAIGN,GEM_SWAP_LESSONS,validateChallengeWitness } from "@johnmorrisdotca/houseki/gem-swap";
const level=GEM_SWAP_CAMPAIGN[0];
console.log(level.proofStatus,level.reviewStatus,validateChallengeWitness(level.options,level.witness).valid,GEM_SWAP_LESSONS.length);engine-witness-verified human-review-pending true 3There are 684 measured challenges across all stored campaigns. Measurements describe bounded engine probes; marks are not a universal estimate of human difficulty. Read the original coverage and campaign methodology. Authored lessons add explicit instructions to their setup and witness, not just a random starting board.