chore: release v0.2.2 - #25
Merged
Merged
Conversation
) Picks up IPA-Patch/KIOU-Hook#2: fix(grpc): forward IL2CPP MethodInfo* and contain swap failures Resolves crashes around HttpMessageInvoker.SendAsync / HttpHeaders.Remove / HttpHeaders.TryAdd by adding the trailing MethodInfo* arg expected by IL2CPP, and hardens the x-user-id swap path with extra @try/@catch (id e) so login degrades to a stale x-user-id instead of aborting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude <noreply@anthropic.com>
* feat(dispatcher): wire HeaderProvider entry slot; bump KIOU-Hook
Wire the new HeaderProvider.SetOrUpdateHeader entry slot in KiouForge's
chinlan dispatcher and bump the KIOU-Hook submodule to carry the
catalog row and hook body.
Dispatcher gains one extern (KFHookHeaderProviderSetOrUpdate) and one
entry_slot assignment at KIOU_HOOK_SLOT_HEADER_PROVIDER_SET_OR_UPDATE_
HEADER. Nothing else in the dispatcher changes.
KIOU-Hook submodule bump brings:
* Static-method typedef fix for BackToTitleSequence.RunAsync,
RunResetUserDataSequenceAsync, and RunDeleteAccountSequenceAsync
(previously (ct)-only, now (ct, mi) with fn(NULL, NULL) at call
sites).
* Catalog + recipe + Hook/GrpcLogging.m rewrite moving the x-user-id
swap from HttpMessageInvoker.SendAsync to Project.Network.
HeaderProvider.SetOrUpdateHeader — a managed-only site upstream
of the Cysharp Yaha borrow that the SendAsync hook could not
survive.
Verified end-to-end on 1.0.2 build 12 chinlan (jailbroken, TrollStore-
installed IPA): account switch completes without crash, [HEADER]
x-user-id swapped fires, and the follow-up LoginReply / SelfProfile
return the target user (openUserId changes from 1054-1001-0520-9241
to 2620-3831-5122-4152 across the switch).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(makefile): add make deploy target + BUNDLE_ID_SUFFIX; bump shared
Add a make deploy target that builds the patched IPA, scps it to the
device, installs via trollstorehelper install force, and launches the
app. Kept separate from Theos's install:: so `make deploy` does not
also trigger the JB rootless .deb install as a side effect.
Introduce BUNDLE_ID_SUFFIX. Empty (default) leaves CFBundleIdentifier
untouched — the patched IPA overwrites the original app. Setting e.g.
BUNDLE_ID_SUFFIX=chinlan appends ".chinlan" to the bundle id at IPA
build time, so the patched IPA installs side-by-side with the
original App Store / Sideloadly copy of the same app.
INSTALLED_IPA_BUNDLE_ID composes the launch target from TARGET_BUNDLE_
ID + suffix automatically.
Related overrides (all .env-friendly):
* TROLLSTORE_HELPER — /var/jb/Applications/TrollStorePersistenceHelper.
app/trollstorehelper (stable rootless path)
* INSTALLED_IPA_BUNDLE_ID — TARGET_BUNDLE_ID + optional suffix
* DEVICE_USER — root
Requires the shared submodule bump so build_patched_ipa.sh honours
--bundle-id-suffix end-to-end.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(claude): add tweak crash repair agents and devcontainer tooling
Add specialized Claude agents, a fix-tweak skill, and crash collection script for KIOU-Hook Tweak diagnosis and repair. Update the devcontainer to support the workflow dependencies and runtime setup.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* chore(submodules): bump KIOU-Hook vendor revision
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(kiouforge): rename internal KF symbols to KIOU prefix
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* chore(submodules): bump KIOU-Hook vendor revision
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* chore(submodules): bump KIOU-Hook vendor revision
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* chore(submodules): bump KIOU-Hook vendor revision
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* chore(submodules): bump KIOU-Hook vendor revision
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
…#18) * fix(hooks): install KIOUAfkDisableAlwaysFalseInstall after AFK cave migration Bumps vendor/KIOU-Hook to 2ef91df to pick up KIOU-Hook PR #7, which retires the AFK_SITE inline patch on 1.0.2 and routes GameOrchestrator.IsAfkEnabled through a CAVE_ENTRY instead. Without a matching consumer-side install, the next `make chinlan` build would patch the cave in but leave its slot unpublished, so the first IsAfkEnabled call would BLR-jump to a null slot pointer and crash. Adds one line to Sources/KiouForge/Tweak.m — after the existing KIOUInstall* chain — that calls the convenience installer KIOUAfkDisableAlwaysFalseInstall(unityBase). The installer publishes a static `return false` hook body into the AFK cave slot, so IsAfkEnabled unconditionally reports "off" — matching the historic KiouForge behaviour the AFK_SITE inline patch delivered before the migration. No feature-flag storage or UI wiring involved — KiouForge's "AFK always off" stance is unchanged, only the transport swapped from inline patch to cave dispatch. Verified: `make chinlan` compiles + links + signs clean. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * refactor(naming): sweep leftover kf* / g_* identifiers to KIOU / s_ conventions The KF -> KIOU rename earlier this cycle only caught uppercase KF- followed-by-uppercase identifiers via `\bKF([A-Z])` regex. Lowercase `kf*` leftovers and one C-style `g_*` static file-local remained. Bring the last few into line so the tree stops carrying the retired "KiouForge-specific" prefix: Tweak.m - kfOnImageAdded -> KIOUOnImageAdded (static callback with the project prefix that matches every other exported identifier) - g_unityHooked -> s_unityHooked (static file-local — matches the KIOU-Hook `s_origXxx` pattern rather than the C-style `g_*` prefix which implies extern) - init -> KIOUForgeInit (the constructor was named generically enough to collide with anything else linking as `init`) - stale comment referencing `g_kfHookSlot` corrected to `g_inject_entry` (its actual name from KIOU-Hook) Kif/Writer.m - kf_resolveGameController -> KIOUResolveGameController Hook/SettingsUI.m - kfActiveWindow -> KIOUActiveWindow - Cell reuse identifiers `kf_account_row` / `kf_account_active` / `kf_force_register` -> `kiou_*` variants. Internal only; each is scoped to its UITableView subclass, no external reader. - Temporary export path `kf_accounts.json` (NSTemporaryDirectory) -> `kiou_accounts.json`. Temp files are recreated each session, so no user-visible migration. KIOU-Hook-owned externs `g_unityBase` and `g_inject_entry` stay as-is — they're part of the shared library's public API convention (the `g_*` prefix mirrors the KIOU-Hook side's declaration in KIOUHook.h) and renaming them belongs to a KIOU-Hook PR, not this one. Verified: `make chinlan` compiles + links + signs clean. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * chore(submodules): bump KIOU-Hook submodule Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(hooks): filter cave entries to published hook slots Limit KIOU-Hook patching to hook IDs KiouForge actually publishes so unpublished slots cannot produce NULL BLR crashes. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(hooks): adopt shared slot filtering from KIOU-Hook Remove the local hook allowlist now that the submodule handles slot filtering, and align KiouForge-only symbols back to the kf namespace. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(hooks): restrict IPA hook IDs for baseline bisection Limit the IPA build to the 16 baseline KIOU hook sites while bumping KIOU-Hook. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(hooks): restore shared hook catalog selection Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(submodule): bump KIOU-Hook to 23d7d4a (tools namespace fix) Baseline restore point before the AFK CAVE_ENTRY migration. 23d7d4a drops the empty tools/__init__.py from KIOU-Hook so the `tools` package name can PEP-420-merge with Kanade's shared/tools/. Prior to this bump `make ipa` failed at the extract-recipe step because `python -m tools.patch_macho` couldn't be found under the `tools/` rooted in KIOU-Hook. Behavior for the on-device tweak is unchanged — only build-time module resolution is affected. Verified: `make deploy` produces a launching KIOU with baseline KiouForge behavior (16 KIOU-Hook sites + inline AFK). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * feat(hooks): enable AFK suppress hook Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(kif): update helper RVAs for KIOU 1.0.2 Pin KIF helper callsites to dump.cs-verified 1.0.2 RVAs to avoid match-end crashes from stale 1.0.1 method addresses. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(submodule): bump KIOU-Hook to be4cc6a (observer slot fix) Picks up the HOOK_SLOT_RVA move from __DATA.__bss (0x8F90C80) to __DATA.__common (0x091E92B8). Without this bump, CPUStreamMode / AIMatchMode / OnlinePvPMode / LocalPvPMode / RecordReplayMode OnMatchEndAsync observers would fire into a slot that il2cpp has already overwritten with garbage and the process would die with a PC alignment fault at the cave BLR X16. Paired with 33e056c (fix(kif): update helper RVAs for KIOU 1.0.2) this is what took resign from "crash" to "kifu saved cleanly". Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * feat(kif): read player names from match mode state stores Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
* chore(submodule): bump KIOU-Hook to 2766e14 (master tip) KiouForge's develop was referencing be4cc6a on an unmerged branch that has since been deleted along with the observer-slot fix landing on master (KIOU-Hook#9). Bump the pointer to the merged commit (2766e14 fix(slots): move HOOK_SLOT_RVA from __bss to __common) so the reference lives on a durable ref instead of a stray branch tip. No source or behaviour change here — the actual observer-slot fix already shipped in commit f5d285f (KiouForge#18); this only stabilises the submodule SHA. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * chore(submodule): bump KIOU-Hook to 0b6814a Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(submodule): bump KIOU-Hook to 20271b3 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(submodule): bump KIOU-Hook and use afk disable installer Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(submodule): bump KIOU-Hook to a60df60 (installer rename) Picks up the KIOU-Hook rename from KIOUAfkDisableAlwaysFalseInstall to KIOUInstallAfkSuppressHook so the AFK installer matches the rest of the KIOUInstall*Hook API surface. Tweak.m updated to call the new name. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * chore(submodule): bump KIOU-Hook to e51f508 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(submodule): bump KIOU-Hook and allow KiouForge hook ids Pass the KiouForge hook allow-list into IPA packaging so KiouEditor catalog rows are filtered out before cave allocation. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs: plan kifu sqlite storage and in-app viewer Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Records the design for a Frida-driven smoke test that catches cave / hook / RVA regressions before they reach the device in practice. The plan covers a single happy-path flow — launch, login, CPU戦 start, resign, verify kifu saved + no crash — with room to layer on more modes later. No code changes yet. Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Three behaviour changes let `make deploy` work on TrollStore Lite
without a Persistence Helper:
1. `TROLLSTORE_HELPER` defaults to empty; the target SSH-discovers the
trollstorehelper binary at deploy time. Ranking prefers
`TrollStoreLite.app` over plain `TrollStore.app` and drops
`TrollStorePersistenceHelper.app` matches — on Lite that directory
is never installed, and a leftover from a previous non-Lite JB
session ships a helper whose entitlements have been invalidated,
which SIGKILLs on invocation (visible as ssh 255).
2. The IPA is staged in `/var/mobile/Documents/` (via
`REMOTE_STAGING_DIR`) rather than `/tmp/`. trollstorehelper runs
in a sandbox that cannot read `/tmp/`, so an IPA staged there is
rejected with return code 166 ("IPA does not exist or is not
accessible") even though the file is physically present.
3. After scp, the staged file is chowned to `mobile:mobile` so the
sandboxed helper can open it (root-owned staging paths are
readable by scp but not by the helper).
Non-Lite setups keep working. Operators who pin `TROLLSTORE_HELPER`
in `.env` skip discovery and are unaffected; the default `.env`
`THEOS_DEVICE_IP` / `DEVICE_USER` / etc. stay respected.
* 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>
Kanade b670411 -> 05f0753 (v0.3.0). Chinlan 6e3c214 -> 645a1dd, which brings IPASideLog, the unified '[TAG] verb: k=v' log shape, and a logserver that binds loopback only on the chinlan flavour so iOS' Local Network prompt stays out of scope. The old Chinlan pin was left dangling by an upstream force-push — it sits on neither master nor develop any more. Co-authored-by: tkgstrator <tkgstrator@users.noreply.github.com> Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Promotes the [Unreleased] entry covering KIOU 1.1.0 support, the THEOS_DEVICE_PORT deploy option, FPS log dedup, and the Kanade/Chinlan submodule bumps. control is already at 0.2.2, so only the changelog heading moves. The release workflow extracts its notes by matching '## [<version>]', so leaving the section under [Unreleased] would have published the "no CHANGELOG section" placeholder instead. 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
Ships v0.2.2 — KIOU 1.1.0 (CFBundleVersion 15) support, plus deploy and logging fixes.
Added
__TEXTgrew from0x8274000to0x94BC000, so no 1.0.2 address carries over.Changed
TARGET_VERSIONdefaults to1.1.0;1.0.1/1.0.2still build explicitly. The version now maps to KIOU-Hook'sKIOU_HOOK_TARGET_BUILDso the dylib and the recipe can't disagree about which addresses to bake in.Kif/Helpers.m.make deployacceptsTHEOS_DEVICE_PORT(iproxy-forwarded devices) and works on TrollStore Lite.8ab5868, Kanade v0.3.0, Chinlan645a1dd.Verification
verify_sites: 55/55 (1.1.0), 56/56 (1.0.2)RP_OFF_CURRENT_VALUEconfirmed via the opponent's real name in that KIFRelease mechanics
Merging this does not publish anything —
deployment.yamltriggers onv*tags, not on the master branch. Thev0.2.2tag is pushed separately after merge, which builds the.deb/.dylib/SHA256SUMSand publishes the GitHub Release. Notes are extracted from the## [0.2.2]CHANGELOG section added in #24.🤖 Generated with Claude Code