// SPDX-License-Identifier: Apache-2.0 ; specs/course/queen-and-hive.t27 -- the t27 course on the Queen and the hive, how the project builds itself ; Source of truth for apps/website/scripts/course-from-spec.mjs (gHashTag/trinity), which reads ; it the way it reads specs/course/course.t27: the constant schema, every test block below, every ; widget in specs/widgets/gallery.t27, every lesson spec compiled clean, the Russian bundle named ; by specs/course/queen-and-hive-ru.t27. It writes this course into src/lib/course.generated.ts ; (the page at #/queen-and-hive) and a byte-identical copy of this file at ; public/learn/queen-and-hive.t27. ASCII only (L3), English only (LANG-EN). ; WHAT THE COURSE IS: course 11 of specs/course/courses.t27, 27 lessons in 9 modules of 3: the ; task, who goes next, a bee's life, the reviewer bee, the review jam, keys, credit and money, ; agents among themselves, and night and the board. The project builds itself: an issue becomes ; a task for a bee, the bee writes a .t27 spec, a reviewer bee checks it, it merges and the site ; regenerates. The Queen that runs this loop is written in gHashTag/t27 specs/queen and ; specs/automation, each spec with numeric tests. Every widget runs the fn bodies of one of 15 of ; those specs compiled to WebAssembly (public/widgets//logic.js, held to its spec by ; scripts/widget-logic.mjs), vendored byte for byte from t27 master c42f8fb40. The door code ; around review-jam's fns comes from gHashTag/999-multibots-telegraf#4020. ; WHAT THE COURSE DOES NOT DO: it reads no live Queen. Every number in a lesson is a constant or ; a recorded measurement of the lesson spec, or an answer of its compiled fns to inputs the ; reader sets. Lesson 26 shows a finding of dispatch.t27 as the board draws it today: a closed ; issue's finished claims all land in done. ; WHY 27: 3 cubed lessons, the size of a TRI-27 word. Changing the shape changes the tests. ; phi^2 + 1/phi^2 = 3 | TRINITY module queen_and_hive; pub const KIND : str = "course"; pub const ID : str = "queen-and-hive"; pub const SCHEMA_VERSION : u8 = 1; ; The derived files the generator rewrites (relative to apps/website). pub const GENERATED : [2]str = ["src/lib/course.generated.ts", "public/learn/queen-and-hive.t27"]; pub const ROUTE : str = "queen-and-hive"; ; Share pages: learn/ for course 1, learn// for the next (specs/course/courses.t27). pub const SHARE_PATH : str = "learn/queen-and-hive/"; ; The paid training every course page links to (specs/course/arithmetic-and-dsp.t27). pub const COHORT_ROUTE : str = "fpga-training"; pub const GALLERY : str = "specs/widgets/gallery.t27"; pub const LOCALES : [2]str = ["en", "ru"]; pub const RU_CONTRACT : str = "specs/course/queen-and-hive-ru.t27"; ; Lesson marks the reader sets are kept in this browser only, under this key, one key for ; every course. pub const PROGRESS_KEY : str = "t27-course-done"; pub const SENDS_NOTHING : bool = true; ; A lesson's widget is the page's main stage, so it is drawn taller than a ; gallery card (specs/widgets/gallery.t27 EMBED_* heights are for embeds in posts). pub const TOOL_FRAME_HEIGHT : u16 = 760; pub const PLAYER_FRAME_HEIGHT : u16 = 480; ; --- Words on the page --------------------------------------------------------------------- pub const TITLE : str = "The Queen and the hive: how the t27 project builds itself"; pub const DESCRIPTION : str = "Course 11, 27 lessons, a live widget and a t27 spec each: shaping an issue, priority and review first, a task's life, the reviewer and the merge gate, the review jam, keys, credit and tokens, agents in one group, the night watch and the board. Every answer comes from a compiled spec."; pub const SAY_KICKER : str = "Course"; pub const SAY_LEAD : str = "This project builds itself: an issue becomes a task for a bee, the bee writes a t27 spec, a reviewer bee checks it, it merges, and the site regenerates. The Queen who runs that loop is written as t27 specs with tests, and every widget here runs the fn bodies of one of them compiled to WebAssembly."; pub const SAY_SHAPE : str = "9 modules of 3 lessons, 27 cells. A filled cell is a lesson you marked done."; pub const SAY_START : str = "Start lesson 1"; pub const SAY_CONTINUE : str = "Continue"; pub const SAY_MODULE : str = "Module {0}"; pub const SAY_LESSON : str = "Lesson {0} of {1}"; pub const SAY_GOAL : str = "You will learn"; pub const SAY_TRY : str = "Try it"; pub const SAY_ALSO : str = "Also try"; pub const SAY_ALSO_HINT : str = "Each one swaps the widget above."; pub const SAY_BACK_TO_MAIN : str = "Back to this lesson's widget"; pub const SAY_SPEC : str = "Open the lesson's spec in the player"; pub const SAY_OPEN_PAGE : str = "Open the widget on its own page"; pub const SAY_WIDGET_LANG : str = "Widgets keep their own English words: each one lives in its own t27 spec."; pub const SAY_PREV : str = "Previous"; pub const SAY_NEXT : str = "Next"; pub const SAY_ALL : str = "All lessons"; pub const SAY_MARK : str = "Mark as done"; pub const SAY_MARKED : str = "Done"; pub const SAY_PROGRESS : str = "{0} of {1} done"; pub const SAY_PRIVATE : str = "Progress stays in this browser; nothing is sent."; pub const SAY_SOURCE : str = "This course is itself a t27 spec: read it"; pub const SAY_COHORT : str = "Looking for the paid FPGA training? It moved to its own page."; pub const SAY_NOT_FOUND : str = "No lesson has this address."; pub const SAY_OPEN_LESSON : str = "Open the interactive lesson"; pub const SAY_OPEN_COURSE : str = "Open the interactive course"; pub const SAY_SEO_TITLE : str = "{0}: the Queen and the hive course, lesson {1} of {2}"; pub const SAY_SHARE : str = "Link to share, with a preview card"; pub const SAY_NEXT_COURSE : str = "Next course"; pub const SAY_PREV_COURSE : str = "Previous course"; ; --- Modules ------------------------------------------------------------------------------- pub const LESSONS_PER_MODULE : u8 = 3; pub const MODULE_COUNT : u8 = 9; pub const MODULE_IDS : [9]str = ["the-task", "who-goes-next", "a-bees-life", "the-reviewer", "the-jam", "keys", "credit-and-money", "agents-together", "night-and-the-board"]; pub const MODULE_TITLES : [9]str = [ "The task", "Who goes next", "A bee's life", "The reviewer bee", "The review jam", "Keys", "Credit and money", "Agents among themselves", "Night and the board" ]; pub const MODULE_LINES : [9]str = [ "An issue becomes work only once it is shaped: the sections it lacks are written or asked for, its boundary names real files, and one filter reads every kind of task.", "The order the Queen takes issues in: a label ages one step, at most 3 criticals run as critical, and nothing new starts while finished work waits for review.", "From candidate to done: twelve states and sixteen events, a ship in the game that flies home, and a deploy that does not cut a bee short.", "Finished work is judged on its own clock: enough reviews at once to keep up, a pause that doubles for a row that waits, and a merge gate that zero checks cannot open.", "A pull request that will not move is in exactly one of ten cases, each with the Queen's move, and a red check is inherited only when master says so.", "A bee's model key can be refused: the code in the body sorts the refusal, a transient one rests the key for seconds, and the bee moves on to the next free key.", "Lending a key earns no credit, an operation is sold at twice its cost in half-cent tokens, and tokens burn 30 days after they land.", "One bot per agent in one group: who is called, a chain three bot messages deep, and the clocks that keep agents from flooding a chat.", "What the hive shows: a night watch that opens, comments on and closes issues, the columns of the public board, and the comb that flashes for each event." ]; ; --- Lessons ------------------------------------------------------------------------------- ; LESSON_WIDGETS names the widget the lesson opens; every one is a gallery id, and no two ; lessons of any course open the same one. LESSON_ALSO offers module siblings and related hive ; widgets. LESSON_SPECS is the spec under public/t27/files/ the lesson opens in the player, and ; the spec whose compiled fn bodies the widget runs. pub const LESSON_COUNT : u8 = 27; pub const LESSON_IDS : [27]str = [ "shaping-an-issue", "a-boundary-of-real-files", "one-task-three-kinds", "aging-a-label", "the-queue", "review-first", "a-tasks-life", "the-ship-flies-home", "a-deploy-mid-flight", "enough-reviewers", "back-off", "the-merge-gate", "the-review-jam", "the-queens-move", "inherited-red", "a-refused-key", "a-key-rests", "the-next-key", "no-credit-for-keys", "twice-the-cost", "tokens-that-burn", "who-is-called", "three-bots-deep", "stop-and-mute", "the-night-watch", "the-public-board", "the-comb-answers" ]; pub const LESSON_MODULES : [27]str = [ "the-task", "the-task", "the-task", "who-goes-next", "who-goes-next", "who-goes-next", "a-bees-life", "a-bees-life", "a-bees-life", "the-reviewer", "the-reviewer", "the-reviewer", "the-jam", "the-jam", "the-jam", "keys", "keys", "keys", "credit-and-money", "credit-and-money", "credit-and-money", "agents-together", "agents-together", "agents-together", "night-and-the-board", "night-and-the-board", "night-and-the-board" ]; pub const LESSON_WIDGETS : [27]str = [ "hive-shape", "hive-boundary", "hive-task-filter", "hive-aging", "hive-rank", "hive-review-first", "hive-lifecycle", "hive-ship", "hive-drain", "hive-reviewers", "hive-revisit", "hive-gate", "hive-jam", "hive-jam-action", "hive-master-red", "hive-key-error", "hive-key-rest", "hive-next-key", "hive-credit", "hive-price", "hive-burn", "hive-called", "hive-chain", "hive-cooldown", "hive-night", "hive-column", "hive-cell" ]; pub const LESSON_ALSO : [27]str = [ "hive-boundary,hive-task-filter", "hive-shape,hive-task-filter", "hive-shape,hive-column,hive-lifecycle", "hive-rank,hive-review-first", "hive-aging,hive-review-first", "hive-rank,hive-reviewers", "hive-ship,hive-drain,hive-column", "hive-lifecycle,hive-cell", "hive-lifecycle,hive-ship", "hive-revisit,hive-gate,hive-review-first", "hive-reviewers,hive-key-rest", "hive-master-red,hive-reviewers", "hive-jam-action,hive-master-red", "hive-jam,hive-gate", "hive-gate,hive-jam", "hive-key-rest,hive-next-key", "hive-key-error,hive-next-key,hive-revisit", "hive-key-error,hive-key-rest,hive-credit", "hive-price,hive-next-key", "hive-burn,hive-credit", "hive-price,hive-night", "hive-chain,hive-cooldown", "hive-called,hive-cooldown", "hive-chain,hive-called", "hive-column,hive-cell", "hive-task-filter,hive-lifecycle,hive-night", "hive-ship,hive-night" ]; pub const LESSON_SPECS : [27]str = [ "specs/queen/shaping.t27", "specs/queen/shaping.t27", "specs/queen/tasks.t27", "specs/queen/priority.t27", "specs/queen/priority.t27", "specs/queen/review_first.t27", "specs/queen/dispatch.t27", "specs/queen/hive.t27", "specs/queen/drain.t27", "specs/queen/reviewer.t27", "specs/queen/reviewer.t27", "specs/queen/merger_gate.t27", "specs/automation/review-jam.t27", "specs/automation/review-jam.t27", "specs/queen/merger_gate.t27", "specs/queen/key_failover.t27", "specs/queen/key_failover.t27", "specs/queen/key_failover.t27", "specs/automation/queen-contributor-keys.t27", "specs/automation/token-wallet.t27", "specs/automation/token-wallet.t27", "specs/automation/agent-hive-group.t27", "specs/automation/agent-hive-group.t27", "specs/automation/agent-hive-group.t27", "specs/automation/card-chat-night-watch.t27", "specs/queen/dispatch.t27", "specs/queen/hive.t27" ]; pub const LESSON_TITLES : [27]str = [ "Shaping an issue", "A boundary of real files", "One task, three kinds", "Aging a label", "The queue", "Review first", "A task's life", "The ship flies home", "A deploy mid-flight", "Enough reviewers", "Back off", "The merge gate", "The review jam", "The Queen's move", "Inherited red", "A refused key", "A key rests", "The next key", "No credit for keys", "Twice the cost", "Tokens that burn", "Who is called", "Three bots deep", "Stop and mute", "The night watch", "The public board", "The comb answers" ]; pub const LESSON_GOALS : [27]str = [ "What the Queen does with an issue that lacks sections, and why she stops after two tries.", "Which proposed paths a task may reserve, and why one invented path stops the whole shape.", "How an issue, a review and a job become one kind of task with seven states, and how one filter reads them.", "How a labelled issue moves up with age, and why only by one level.", "How the cap, aging and blockers order a queue of open issues.", "Why the Queen closes the backlog while finished work waits for a review, and what still goes.", "Which states a dispatched task passes through, and which events are legal in each.", "Where the game draws a bee for each thing it is doing, and how a finished task ends on screen.", "What a redeploy does to a bee, a review, a round, a job and a wait.", "How many reviews must run at once for the reviewer to keep up with the bees.", "Why a row that answers wait is visited less and less often, and how often at least.", "When the merger may merge a pull request a reviewer bee approved.", "Which of ten cases a stuck pull request is in, and why the earliest matching rule wins.", "What the Queen does for each jam, and which jams she waits on.", "When a red check on a pull request is inherited from master, and why a cancelled run says nothing.", "How the Queen sorts a provider's refusal into transient, quota, auth or a bad request.", "How long a refused key rests before a bee may use it again.", "Which key a bee tries next, and when it moves to another pool or gives up.", "What a contributor's lent keys earn, and which limits keep them safe.", "How the project prices an operation and what a month of tokens buys.", "When a batch of tokens burns, and which batch is spent first.", "Which messages in the hive group wake an agent, from a person and from another agent's bot.", "How the hive stops agents from answering each other forever.", "What /stop and /mute do, and why neither can lose a person or a direct call.", "What the night watch does in the morning with four card checks.", "Which column the public board draws each claim in, and the case it gets wrong.", "How the game shows that something happened to a task, and how often the map grows." ]; pub const LESSON_TEXTS : [27]str = [ "A bee can start only on an issue that says what to do and which files it may touch. The Queen holds every open issue to judge() of specs/policy/issue_shape.t27. One that is not ready she shapes: a model writes the missing sections, and the body goes back only if judge() then finds nothing missing. After SHAPE_ATTEMPT_LIMIT, 2 failed shapes, she stops and comments once with what is missing, and an epic is never shaped. shape_action in shaping.t27 decides, and a new try waits 360 minutes.", "A task's boundary is a reservation: while a bee works, no other bee takes those files. So a wrong boundary is worse than a missing one, because it holds files the work does not own. path_accepted takes any file that exists, and a new file only when its folder exists, the issue cites it, and its language is one the only-t27 rule allows. shape_lands writes the shape back only when no section is missing, it names 1 to 12 paths, and none of them was refused.", "The Queen runs three kinds of work: issues for bees, reviews of finished work, and jobs. Each kept its own codes, so no board could show them together. tasks.t27 gives them 7 shared states, numbered as the board's columns plus failed. A cancelled job shows as dropped, and so does a review row that was forgotten. task_matches is the filter the board, the game and the route all apply: a bit per kind, a bit per state, and 0 means any.", "Without labels the Queen takes issues in GitHub's listing order. priority.t27 adds four levels, critical, high, normal and low; lower runs first, and an unlabelled issue counts as normal. A labelled issue gains one level after AGING_DAYS, 14 days, and at most MAX_AGING_STEPS, 1 level, so a low issue reaches normal on day 14 and stays there. High and critical do not age. effective_level computes the line the widget draws.", "Labels inflate: if every issue is critical, none is. capped_level lets at most CRITICAL_CAP, 3, issues of a listing run as critical, taken in listing order, and the 4th runs as high. An issue with an open blocker is skipped, not waited on, so it cannot hold up the queue. outranks compares the effective level, then the real level, then the place in the listing, so an aged issue never beats a real one of its level. why names the reason for each place.", "On 2026-10-18 the status page read 69 of 70 workers busy, and in one hour 102 dispatches, 56 finished and 11 reviewed. Bees started about nine for every verdict, and each new bee held files that the bees in review needed when they were sent back. review_first.t27 closes the backlog while the review queue is longer than REVIEW_QUEUE_MAX, 0. Work the review sent back and work the owner assigned still go: admission admits them at any queue length.", "dispatch.t27 is the Queen's task lifecycle, the cycle that chooses, starts, ends, reviews and releases work. A task has 12 states and 16 events. next_state answers every pair, and 99 means the event is illegal in that state: a verdict cannot reach a running task, and a reap cannot reach an ended one. After a verdict a send-back waits for its floor and is released; even an accept is sent back if CI turns red under the ceiling.", "In the game at app.t27.ai/game each bee is a ship over the issue it works on. ship_mode in hive.t27 picks the place: parked at the entrance before a runner claims it, orbiting its cell while it is heard from, hovering when it has gone quiet, and waiting at its repository's portal until its cell is placed. When the bee leaves the feed it flies home, and ship_alpha fades it over DEPART_MS, 2400 ms: at 1200 ms it is at 500 of 1000.", "Every merge redeploys the Queen, and work is running when it does. drain.t27 sorts that work. A round, a job step and a wait row are rows the store keeps: the process leaves them and the next process carries on. A review is stopped, because a stop loses at most one review, which is redone. A bee is held, because what it has done lives in its conversation; at the cap, drain_cap_seconds, 1800 s today, it is handed back and its work is salvaged into its branch.", "A review may take REVIEW_ROW_SECONDS, 300 s, so one slot clears at most 12 rows an hour. On 2026-10-09 bees finished about 58 an hour while 111 rows waited, and the fixed REVIEWER_CONCURRENCY of 4 tops out at 48. slots_needed(58) is 5. reviewer_concurrency takes the keys, their lanes and the free memory, never goes above 16 and never below 1 while anything waits, and keeps_up compares it with the finish rate.", "Over 44 minutes on 2026-10-09 the reviewer made 941 row visits, 888 of them wait, from 22 rows whose branch it could not read; one row was visited 54 times. revisit_after_seconds now waits 30 s after one wait and doubles per wait, never past 900 s: 30, 60, 120, 240, 480, 900. due_again lets the row be taken only once that time has passed, and any other answer resets the count.", "The reviewer bee approves, and the merger merges; merger_gate.t27 is the rule between them. check_passes lets a green check through and blocks any check still running. A red one passes only when it is not required, has concluded, and the bee named it as discounted, and with the ruleset unreadable every check counts as required. gate_open needs at least 1 posted check, 0 running and 0 blocking: zero checks is not zero failures.", "A pull request can stall for many reasons at once: refused, pushed again, and red on a noise check. review-jam.t27 gives the Queen one answer. jam_case checks 9 facts in a fixed order and the earliest rule that matches wins, so a PR the Queen could not measure is never reported as free, and one that was refused and then pushed is not taken for noise. There are 10 cases, from none to unmeasured.", "Each case has one action at the same position: no reviewer dispatches a reviewer, refused not fixed dispatches the coder, refused then pushed dispatches a re-review, and labeled not merged finishes the merge. jam_action maps any value above 9 to measure again, so an unknown case is never nothing to do. jam_is_queens_turn is false for 3 cases, none, draft or fresh, and stacked on an open PR: she waits on those.", "A bee may approve a PR with a red check when that check is red on master too. On 2026-10-06 a PR merged red because master's run of that check was cancelled and was read as red. Now the merger reads master itself, newest run first: run_says counts only a completed failure or success, look_back passes over everything else and over runs older than the merge base, and discount_holds needs the bee's word and MASTER RED.", "Bees call models with keys, and keys get refused. key_failover.t27 sorts each refusal with error_kind. The z.ai code in the body wins over the HTTP status, because z.ai sends a spent quota and a passing overload with the same 429: code 1305 is transient, 1113 is quota. No answer at all is transient. A quota or auth refusal closes the key, and only a bad request is charged to the issue.", "A transient refusal rests the key COOL_BASE_SECONDS, 15 s, doubled per strike in a row and never more than COOL_CAP_SECONDS, 240 s: 15, 30, 60, 120, 240. A spent quota or a refused key closes it for KEY_BREAK_SECONDS, 1800 s. cooldown_seconds gives all of it. The rest is short so that 34 keys are never all resting through a one-minute burst like the one of 2026-10-17.", "On 2026-10-17 a bee started on key 9 of 10 and died 7 s later while 33 other keys stood by: it got one key at dispatch and kept it. next_free now picks the next key after the last one that is neither tried nor resting. 1305 is an overload of the pool's model, so once POOL_OVERLOAD_KEYS, 3, keys said it within a minute, step moves the bee to the next pool. After 8 attempts the turn ends.", "Anyone can lend the hive model keys through queen-contributor-keys.t27. A key is probed before it is enabled: at most 4 probes at once, a new probe waits out 60 s after the last, and an owner holds at most 100 keys. Lending earns nothing by itself: CREDIT_WALLET is false, so wallet_credit answers 0 for any number of keys. XP follows the work the Queen records.", "Every dollar becomes tokens at one rate, TOKEN_MICRO_USD 5000: a token is half a cent. price_tokens sells an operation at twice what it costs, MARKUP_PCT 200, and rounds up so nothing sells below that: a cost of 12300 micro-dollars is 5 tokens. month_tokens turns $20 into 4000 tokens, which is 14 reels of 270 tokens or 333 portraits of 12.", "The owner's rule of 2026-10-01: all money goes into tokens, and tokens not spent within the month burn, so a person who paid makes content instead of saving tokens. Each batch lives MONTH_DAYS, 30 days, and days_left counts it down from the day it landed. On day 25 the package month from day 0 has 5 days left, the start gift from day 3 has 8, and a top-up from day 12 has 17. The spend order is soonest burn first.", "Every agent has its own bot and its own topic in one forum group. A person calls an agent by its tag, by @all, by a reply, or by writing in its topic. Another agent's bot calls it only by a tag or a reply: a bot never triggers the whole hive and never wakes a topic's owner by merely writing there. addressed in agent-hive-group.t27 is that rule, one line long.", "Telegram gives no loop protection between bots, so two agents could answer each other forever. Two numbers stop it. MAX_BOT_DEPTH is 3: a person, then A, B and C, then silence. BOT_REPLY_COOLDOWN_MS is 5000: a bot answers another bot at most once in 5 s. may_answer always lets a person through, and a bot only inside the chain and after the cooldown.", "cooled says whether 5000 ms have passed since the last bot message. /stop silences bot-to-bot turns in a chat for STOP_WINDOW_MS, 10 minutes, and a person is still heard: that is may_answer_after_stop. /mute keeps an agent quiet in a topic for MUTE_MS, an hour, but it still answers its own tag: heard_while_muted. Both are clocks, so nobody has to switch the hive back on.", "Every night four checks of the card chat run: the thread, the status door, the merges and the parity. night_verdict sums them up: any fail is a fail, else anything unmeasured is unmeasured, else it is a pass. night_report turns that into one act: a fail opens an issue or comments on the open one, a pass closes an open issue or stays silent, and an unmeasured night leaves everything as it is.", "The board at app.t27.ai/game/kanban draws every dispatch in one of 6 columns. column_of reads the claim a dispatch holds on its issue: running is running, accepted is done, rejected and awaiting review are in review, and failed is dropped. dispatch.t27 records one finding as it is: once an issue is closed and the list was read, every finished claim is drawn as done, whatever its verdict.", "The game's comb has a cell for each issue, and before hive.t27 an accepted task, a lost lease and a cancel looked the same as no news. cell_effect gives each of the 10 event kinds its paint: a start white, an accepting review gold, a send-back amber, a lost lease red, a cancel grey. flash_alpha fades it over FLASH_MS, 1800 ms. A new cell rebuilds the scene, so cells_due places new cells in batches at most every 300 s." ]; pub const LESSON_TASKS : [27]str = [ "Set two sections missing and step through the tries; then mark the author told and see which column the issue goes to.", "Make the two red paths green by changing only facts that could be true; then leave a section missing and watch the gate.", "Show only failed tasks of every kind; then find which job state shows as dropped.", "Find the day a labelled low issue moves up; then remove the label and drag to day 60.", "Make a fifth issue critical and see where it lands; then label the unlabelled issue low.", "Drag the queue to 0 and back to 1; then find the candidates that are admitted at any length.", "Walk a task from none to accept; then make CI red at the ceiling and find the one way out.", "Mark the bee as not heard from and see where it moves; then drag the time past 2400 ms.", "Drag the wait from 0 to the cap and watch the bee's row change; then cut the platform drain to 1000 s.", "Find the fewest keys of 1 lane that keep up with 58 an hour; then cut the memory to 1000 MB.", "Find the wait count where the pause stops growing; then set 4 waits and find the second the row is due.", "Let the running check conclude green; then make the ruleset unreadable and watch the discounted red.", "Clear facts one by one from the start state and name each case you pass; then find a PR that is in no jam.", "Find the case whose action is wait for the base; then drag to 200 and read the action.", "Make every run cancelled; then move the failure before the merge base and look at the gate.", "Compare 429 with codes 1308 and 1312; then read what no answer at all is.", "Find the strike count where the rest stops growing; then switch to quota and read the rest.", "Mark key 2 as tried and see which key gets the ring; then set three keys that said 1305.", "Drag the keys from 0 to 100 and watch the credit meter; then find the second a probe may start.", "Find the costs that give exactly 1 token; then find the monthly price that buys 36 reels.", "Find the day the package month burns; then find the last day any batch is left.", "Find the two ways only a person can call an agent; then turn on all four and compare the senders.", "Find the gap at which agent B falls silent; then explain why C is silent too.", "Drag the /stop clock past 10 minutes; then tag the muted agent.", "Make the night pass with the issue open; then make one check unmeasured.", "Open the issue and see where the four finished claims go; then say what a closed issue hides.", "Tap the review cell and switch the verdict; then find the moment the flash is gone." ]; ; --- Claims -------------------------------------------------------------------------------- test the_course_is_three_cubed { assert LESSONS_PER_MODULE == 3; assert MODULE_COUNT == 9; assert LESSON_COUNT == 27; assert MODULE_COUNT * LESSONS_PER_MODULE == LESSON_COUNT; assert LESSON_COUNT == 3 * 3 * 3; } test it_starts_with_a_shaped_issue_and_ends_on_the_comb { assert MODULE_IDS[0] == "the-task"; assert LESSON_WIDGETS[0] == "hive-shape"; assert LESSON_SPECS[0] == "specs/queen/shaping.t27"; assert MODULE_IDS[8] == "night-and-the-board"; assert LESSON_WIDGETS[26] == "hive-cell"; assert LESSON_SPECS[26] == "specs/queen/hive.t27"; } test the_order_comes_before_the_bee_and_the_bee_before_its_review { assert MODULE_IDS[1] == "who-goes-next"; assert LESSON_SPECS[3] == "specs/queen/priority.t27"; assert MODULE_IDS[2] == "a-bees-life"; assert LESSON_SPECS[6] == "specs/queen/dispatch.t27"; assert MODULE_IDS[3] == "the-reviewer"; assert LESSON_WIDGETS[11] == "hive-gate"; } test the_jam_runs_the_review_jam_spec { assert MODULE_IDS[4] == "the-jam"; assert LESSON_SPECS[12] == "specs/automation/review-jam.t27"; assert LESSON_SPECS[13] == "specs/automation/review-jam.t27"; assert LESSON_WIDGETS[14] == "hive-master-red"; } test keys_then_money_then_agents { assert MODULE_IDS[5] == "keys"; assert LESSON_SPECS[17] == "specs/queen/key_failover.t27"; assert MODULE_IDS[6] == "credit-and-money"; assert LESSON_SPECS[19] == "specs/automation/token-wallet.t27"; assert MODULE_IDS[7] == "agents-together"; assert LESSON_SPECS[22] == "specs/automation/agent-hive-group.t27"; } test the_course_sends_nothing { assert SENDS_NOTHING == true; assert LOCALES[0] == "en"; assert LOCALES[1] == "ru"; }