feat: support KIOU 1.1.0 (build 15) - #22
Merged
Merged
Conversation
__TEXT grew from 0x8274000 to 0x94BC000 in 1.1.0, so not one 1.0.2 address survives — the old dylib branches into arbitrary code on launch. TARGET_VERSION now defaults to 1.1.0 and maps to KIOU-Hook's KIOU_HOOK_TARGET_BUILD, so the dylib and the recipe can't disagree about which addresses to bake in; an unknown version is an error rather than a silent fallback to whatever the catalog defaults to. The five direct-call RVAs the KIF pipeline uses move from hardcoded defines to the KIOU-Hook catalog, so they track TARGET_VERSION like every other site instead of needing a hand edit per release. Every struct offset the KIF pipeline reads is unchanged from 1.0.2, confirmed by diffing the two dump.cs files. The one offset a dump can't confirm — RP_OFF_CURRENT_VALUE, which the dumper reports as 0x0 for every generic instantiation — was verified on-device: the KIF from an online match carries the opponent's real name, not the placeholder it falls back to when that offset is wrong. Kanade moves to develop, which carries the verify_sites overload resolution and the caves.py placeholder rows 1.1.0 needs (1.1.0 has a recipe row whose method no longer exists in the build). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The deploy target assumed the device answers on port 22. That holds for a device on the LAN, but not when it is reached through an iproxy forward on the host (THEOS_DEVICE_IP=host.docker.internal) — there port 22 is the host's own sshd, so scp lands the IPA on the wrong machine and the install silently targets nothing. Defaults to 22, so LAN setups are unaffected. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
KIOU re-applies its own frame-rate target every ~5 s, so the override logged an identical line each time — 198 of 242 lines in one session, burying everything else in the log. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This was referenced Aug 1, 2026
Merged
tkgstrator
added a commit
that referenced
this pull request
Aug 2, 2026
* feat: support KIOU 1.1.0 (build 15) __TEXT grew from 0x8274000 to 0x94BC000 in 1.1.0, so not one 1.0.2 address survives — the old dylib branches into arbitrary code on launch. TARGET_VERSION now defaults to 1.1.0 and maps to KIOU-Hook's KIOU_HOOK_TARGET_BUILD, so the dylib and the recipe can't disagree about which addresses to bake in; an unknown version is an error rather than a silent fallback to whatever the catalog defaults to. The five direct-call RVAs the KIF pipeline uses move from hardcoded defines to the KIOU-Hook catalog, so they track TARGET_VERSION like every other site instead of needing a hand edit per release. Every struct offset the KIF pipeline reads is unchanged from 1.0.2, confirmed by diffing the two dump.cs files. The one offset a dump can't confirm — RP_OFF_CURRENT_VALUE, which the dumper reports as 0x0 for every generic instantiation — was verified on-device: the KIF from an online match carries the opponent's real name, not the placeholder it falls back to when that offset is wrong. Kanade moves to develop, which carries the verify_sites overload resolution and the caves.py placeholder rows 1.1.0 needs (1.1.0 has a recipe row whose method no longer exists in the build). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * build(deploy): accept THEOS_DEVICE_PORT The deploy target assumed the device answers on port 22. That holds for a device on the LAN, but not when it is reached through an iproxy forward on the host (THEOS_DEVICE_IP=host.docker.internal) — there port 22 is the host's own sshd, so scp lands the IPA on the wrong machine and the install silently targets nothing. Defaults to 22, so LAN setups are unaffected. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(hooks): log FPS overrides only on transition KIOU re-applies its own frame-rate target every ~5 s, so the override logged an identical line each time — 198 of 242 lines in one session, burying everything else in the log. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: tkgstrator <tkgstrator@users.noreply.github.com> Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Brings KiouForge up to KIOU 1.1.0.
__TEXTgrew from0x8274000to0x94BC000in that build, so not one 1.0.2 address survives — the old dylib branches into arbitrary code on launch.TARGET_VERSIONdefaults to1.1.0;1.0.1/1.0.2still build by passing it explicitly. The Makefile maps the version to KIOU-Hook'sKIOU_HOOK_TARGET_BUILDso the dylib and the recipe can't disagree about which addresses to bake in, and errors on an unknown version rather than silently falling back to whatever the catalog defaults to.GetUSIText,ToSFEN,ParseUSI,KIFWriteOptions..ctor,KIFWriter.Write) move from hardcoded defines inKif/Helpers.mto the KIOU-Hook catalog, so they trackTARGET_VERSIONlike every other site instead of needing a hand edit per release.make deployacceptsTHEOS_DEVICE_PORT— needed when the device is reached through an iproxy forward on the host, where port 22 is the host's own sshd rather than the phone. Defaults to 22, so LAN setups are unaffected. Builds on the helper discovery from feat(deploy): support TrollStore Lite in make deploy #21.8ab5868(per-versionrva/headers,recipes/v1_1_0.py), Kanade → develop via feat(build_patched_ipa): --bundle-id-suffix flag Kanade#21.Struct offsets
Every offset the KIF pipeline reads is unchanged between 1.0.2 and 1.1.0 — verified by diffing the two
dump.csfiles acrossGameController,MatchConfig,PlayerInfo,GameStateStore,OnlinePvPMode,TimeControlConfig,ShogiGameAdapter, eachIMatchMode's_gameAdapter,KIFWriteOptions, andSyncSearchResult. No source change needed.The one offset a dump can't confirm is
RP_OFF_CURRENT_VALUE— the dumper reports offset 0x0 for everyReactiveProperty<T>instantiation. Verified on-device instead; see below.Why Kanade moves to develop
The old pin sat on
feat/bundle-id-suffix, which forked before Kanade #17-#19 and so lacked two things 1.1.0 needs:verify_sitesoverload resolution (5 of 56 sites fail to resolve without it) andcaves.pyplaceholder rows, which 1.1.0 requires becauseBeginnerSupportEvaluator.EnsureInitializedLockedis gone from the build. Kanade#21 rebuilt--bundle-id-suffixon top of develop so the side-by-side install path still works from the new pin.Test plan
verify_sites— 55/55 (1.1.0), 56/56 (1.0.2). 1.1.0 is 55 because theEnsureInitializedLockedrow is a placeholder.make ipafor both versions — 17 sites patched, no cave overflowmake ipa BUNDLE_ID_SUFFIX=chinlan→com.neconome.shogi.chinlan; no rewrite without the suffixTARGET_VERSIONfails the build instead of silently mis-targetingTARGET_VERSION=1.0.2cave_start=0x94b8024 count=56at startup — the 1.1.0 geometryx-user-idheader swap, and profile fetch all resolveRP_OFF_CURRENT_VALUEconfirmed — the KIF carries the opponent's real name (後手:パウ), not theプレイヤーplaceholder it falls back to when that offset is wrong🤖 Generated with Claude Code