[{"data":1,"prerenderedAt":650},["ShallowReactive",2],{"navigation_docs":3,"-decisions-0014-release-per-module-tags-and-rc1":223,"-decisions-0014-release-per-module-tags-and-rc1-surround":645},[4,26,96,105,202],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":25},"Getting started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,15,20],{"title":11,"path":12,"stem":13,"icon":14},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F1.installation","i-lucide-download",{"title":16,"path":17,"stem":18,"icon":19},"The first app","\u002Fgetting-started\u002Ffirst-app","1.getting-started\u002F2.first-app","i-lucide-play",{"title":21,"path":22,"stem":23,"icon":24},"The first test","\u002Fgetting-started\u002Ffirst-test","1.getting-started\u002F3.first-test","i-lucide-flask-conical",false,{"title":27,"icon":28,"path":29,"stem":30,"children":31,"page":25},"Guide","i-lucide-book-open","\u002Fguide","2.guide",[32,37,42,47,52,57,62,67,72,77,81,86,91],{"title":33,"path":34,"stem":35,"icon":36},"Components","\u002Fguide\u002Fcomponents","2.guide\u002F01.components","i-lucide-component",{"title":38,"path":39,"stem":40,"icon":41},"Inputs and forms","\u002Fguide\u002Finputs-and-forms","2.guide\u002F02.inputs-and-forms","i-lucide-text-cursor-input",{"title":43,"path":44,"stem":45,"icon":46},"Scrolling and viewports","\u002Fguide\u002Fscrolling","2.guide\u002F03.scrolling","i-lucide-scroll-text",{"title":48,"path":49,"stem":50,"icon":51},"Overlays and layers","\u002Fguide\u002Foverlays","2.guide\u002F04.overlays","i-lucide-layers",{"title":53,"path":54,"stem":55,"icon":56},"Styles and theme","\u002Fguide\u002Fstyles","2.guide\u002F05.styles","i-lucide-palette",{"title":58,"path":59,"stem":60,"icon":61},"Composables","\u002Fguide\u002Fcomposables","2.guide\u002F06.composables","i-lucide-puzzle",{"title":63,"path":64,"stem":65,"icon":66},"Widgets","\u002Fguide\u002Fwidgets","2.guide\u002F07.widgets","i-lucide-blocks",{"title":68,"path":69,"stem":70,"icon":71},"The assistant","\u002Fguide\u002Fassistant","2.guide\u002F08.assistant","i-lucide-message-square",{"title":73,"path":74,"stem":75,"icon":76},"The same app on the web","\u002Fguide\u002Fweb","2.guide\u002F09.web","i-lucide-globe",{"title":78,"path":79,"stem":80,"icon":24},"Testing","\u002Fguide\u002Ftesting","2.guide\u002F10.testing",{"title":82,"path":83,"stem":84,"icon":85},"Running and packaging","\u002Fguide\u002Fpackaging","2.guide\u002F11.packaging","i-lucide-package",{"title":87,"path":88,"stem":89,"icon":90},"The terminal contract","\u002Fguide\u002Fterminal","2.guide\u002F12.terminal","i-lucide-square-terminal",{"title":92,"path":93,"stem":94,"icon":95},"Benchmarks","\u002Fguide\u002Fbenchmarks","2.guide\u002F13.benchmarks","i-lucide-gauge",{"title":97,"icon":98,"path":99,"stem":100,"children":101,"page":25},"AI and agents","i-lucide-bot","\u002Fai","3.ai",[102],{"title":97,"path":103,"stem":104,"icon":98},"\u002Fai\u002Fagents","3.ai\u002F1.agents",{"title":106,"icon":107,"path":108,"stem":109,"children":110},"Decisions","i-lucide-scale","\u002Fdecisions","4.decisions",[111,114,118,122,126,130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,194,198],{"title":112,"path":108,"stem":113,"icon":46},"All decisions","4.decisions\u002Findex",{"title":115,"path":116,"stem":117},"0001. kyo-ui is the DSL","\u002Fdecisions\u002F0001-kyo-ui-is-the-dsl","4.decisions\u002F0001-kyo-ui-is-the-dsl",{"title":119,"path":120,"stem":121},"0002. jatatui renders the cells","\u002Fdecisions\u002F0002-jatatui-renders-the-cells","4.decisions\u002F0002-jatatui-renders-the-cells",{"title":123,"path":124,"stem":125},"0003. Pin Kyo 1.0.0-RC7 and JDK 25","\u002Fdecisions\u002F0003-pin-kyo-rc7-and-jdk-25","4.decisions\u002F0003-pin-kyo-rc7-and-jdk-25",{"title":127,"path":128,"stem":129},"0004. Public Kyo APIs only","\u002Fdecisions\u002F0004-public-kyo-apis-only","4.decisions\u002F0004-public-kyo-apis-only",{"title":131,"path":132,"stem":133},"0005. A SOFT frame contract and an own watcher loop","\u002Fdecisions\u002F0005-soft-frame-contract-and-own-watcher-loop","4.decisions\u002F0005-soft-frame-contract-and-own-watcher-loop",{"title":135,"path":136,"stem":137},"0006. Purity: edge files, lint and a pure painter","\u002Fdecisions\u002F0006-purity-edge-files-and-lint","4.decisions\u002F0006-purity-edge-files-and-lint",{"title":139,"path":140,"stem":141},"0007. Compiler flags from sbt-tpolecat","\u002Fdecisions\u002F0007-compiler-flags-from-sbt-tpolecat","4.decisions\u002F0007-compiler-flags-from-sbt-tpolecat",{"title":143,"path":144,"stem":145},"0008. The artifact split: runner, app, testkit and core","\u002Fdecisions\u002F0008-artifact-split-runner-app-testkit-core","4.decisions\u002F0008-artifact-split-runner-app-testkit-core",{"title":147,"path":148,"stem":149},"0009. tui4s-use and tui4s-widgets, cross-built","\u002Fdecisions\u002F0009-use-and-widgets-cross-built","4.decisions\u002F0009-use-and-widgets-cross-built",{"title":151,"path":152,"stem":153},"0010. The flagship assistant is the blueprint of a real app","\u002Fdecisions\u002F0010-the-flagship-assistant-as-blueprint","4.decisions\u002F0010-the-flagship-assistant-as-blueprint",{"title":155,"path":156,"stem":157},"0011. The web target: a standalone Scala.js app and one theme","\u002Fdecisions\u002F0011-web-target-standalone-scalajs-and-one-theme","4.decisions\u002F0011-web-target-standalone-scalajs-and-one-theme",{"title":159,"path":160,"stem":161},"0012. The documentation is example-first","\u002Fdecisions\u002F0012-documentation-is-example-first","4.decisions\u002F0012-documentation-is-example-first",{"title":163,"path":164,"stem":165},"0013. Benchmarks in the repository, with their own build","\u002Fdecisions\u002F0013-benchmarks-in-repo-with-own-build","4.decisions\u002F0013-benchmarks-in-repo-with-own-build",{"title":167,"path":168,"stem":169},"0014. Release per module, by tag, as 0.1.0-RC1","\u002Fdecisions\u002F0014-release-per-module-tags-and-rc1","4.decisions\u002F0014-release-per-module-tags-and-rc1",{"title":171,"path":172,"stem":173},"0015. Packaging: the AOT cache in the start scripts, native-image as an option","\u002Fdecisions\u002F0015-packaging-aot-cache-and-native-image","4.decisions\u002F0015-packaging-aot-cache-and-native-image",{"title":175,"path":176,"stem":177},"0016. Process: lean mode and agent roles","\u002Fdecisions\u002F0016-process-lean-mode-and-agent-roles","4.decisions\u002F0016-process-lean-mode-and-agent-roles",{"title":179,"path":180,"stem":181},"0017. Deferred: templates, mouse, the kitty keyboard protocol and Windows","\u002Fdecisions\u002F0017-deferred-templates-mouse-and-kitty","4.decisions\u002F0017-deferred-templates-mouse-and-kitty",{"title":183,"path":184,"stem":185},"0018. pini4s is a vendored Git submodule","\u002Fdecisions\u002F0018-pini4s-as-a-vendored-submodule","4.decisions\u002F0018-pini4s-as-a-vendored-submodule",{"title":187,"path":188,"stem":189},"0019. Upstream issues are drafts that the user posts","\u002Fdecisions\u002F0019-upstream-kyo-issues-as-drafts","4.decisions\u002F0019-upstream-kyo-issues-as-drafts",{"title":191,"path":192,"stem":193},"0020. Release from the Actions form","\u002Fdecisions\u002F0020-release-from-the-actions-form","4.decisions\u002F0020-release-from-the-actions-form",{"title":195,"path":196,"stem":197},"0021. The rulebook is CONTRIBUTING.md","\u002Fdecisions\u002F0021-the-rulebook-is-contributing-md","4.decisions\u002F0021-the-rulebook-is-contributing-md",{"title":199,"path":200,"stem":201},"0022. The logo is text","\u002Fdecisions\u002F0022-the-logo-is-text","4.decisions\u002F0022-the-logo-is-text",{"title":203,"icon":204,"path":205,"stem":206,"children":207,"page":25},"Project","i-lucide-compass","\u002Fproject","5.project",[208,213,218],{"title":209,"path":210,"stem":211,"icon":212},"Roadmap","\u002Fproject\u002Froadmap","5.project\u002F1.roadmap","i-lucide-map",{"title":214,"path":215,"stem":216,"icon":217},"Contributing","\u002Fproject\u002Fcontributing","5.project\u002F2.contributing","i-lucide-git-pull-request",{"title":219,"path":220,"stem":221,"icon":222},"Security","\u002Fproject\u002Fsecurity","5.project\u002F3.security","i-lucide-shield",{"id":224,"title":167,"body":225,"description":638,"extension":639,"links":640,"meta":641,"navigation":642,"path":168,"seo":643,"stem":169,"__hash__":644},"docs\u002F4.decisions\u002F0014-release-per-module-tags-and-rc1.md",{"type":226,"value":227,"toc":627},"minimark",[228,233,242,246,249,253,329,333,490,494,576,580,612,616],[229,230,232],"h2",{"id":231},"status","Status",[234,235,236,237,241],"p",{},"Accepted. The removals of zio, cats and useSignal landed on 2026-10-20 (L6). The trigger of the release changed on 2026-10-20: see ",[238,239,240],"a",{"href":192},"ADR 0020",".",[229,243,245],{"id":244},"date","Date",[234,247,248],{},"2026-09-30 (per-module versions), 2026-10-17 (D12), 2026-10-20 (the removals).",[229,250,252],{"id":251},"context","Context",[254,255,256,260,267,270,286,319],"ul",{},[257,258,259],"li",{},"The user wants independent versions per module, one command to release one module, and no release of an integration against an unreleased core.",[257,261,262,263,266],{},"Kyo and kyo-ui are at 1.0.0-RC7 (",[238,264,265],{"href":124},"ADR 0003","). A tui4s 0.1.0 final on an RC base would promise more than it can keep.",[257,268,269],{},"A Maven Central artifact cannot be removed. The release workflow publishes on a tag push.",[257,271,272,273,277,278,281,282,285],{},"coursier (and sbt) put ",[274,275,276],"code",{},"M"," below ",[274,279,280],{},"alpha"," and ",[274,283,284],{},"beta","; Maven puts it above.",[257,287,288,289,281,292,295,296,299,300,303,304,307,308,311,312,307,315,318],{},"The modules ",[274,290,291],{},"zio",[274,293,294],{},"cats"," have only a ",[274,297,298],{},"build.sbt"," and a ",[274,301,302],{},"compat.sbt",", no source. The ZIO and Cats Effect facades of the spec (",[274,305,306],{},"tui4s.interop.zio",", ",[274,309,310],{},"tui4s.interop.cats",") were built only on the old DSL (branches ",[274,313,314],{},"feat\u002Fzio",[274,316,317],{},"feat\u002Fcats","), never on kyo-ui.",[257,320,321,324,325,328],{},[274,322,323],{},"Hooks.useSignal"," only renames ",[274,326,327],{},"Signal.initRef"," and is deprecated since P1b. No released user exists.",[229,330,332],{"id":331},"decision","Decision",[254,334,335,365,383,400,407,416,426,451,470],{},[257,336,337,338,341,342,307,345,307,348,307,351,307,354,307,357,360,361,364],{},"Each module has its own version and tag ",[274,339,340],{},"\u003Cmodule>-v\u003Csemver>"," (",[274,343,344],{},"runner",[274,346,347],{},"app",[274,349,350],{},"testkit",[274,352,353],{},"core",[274,355,356],{},"use",[274,358,359],{},"widgets","). sbt-ci-release and ",[274,362,363],{},"ModuleVersioning"," set the version; no build file sets it.",[257,366,367,368,370,371,374,375,378,379,382],{},"CHANGED by ",[238,369,240],{"href":192}," (2026-10-20): a release starts from the Actions form on ",[274,372,373],{},"main",", the checks run before the tag, and one approval of the environment publishes all the modules of the run. The items below on ",[274,376,377],{},"scripts\u002Frelease.sh",", on ",[274,380,381],{},"--yes"," and on the tag patterns of the environment describe the old trigger. ",[257,384,385,388,389,391,392,391,394,391,396,399],{},[274,386,387],{},"scripts\u002Frelease.sh \u003Cmodule> \u003Cversion>"," checks the module, the clean tree, CI, the version order (Maven order: ",[274,390,280],{}," \u003C ",[274,393,284],{},[274,395,276],{},[274,397,398],{},"RC"," \u003C final) and unreleased dependencies, then pushes one tag. Release order: runner, app and testkit, core; use, widgets.",[257,401,402,403,406],{},"The first release is ",[274,404,405],{},"0.1.0-RC1"," while Kyo is an RC (D12). Windows is experimental.",[257,408,409,410,412,413,241],{},"Early-semver with sbt-version-policy: each module has a ",[274,411,302],{}," intention; CI runs ",[274,414,415],{},"versionPolicyCheck",[257,417,418,419,422,423,425],{},"An agent runs ",[274,420,421],{},"--dry-run"," at any time, but needs a human's approval in the chat to push a tag, and never uses ",[274,424,381],{}," on its own.",[257,427,428,429,341,432,307,435,307,438,307,441,307,444,307,447,450],{},"A human adds each tag pattern to the GitHub environment ",[274,430,431],{},"maven-central",[274,433,434],{},"runner-v*",[274,436,437],{},"app-v*",[274,439,440],{},"testkit-v*",[274,442,443],{},"core-v*",[274,445,446],{},"use-v*",[274,448,449],{},"widgets-v*",").",[257,452,453,454,281,456,458,459,281,465,450],{},"NEW (2026-10-20): the empty ",[274,455,291],{},[274,457,294],{}," modules leave the build, the release script, the workflow and the docs before the first release. They come back as modules when they exist (issues ",[238,460,464],{"href":461,"rel":462},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F18",[463],"nofollow","#18",[238,466,469],{"href":467,"rel":468},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F19",[463],"#19",[257,471,472,473,476,477,480,481,483,484,487,488,241],{},"NEW (2026-10-20): the deprecated hook ",[274,474,475],{},"useSignal"," is removed before 0.1. The state primitive gets the short name ",[274,478,479],{},"tui4s.initSig(initial)"," in the runner's package (user decision of 2026-10-20). The name folds ",[274,482,327],{}," into one word, so there is one thing to remember, and it still reads as Kyo's own name. It is a primitive with no lifetime, so it is not a hook. A terminal app gets it with tui4s-core alone and ",[274,485,486],{},"import tui4s.{Tui, TuiApp, initSig}","; shared cross-platform code calls ",[274,489,327],{},[229,491,493],{"id":492},"alternatives-considered","Alternatives considered",[254,495,496,503,509,515,521,530,570],{},[257,497,498,502],{},[499,500,501],"strong",{},"One version for all modules."," Rejected by the user (2026-09-30): independent versions.",[257,504,505,508],{},[499,506,507],{},"0.1.0 final."," Rejected by D12: Kyo is an RC.",[257,510,511,514],{},[499,512,513],{},"Keep the zio and cats placeholders as \"planned\"."," Rejected: a placeholder module in the build, the release script and the docs helps nobody and overclaims.",[257,516,517,520],{},[499,518,519],{},"Publish empty zio and cats artifacts."," Rejected by D12 (\"no empty zio\u002Fcats artifacts\").",[257,522,523,529],{},[499,524,525,526,528],{},"Keep ",[274,527,475],{}," deprecated for one release."," Rejected: no released user exists, and a deprecated alias in a first release is clutter.",[257,531,532,535,536,307,539,307,542,307,545,307,548,551,552,554,555,558,559,562,563,565,566,569],{},[499,533,534],{},"Another name for the state primitive:"," ",[274,537,538],{},"ref",[274,540,541],{},"sig",[274,543,544],{},"signal",[274,546,547],{},"createSignal",[274,549,550],{},"initRef",", or a ",[274,553,475],{}," in ",[274,556,557],{},"tui4s.Hooks"," that is not deprecated. Rejected by the user (2026-10-20) for ",[274,560,561],{},"initSig",". ",[274,564,538],{}," is the usual name of a local ",[274,567,568],{},"SignalRef"," value, and it reads as Vue's type.",[257,571,572,575],{},[499,573,574],{},"Release without a human gate."," Rejected: a public artifact cannot be removed.",[229,577,579],{"id":578},"consequences","Consequences",[254,581,582,585,588,591,603],{},[257,583,584],{},"Good: a fix in one module releases only that module.",[257,586,587],{},"Good: the first release claims only what exists.",[257,589,590],{},"Bad: several tags per release, pushed one at a time (GitHub ignores a push of more than three tags).",[257,592,593,594,596,597,599,600,602],{},"Bad: ",[274,595,276],{}," versions after ",[274,598,280],{}," or ",[274,601,284],{}," of the same version sort wrong in coursier; the rule says not to release them.",[257,604,605,606,307,609,450],{},"Bad: ZIO and Cats Effect users get no integration in 0.1; the facade design (a hand-written DSL, the vendored Cats bridge) waits for its issue (",[238,607,464],{"href":461,"rel":608},[463],[238,610,469],{"href":467,"rel":611},[463],[229,613,615],{"id":614},"references","References",[254,617,618,621,624],{},[257,619,620],{},"Decision log: first, third and fourth rounds; sixth round (ZIO and Cats order); fifteenth round (D12).",[257,622,623],{},"Roadmap: D12, L6. Handoff: \"INSTRUCTION (user, 2026-10-20)\".",[257,625,626],{},"CONTRIBUTING.md: \"Releasing\", \"Compatibility and versioning\". ",{"title":628,"searchDepth":629,"depth":629,"links":630},"",2,[631,632,633,634,635,636,637],{"id":231,"depth":629,"text":232},{"id":244,"depth":629,"text":245},{"id":251,"depth":629,"text":252},{"id":331,"depth":629,"text":332},{"id":492,"depth":629,"text":493},{"id":578,"depth":629,"text":579},{"id":614,"depth":629,"text":615},"Each module has its own version and tag; the first release is 0.1.0-RC1 while Kyo is an RC; a human approves every tag; the empty zio and cats modules and the deprecated useSignal go before 0.1.","md",null,{},true,{"title":167,"description":638},"nYS1X5DSbYasSpiGGGWSVF7dRNUoXmADHqkxWZ15tB4",[646,648],{"title":163,"path":164,"stem":165,"description":647,"children":-1},"The comparison lives in bench\u002F with its own sbt build and other languages in bench\u002Fimpl\u002F\u003Clanguage>; its headline is compactness, expressiveness, correctness and resource management, and performance is published honestly on its own page.",{"title":171,"path":172,"stem":173,"description":649,"children":-1},"The JVM start scripts have the startup flags by default and use a JDK 25 AOT cache after one run of bin\u002Faot-train; tui4s-runner carries native-image metadata for the crossterm JNI, a script builds a native image, and CI smoke-tests it on GraalVM Community.",1792528757055]