Files
Integration-kit/ci/core-ref.json
wtclaude 067804706e
Some checks failed
PR Checks / prose (pull_request) Successful in 11s
PR Checks / template (pull_request) Failing after 9s
docs(kit): pin core 1.12.0; chapter 5 teaches progress() and ctx.events.expired
The pin moves from 655fbf3f (1.10.0) to 0a37a44 (1.12.0, website#210),
past 1.11.0 (website#209), which it had skipped. Chapter 5 was read
again for both versions:

- 1.11.0: a thing the game ends on its own schedule is reported with
  ctx.events.expired and filed `expired`, not `orphaned`.
- 1.12.0: an action's optional progress(), the line on a public event
  page. It answers for one reader, cheaply, and costs a line rather
  than the page when it fails. "What to build, in order" gains it as
  step 7.

The template declares neither, so nothing it does changed meaning.
template/module.json's coreApi becomes ^1.12.0 for the equality check.

Checks run at the new pin:

- checkCoreApi, links, rename sites and chapter paths all pass.
- The template's import, swagger, build and externals checks pass.
- Tests pass: server 82, client 20, scripts 10 and 11.
- The template was loaded as `examplegame` into a real core of this
  code through core's own loader, and it registered.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-06 08:26:57 -05:00

75 lines
4.6 KiB
JSON

{
"repo": "https://gitea.whitlocktech.com/RunicGateway/website.git",
"branch": "main",
"ref": "0a37a44164ab107584b918e656651452b50bd4f3",
"why": [
"The core this kit is written against, pinned to a commit rather than a branch.",
"",
"2026-10-06: moved from 655fbf3f (1.10.0) to 0a37a44 (1.12.0, website#210),",
"past 1.11.0 (website#209), which this pin had skipped. Chapter 5 was read again",
"for both versions and gained two paragraphs:",
"- ctx.events.expired (1.11.0): a thing the game ends on its own schedule is",
" `expired`, not `orphaned`;",
"- an action's optional progress() (1.12.0): the live line on a public event",
" page, which answers for one reader.",
"The template declares neither, and nothing it does changed meaning. The real",
"core run below was repeated at this ref.",
"",
"Before that move:"
"This one is the EVENT SYSTEM cutover, the commit MODULE_API_VERSION 1.10.0",
"reached `main` on (website#199), and 1.10.0 is what template/module.json",
"declares. It moved here from 66bb3b9a (1.9.0, the engagement cutover) because",
"the event contract expanded the book by a whole chapter: a module now declares",
"what its game can DO on request -- event actions, budget dimensions, leases and",
"option sources -- where every earlier chapter taught only a read path and a",
"thing to announce.",
"",
"Moving this pin is the moment someone re-reads the chapters: CI asserts the",
"version template/module.json declares still equals this core's",
"MODULE_API_VERSION, so a contract bump turns this repo red on purpose",
"(MODULE_SYSTEM.md 2.11.1 d2, 2.10). Note what that means in the other",
"direction, because it is easy to misread as a safety net: the check clones",
"THIS ref, so a core that has moved past it does not turn the repo red on its",
"own. Nothing goes red until someone moves the pin. Between cutovers the kit is",
"not wrong, it is DATED - and this file is where the date is written down.",
"",
"This pin move is a REPAIR as well as a date. Chapter 5 landed (#10) declaring",
"^1.10.0 while this file still named a 1.9.0 core, so `main` has been red on",
"checkCoreApi since it merged -- deliberately, and stated in that PR, but the",
"red belongs to the window and not to the repo. This is the commit that was",
"always going to close it, and it could not be written until the events sha",
"existed on `main`. Same shape Teams phase 11 used.",
"",
"The mechanism earned its keep again here, and twice. Writing chapter 5 against",
"the event contract found that an idempotency key on a QUESTION makes every",
"later read permanently stale -- an at-most-once store answers a repeated key",
"with the ORIGINAL reply, so the template's second read of a value returned the",
"first read's answer for ever, and the module could not see a change it had just",
"made. It also found that a refusal's reason goes in `error`: core's classifier",
"reads no other name, so a refusal reported under `detail` reached an author as",
"a bare \"refused\". Neither was found by writing prose. Both were found by",
"running the template's real declarations through core's real registry and its",
"real envelopes through core's real dispatcher.",
"",
"That is also why this file's own instruction is not enough on its own. The",
"template job builds and tests the template against fakes and checks this",
"number; it does not load the module into core. A declaration a fake accepts",
"and core refuses would ship green, so a pin move is a run against a real core,",
"not just an edit here. It was run at THIS ref: core's real registries accepted",
"the template's budget, option source, lease and event action, and apply()",
"accepted the set.",
"",
"The branch said `edge` until 2026-08-12, when the module system cut over and",
"that branch was deleted (MODULE_SYSTEM.md 2.9). Two later workstreams cut an",
"`edge` of their own and this pin skipped both; the Event System cut a third,",
"and this pin skipped that too until it reached `main`. The kit is written",
"against what shipped, never against what is in flight. Nothing in CI reads the",
"branch field - it clones the repo and checks out the sha - which is why a wrong",
"label here would sit unnoticed. It is for the person deciding whether a newer",
"core is worth re-reading the book for.",
"",
"Same convention as Module-uo's ci/core-ref.json, deliberately - one file, one",
"sha, reviewable in a diff."
]
}