Skip to content

chore: release v0.2.2 - #25

Merged
tkgstrator merged 9 commits into
masterfrom
develop
Aug 2, 2026
Merged

chore: release v0.2.2#25
tkgstrator merged 9 commits into
masterfrom
develop

Conversation

@tkgstrator

Copy link
Copy Markdown
Contributor

Summary

Ships v0.2.2 — KIOU 1.1.0 (CFBundleVersion 15) support, plus deploy and logging fixes.

Added

  • KIOU 1.1.0 support. All 17 hook sites re-verified against the 1.1.0 Mach-O. __TEXT grew from 0x8274000 to 0x94BC000, so no 1.0.2 address carries over.

Changed

  • TARGET_VERSION defaults to 1.1.0; 1.0.1 / 1.0.2 still build explicitly. The version now maps to KIOU-Hook's KIOU_HOOK_TARGET_BUILD so the dylib and the recipe can't disagree about which addresses to bake in.
  • The KIF pipeline's five direct-call RVAs resolve through the KIOU-Hook catalog instead of being pinned in Kif/Helpers.m.
  • make deploy accepts THEOS_DEVICE_PORT (iproxy-forwarded devices) and works on TrollStore Lite.
  • FPS override logging reports transitions only.
  • Submodules: KIOU-Hook 8ab5868, Kanade v0.3.0, Chinlan 645a1dd.

Verification

Release mechanics

Merging this does not publish anything — deployment.yaml triggers on v* tags, not on the master branch. The v0.2.2 tag is pushed separately after merge, which builds the .deb / .dylib / SHA256SUMS and publishes the GitHub Release. Notes are extracted from the ## [0.2.2] CHANGELOG section added in #24.

🤖 Generated with Claude Code

tkgstrator and others added 9 commits June 26, 2026 20:22
)

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>
@tkgstrator
tkgstrator merged commit b0772b9 into master Aug 2, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant