Звіт у форматі JSON машиночитний
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 5162,
"has_wiki": false,
"homepage": null,
"languages": {
"C++": 1206682,
"AIDL": 1045,
"CMake": 6901,
"Shell": 69960,
"Kotlin": 1276932
},
"pushed_at": "2026-07-30T20:54:43Z",
"created_at": "2025-05-22T22:54:40Z",
"owner_type": "User",
"updated_at": "2026-08-01T03:49:34Z",
"description": "An Xposed module focused on privacy protection, restricting unnecessary access to sensitive device data and minimizing user tracking through API abuse",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "master",
"license_spdx_raw": "MIT",
"primary_language": "Kotlin",
"significant_languages": [
"Kotlin",
"C++"
]
},
"owner": {
"blog": "https://dddqmmx.github.io/",
"name": "PaulPerkenstein",
"type": "User",
"login": "dddqmmx",
"company": "Workers' Party of Korea",
"location": "Pyongyang",
"followers": 3,
"avatar_url": "https://avatars.githubusercontent.com/u/58079930?v=4",
"created_at": "2019-11-22T14:34:46Z",
"is_verified": null,
"public_repos": 15,
"account_age_days": 2445
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v0.4.0-experimental",
"kind": "prerelease",
"published_at": "2026-06-27T20:16:44Z"
},
{
"tag": "v0.3.1-experimental",
"kind": "prerelease",
"published_at": "2026-05-25T05:30:59Z"
},
{
"tag": "v0.2.0-experimental",
"kind": "prerelease",
"published_at": "2026-05-16T06:51:04Z"
},
{
"tag": "v0.1.2-alpha",
"kind": "prerelease",
"published_at": "2026-04-27T20:45:31Z"
},
{
"tag": "v0.1.1-alpha",
"kind": "prerelease",
"published_at": "2026-04-26T11:43:29Z"
}
],
"recent_commits": [
{
"oid": "98acb6bda950fc66688b98ee53c0efcd4ad11fdd",
"body": "- Add `FuckVpnStatus` hook to intercept `ConnectivityService`, hiding VPN transport, tunnel interfaces, and proxy state from unauthorized callers.\n- Add `FuckAppLocale` hook to spoof per-application language settings via `LocaleManagerService`.\n- Update `FuckSettingsProvider` to hide always-on VPN c\n[…]\ndata persistence for global and per-app timezone and language overrides.\n- Implement reusable UI components including `LabelledDropdown` and `SearchablePickerDialog` for timezone and locale selection.",
"is_bot": false,
"headline": "feat(hook): implement VPN status and system setting spoofing",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-30T20:54:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "72cf746522ed1cbfcbc1f3fb043ecb5b217d5ddf",
"body": "Migrate the package list configuration, custom selection, and template management screens to Jetpack Compose, unifying app-listing logic and removing legacy View-based infrastructure.\n\n- Replace `PackageListConfigActivity`, `PackageCustomListActivity`, and `PackageTemplateManagerActivity` with Compo\n[…]\nens to utilize the new shared components.\n- Remove obsolete XML layouts, menus, RecyclerView adapters, and UI models.\n- Standardize template management dialogs and interaction patterns across screens.",
"is_bot": false,
"headline": "refactor(ui): migrate package visibility management to Jetpack Compose",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-29T14:09:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c5337b7e6ba92370ae337bcb326e634386e8f7ad",
"body": "- Add a new \"System Status\" category to the home screen featuring VPN Status and System Setting items.\n- Create `VpnStatusConfigActivity` and `SystemSettingConfigActivity` as entry points for the new features.\n- Update string resources and icons to support the new system status category.",
"is_bot": false,
"headline": "feat(ui): add system status section and configuration activities",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-27T09:44:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e20fb0fef874fc719aad996b04d47f532fb1e1a2",
"body": "Refactor/code quality",
"is_bot": false,
"headline": "Merge pull request #5 from dddqmmx/refactor/code-quality",
"author_name": "PaulPerkenstein",
"author_login": "dddqmmx",
"committed_at": "2026-07-27T06:54:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "257f6f69bf5265f1681d83e282a8042dce02e270",
"body": "…lock clipboard\n\nFour fixes across the native layer and its contract with the app.\n\n1. config.json no longer carries nine dead payloads.\n The *ConfigSnapshot values were read by nobody: six were parsed into\n SubmoduleConfig fields that have exactly one reference each -- the\n read_string() that\n[…]\napshot-removal is pinned by a new test). Runtime behaviour of 2 and 4 is\nnot covered by the JVM suite and wants a device smoke-test.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(submodule): honour the design constraint, shrink config.json, unb…",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-26T17:20:37Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2c0a280c0a23e296342dcf044681f99e695a95e3",
"body": "Both consumers of config.json hard-reject it above 64 KiB, and both fail\nopen when they do. submodule_config.cpp's apply_json_config returns false,\nso ArirangZygisk keeps its compiled-in defaults -- enabled,\ndevice_info_enabled and sensor_config_enabled are all false there.\nmodule/lib/common.sh skip\n[…]\nping them from the file would remove most of the size risk.\n\nVerified: app debug + tests (74) green, :submodule:packageModule green.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(config): surface the config.json size limit the submodule enforces",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-26T17:10:00Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "650296c1562b8fe9300a855874c52a1c6bbb14cf",
"body": "ConfirmDialogActivity is launchMode=\"singleInstance\" but never overrode\nonNewIntent, so concurrent requests were delivered to the running instance\nwithout onCreate running again and getIntent() kept returning the *first*\nrequest forever. Every path here resolved the ResultReceiver by re-reading\nthat\n[…]\nified: debug + release build, 74 tests green. Concurrency behaviour\nitself is not covered by the JVM suite and wants a device check.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(clipboard): stop dropping concurrent consent prompts",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-26T17:03:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7ef38860d16b726653672ce2cfe6370ab7864aae",
"body": "…ath costs\n\nLocationProviderManager.getLastLocation* resolved the profile globally,\nignoring config.perPackage. LocationManagerService delegates to it inside\nthe caller's own Binder transaction, so that after-hook ran first and\noverwrote the result with the default profile; the LMS-level hook, which\n[…]\nnchanged\n check now happens against the snapshot string before any lock or parse.\n\nVerified: debug + release build, 74 tests green.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(location,packagelist): honour per-package opt-out; drop two hot-p…",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-26T17:01:20Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "168b5466593a81ef51d1a3d19bb18a46e141a04b",
"body": "ArirangService's three config methods let ConfigValidationException escape.\nOn the oneway readConfigAsync that is worst: Binder swallows the exception,\nso the callback never fires and the client cannot tell. ArirangClient then\nblocks its single config-refresh executor for the full 1s timeout, every\n\n[…]\n the manager app is\nforce-stopped or frozen by an OEM battery policy).\n\nVerified: debug + release + selfcheck build, 74 tests green.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: stop three failure paths from failing in the worst direction",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-26T16:57:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0670f8241c4c7cf2a6cec35c50e7b1aa502ce67e",
"body": "Three defects that made the module either disclose what it was meant to\nhide, or advertise its own presence.\n\n1. Device-identifier hooks bypassed the platform permission check.\n getImei/getImeiForSlot/getDeviceId*/getMeid and all four\n getTypeAllocationCode* variants were hooked with beforeOrigi\n[…]\nd: debug + release build, 74 tests green. Not device-tested --\nthe WifiInfo copy constructor is @hide, so the fallback path matters.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(hook): stop leaking real values and announcing the module",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-26T16:54:18Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "43695a85f46e5cf77dd177144df93b31ea6555b3",
"body": "SubmoduleConfigFiles.write() reads nine configs through ConfigRegistry,\nwhose read() throws on an invalid one. write() is the last statement of\nevery *Prefs.saveConfig and runs *after* the value has been committed, so\na single bad field had unbounded blast radius:\n\n Type a BSSID one octet short int\n[…]\netDefaultSelection delegate to it, so the eight existing call sites are\nunchanged.\n\nVerified: debug + release build, 74 tests green.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(config): stop one invalid field from breaking every save app-wide",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-26T16:47:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "98d2bf594bf483cb313ce173c0e0a6f76afaac00",
"body": "ConfirmDialogComponents defined DynamicArirangTheme, a near-duplicate of\nArirangTheme. With minSdk 34 both always take the dynamic-colour branch,\nso they differed in exactly one way: the duplicate passed Typography(),\nthe Material default, instead of the project's Typography. The clipboard\nconsent d\n[…]\nor no stated reason.\n\nDeletes it and points ConfirmDialogActivity at ArirangTheme.\n\nVerified: debug + release build, 72 tests green.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(ui): use one theme for the clipboard dialog",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-26T14:09:45Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a3e221d166fa04db1b698192d08036517c0a8229",
"body": "Each *ConfigScreen carried its own copy of the same chrome: a\nshowUnsavedDialog flag, a pinned scroll behaviour, requestBack(), a\nBackHandler, the Scaffold + CenterAlignedTopAppBar with back and save\naffordances, and a trailing UnsavedChangesDialog block.\n\nConfigScreenScaffold now owns that. The scr\n[…]\n SimConfigScreen's\nslot-limit dialog and SensorListScreen's add dialog, so the counts are\nnow asserted per file rather than assumed.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(ui): extract the config-screen scaffold from all eight screens",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-26T14:07:50Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e4018a6f763e9b69796c86741f0895152ecd8ee8",
"body": "The seven *ConfigActivity classes were the same 34 lines each, differing\nonly in which Prefs object they read, which screen they composed, and\nwhich of two toast strings they showed. Each repeated enableEdgeToEdge,\nthe ArirangTheme wrapper, the load-into-initialConfig step, onBack =\n{ finish() }, an\n[…]\nd is now a named function rather than an\nuntitled block in the middle of onCreate.\n\nVerified: debug + release build, 72 tests green.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(ui): host config screens through one shared entry point",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-26T13:49:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ad1135b1da96ce226e790b4655da0d19dc5471d8",
"body": "…me package\n\n- LocationConfigScreen and LocationAppComponents each carried a private\n copy of parseDouble/parseFloat/parseInt plus a differently-named copy of\n the same result type. The copies had diverged: the screen's parseFloat\n tested `value < min || value > max`, which is false for NaN, and \n[…]\n the class\n it actually declares and the name the manifest registers.\n\nVerified: debug + release + selfcheck build, 72 tests green.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(ui,config): single-source duplicated helpers and flatten the…",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-26T13:38:48Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f5b77de027887d8c253b18e00afe503b186478c7",
"body": "Every *Schema hand-writes both its declared defaults and, separately, the\nfallback its decoder uses when a field is absent from a snapshot. Nine of\nthose pairs had drifted, in both directions:\n\n- WifiConfigSchema decoded all six string fields to \"\" while declaring\n real defaults, so a snapshot miss\n[…]\nt applied and\nnon-null String fields would decode to null. MasterConfigSchema only ever\nuses Gson for serialisation, never decoding.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(config): decode absent schema fields to their declared defaults",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-26T13:34:52Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f129b56b1dc0966c1fa96385a18fe2e93c855ff6",
"body": "Both god-classes answered \"which spoofed identity applies to this call?\"\nthrough several similarly-named private helpers, so a reader could not\ntell from a call site which policy was in effect.\n\nFuckLocation had five resolvers -- resolveProfile, profileForPackage\n(a pure alias of it), profileForArgs\n[…]\ner-keying must win. That is now stated in a comment instead of\nbeing implicit in `when` ordering.\n\nVerified: build + 67 tests green.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(hook): give profile/target resolution one name each",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-26T13:29:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2dd66f99345282c5c28fe1050bfe57a3725e27c2",
"body": "…okModule\n\nBaseHookModule declared beforeHookedMethod/afterHookedMethod/hookedMethod\nas `protected`, so only the nine `Fuck*` entrypoints could reach them.\nHook logic is actually split between those entrypoints and plain installer\ncollaborators (`*Hooks`), and the collaborators could not use the bas\n[…]\nnd conversion would relabel ~139 lines of untestable\nparcel code for no real gain.\n\nVerified: debug + release build, 67 tests green.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(hook): make the hook-callback builders usable outside BaseHo…",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-26T13:24:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0e14f8825497876e680cf9e7032a1408cf3a2fb8",
"body": "All verified unreferenced by repo-wide grep before removal.\n\n- hook/core/HookConfig.kt: an abandoned fifth config-read model sitting\n in core/ beside the four live ones, with zero references.\n- SimScopeActivity (body entirely commented out), TestActivity and\n LanguageSettingsActivity + LanguageAda\n[…]\nhook.** is deliberately left as-is since Xposed loads it reflectively.\n\nVerified: debug + release + submodule build, 67 tests green.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor: remove ~1800 lines of dead code",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-26T13:17:01Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b48c0d277fdf19ca0a730936791b6d9824639a7b",
"body": "The module rename in 3e37ac7 (:arirang-selfcheck -> :selfcheck,\n:arirang-submodule -> :submodule) was never propagated. Three things\nwere left broken, and none were caught because CI does not run tests.\n\n- .github/workflows/android.yml built Gradle projects that no longer\n exist, so every `v*` tag \n[…]\n Kotlin\n2.4.10, Compose BOM 2026.06.01, and the now-live test suite).\n\nVerified: full CI command reproduced locally, 67 tests green.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(ci): unbreak release pipeline and restore the unit test suite",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-26T13:17:01Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "22bd4907e3bf78c18fb408062c44fb81d232bcca",
"body": "Remove `com.android.providers.settings` and `com.android.location.fused` from the package array in `arrays.xml`.",
"is_bot": false,
"headline": "refactor(config): remove settings and fused location from package list",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-26T06:15:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "18748d52c3d2c36913e32ed23ed14fed96da88a4",
"body": "Spoof transportInfo, NetworkAgentSpecifier, and DhcpInfo at the system layer\nso apps no longer read the real SSID/BSSID/gateway. Add IP/gateway/DNS config\nwith common-DNS randomization and expand selfcheck multi-API probes.",
"is_bot": false,
"headline": "fix(wifi): close ConnectivityManager leaks and spoof DHCP/LAN fields",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-21T10:57:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "36bd11b6f5d8f24f2e7e99645acf2afb51c3a3ec",
"body": "Proactively deliver spoofed locations on LMS/GMS continuous paths and\nrefresh LocationProviderManager last-location so network-only apps\nare not stuck on stale maxUpdateAge filtering.\nAlso lazy-init main Handler to avoid Zygote NPE killing HookManager.",
"is_bot": false,
"headline": "fix(location): inject fresh fixes for continuous requestLocationUpdates",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-25T04:09:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ffebc515af235be501140dc4983c947a26e89fe2",
"body": "Extend `LocationChecker` to include diagnostic checks for active location updates from both native and fused providers.\n\n- Implement `awaitNativeLocationUpdates` to test `LocationManager` providers (GPS, Network, Fused) using a `LocationListener`.\n- Implement `awaitFusedLocationUpdates` using the Go\n[…]\nDownLatch` and `AtomicReference` to handle asynchronous updates with a 5-second timeout.\n- Add corresponding string resources for reporting update results in English, Japanese, and Simplified Chinese.",
"is_bot": false,
"headline": "feat(selfcheck): add active location update probes",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-21T08:29:47Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8da1e6d82a1a263722917e28eec53533527465be",
"body": "Update several string resources to use the more concise \"Identifiers\" label instead of \"Unique Identifier\" for feature titles, configuration settings, and log modules.",
"is_bot": false,
"headline": "refactor(ui): simplify \"Unique Identifier\" labels to \"Identifiers\"",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-18T21:56:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3e37ac7590c78db9d43507efffef9cd17f9a3eb1",
"body": "- Rename `arirang-submodule` to `submodule` and `arirang-selfcheck` to `selfcheck` across the project.\n- Add `drm_hook_deep_dive.md` documentation providing a technical overview of the Widevine DRM hook implementation.\n- Upgrade Gradle wrapper to 9.5.0 and Android Gradle Plugin (AGP) to 9.3.0.\n- Update `CMakeLists.txt` to reflect the module rename and adjust component validation logic.",
"is_bot": false,
"headline": "refactor: rename modules and upgrade build tools",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-18T21:39:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f66d5538c504909fc5542448c496f643a96e9611",
"body": "Remove the diagnostic log block that monitored requests containing \"blue\", \"name\", or \"device\" in `FuckSettingsProvider`.",
"is_bot": false,
"headline": "refactor(settings): remove diagnostic logging for settings requests",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-17T23:01:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fab30d5e960d85e012055aaa3fbee9b8abb66378",
"body": "… a P0 issue where isolated/sandboxed UIDs (Chrome, WebView, GMS) would see an empty package list, causing crashes during startup.\\n- Update HOOK_CODE_REVIEW_TODO.md to reflect the fix.",
"is_bot": false,
"headline": "fix(hook): fail open for unresolvable package-list callers\\n\\n- Fixes…",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-17T22:44:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "44e90f9dccdaad60919d4600f9ab6f14a89b172b",
"body": "Harden native/shell packaging while unblocking real-device paths broken by\nover-strict checks: allow ksud resetprop, vendor_hal_drm_widevine/ksu\nsepolicy, mksh-safe HAL discovery, background DRM inject worker, phone\ncompanion peers, and looser sensor maps/TBI handling.",
"is_bot": false,
"headline": "fix(submodule): restore KSU/OEM runtime after security refactor",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-17T01:49:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "36600d5eeace0219a55a20f1bab87c2bff349330",
"body": null,
"is_bot": false,
"headline": "refactor(selfcheck): simplify getPackagesForUid output header",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-11T21:59:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fd4feb6af6ca3290b70d9f158b9aef3675343a59",
"body": null,
"is_bot": false,
"headline": "refactor(ui): split screens and reusable components",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-11T21:52:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c78f94be8c60048e5eee706c2515de87e2ea9418",
"body": null,
"is_bot": false,
"headline": "refactor: harden hooks and unify config management",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-11T05:12:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ff8b207214bc56eff27e630f7a43b1dd396ab48e",
"body": "Separate the monolithic arirang_drm_hook.cpp into three files:\n drm_vtable_hook.cpp — primary: data-level vtable/method-table scanning\n drm_inline_hook.cpp — fallback: instruction-level inline hook patching\n drm_hook_entry.hpp — C-linkage accessors for cross-TU function refs\n\nFallback logic:\n\n[…]\nxt rejects non-arm64 targets at configure time\n - Each hook .cpp documents its AArch64-specific assumptions\n - drm_hook_research.md updated with arch limitation note\n\nAdd graphify-out to .gitignore.",
"is_bot": false,
"headline": "refactor: split DRM hook into vtable + inline fallback, add arm64 guard",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-06T07:00:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "cc381fe5d56951f356ad8a6057c0ded00945a72c",
"body": "Replace the monolithic 210-line post-fs-data.sh with a thin orchestrator\nthat delegates to 5 single-responsibility library modules under lib/:\n\n lib/common.sh - shared constants, logging, config path resolution\n lib/staging.sh - tmpfs dir setup, SELinux labeling, file copy\n lib/vendor_bi\n[…]\nb/resetprop.sh - system property spoofing (device, identity, telephony)\n\nAlso update service.sh to source common.sh for shared constants.\nUpdate build.gradle.kts to include lib/ in the packaged zip.",
"is_bot": false,
"headline": "refactor: split post-fs-data.sh into focused library modules",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-06T06:36:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8318b5bae9e5a9c4deb7be59f936635c68153b3c",
"body": "Split ui/component/ into 5 sub-packages:\n home/ - HomeScreen, FeatureItem, FeatureCard, FeatureSection,\n FeatureItemView, StatusCard\n about/ - AboutScreen, AppInfoHeader, InfoCard, StatusChip\n settings/ - SettingsScreen, SettingsSection, SettingCard,\n LanguageDial\n[…]\n dialog/ - HookLogDialog, ConfigChangeDialogs (SaveConfigIconButton,\n UnsavedChangesDialog, InfoDialog)\n sim/ - SimSlotItem\n\nUpdate all fragment and activity imports accordingly.",
"is_bot": false,
"headline": "refactor: organize UI components into categorized subdirectories",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-06T06:31:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "de8b2f36d76b91430d249255fc1fd2c5b38e1e9d",
"body": "…action\n\nSchema-first refactoring (Phase 1-2):\n- Add 10 Kotlin schema data classes under data/datastore/schema/\n (SimConfig, Location, WiFi, Bluetooth, Identifier, Global, Sensor,\n HookLog, PackageList, MasterConfig) with Gson serialization\n- Replace all 9 ConfigPrefs buildHookSnapshot() with uni\n[…]\nts for config schema serialization round-trips\n in ConfigSchemaTest.kt\n- Add ConfigImportExportTest.kt covering all snapshot/cross-version\n structures\n\nBuild passes cleanly, all 28 unit tests green.",
"is_bot": false,
"headline": "refactor: schema-first config serialization + fragment component extr…",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-06T06:15:19Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "908afefa6ec37cbddb2a59f92378e9c5d9e21447",
"body": "…ility prefs\n\n- Use `commit = true` in SharedPreferences edits to ensure synchronous persistence\n- Trigger `SubmoduleConfigFiles.write()` after updating enabled status, default selections, templates, or app rules to keep submodule configurations in sync",
"is_bot": false,
"headline": "fix: ensure immediate disk write and submodule sync for package visib…",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-01T10:46:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "df828e80b28e9e304ed96d44085ef0bf31f93a87",
"body": null,
"is_bot": false,
"headline": "feat: remove region selection feature entirely",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-07-01T10:44:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bf1aef5e41743c76c62b9b42d3647fbad2e20f1f",
"body": "…null/timeout paths\n\n- In hookDeliveryProxyClass, when dfjy.a() callback receives null Location\n (no real GPS fix), inject a fake Location via fakeLocation(profile) so\n the client gets spoofed data instead of null.\n- Add scheduleProactiveFakeDelivery for type-4 LocationReceiver\n (ILocationStatusC\n[…]\nastLocation\n already delivered via the real callback path.\n- Add AGENTS.md with project shape, build commands, hook design constraints,\n and CI workflow references. Remove AGENTS.md from .gitignore.",
"is_bot": false,
"headline": "fix(location): inject fake Location for GMS fused getCurrentLocation …",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-30T17:34:35Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "391f413a055291a62f92ff9dbc54f2341e0be2ad",
"body": "Replace individual package filtering logs with an aggregated count per method call to reduce log noise. Remove redundant log entry in `getNameForUid` and refine log messages for consistency.",
"is_bot": false,
"headline": "refactor: optimize package list hook logging with summary counts",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-30T10:06:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d53d1c30294844834de93c97b8dc42a5b5992a30",
"body": null,
"is_bot": false,
"headline": "chore: remove dead ClipboardRequestReceiver code",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-30T08:45:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9bc655f8d57bc928f424ebf1b496602396b98fee",
"body": "SIM boot delay:\n- Add writeProofTelephonyProperties() immediately in hookPhoneProcessSurfaces\n so spoofed properties are written at hook install time (not after 5s delay)\n- Replace hardcoded postDelayed in hookPhoneConfigServiceBind with event-driven\n ArirangClient.ConnectionListener that triggers\n[…]\n include DE filesDir, DE shared_prefs, databases directory in zip\n- Import: extract to both CE and DE data directories\n- Add unit tests for ZipUtils (14 tests) and SubmoduleConfigFiles JSON (13 tests)",
"is_bot": false,
"headline": "fix: eliminate SIM boot delay, fix incomplete config import/export",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-30T08:36:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7177602af42c8ca8f36740a1756292a7d86b1675",
"body": "…template lookups\n\n- Remove isInstalledPackageForCaller checks, rely solely on config rules\n- Change shouldKeepForPackages logic from all() to any() (permissive union)\n- Allow target package to see itself (targetPackage in callingPackages)\n- Use Set<String> for getPackagesForUid return type\n- Add resolvedTemplateCache with lazy getOrPut\n- Switch logging from HookBridge.log to HookLog.d",
"is_bot": false,
"headline": "refactor(packagelist): simplify visibility check, use HookLog, cache …",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-30T07:50:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "970123884df78e6fc988a03cb6dd741b1b89b36d",
"body": null,
"is_bot": false,
"headline": "feat(ui): enable app list feature item in HomeFragment",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-30T06:33:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4377e6d7306a596f2ec86246444feecfbfab4a9a",
"body": "…on of concerns\n\nMove Xposed/reflection bridging methods (findClass, hookMethod, callMethod, etc.)\nfrom BaseHookModule into a dedicated HookBridge object. Update all hook modules\nto reference HookBridge directly instead of routing through BaseHookModule.\n\nAlso move a comment in sensor_spoofer.cpp to better reflect code flow.",
"is_bot": false,
"headline": "refactor: extract HookBridge from BaseHookModule for cleaner separati…",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-29T08:43:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "26b1718c3bf66aebdf8d8c82e979b8f0d9a30405",
"body": "…mentations\n\n- Refactored XposedHelpers and XposedBridge usages to BaseHookModule methods in Kotlin hook classes.\n\n- Added detailed explanatory comments to native spoofer implementations (sensors, system properties, drm).",
"is_bot": false,
"headline": "refactor: replace XposedHelpers with BaseHookModule across hook imple…",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-29T03:45:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b0cb049ab19ca4b70b0d4ce8cd3fc73654b1d22a",
"body": "…dings\n\nInitialize a tracking document for identified P1-P3 issues across hook modules, including GMS, Telephony, Bluetooth, and Location services, based on the June 2026 code review.",
"is_bot": false,
"headline": "docs: add HOOK_CODE_REVIEW_TODO.md documenting hook module review fin…",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-28T22:38:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f971d76711a669c3893b4fda86dd140350c7dadd",
"body": null,
"is_bot": false,
"headline": "Update README.md",
"author_name": "PaulPerkenstein",
"author_login": "dddqmmx",
"committed_at": "2026-06-28T07:17:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "48f0fb307b81cf86fc102f59dcb558631fb18767",
"body": "…lity\n\nRestructure the `symbol_resolver`, `vtable_hook`, and `inline_hook` components into granular helper functions to simplify control flow and improve code auditability.\n\n* **Symbol Resolution**: Refactor ELF parsing to support both GNU and SysV hash tables with improved rebasing logic for dyna\n[…]\ns and use atomic stores for publishing live patches.\n* **Documentation**: Add `hook_file_design.md` detailing the design philosophy, responsibilities, and structural constraints of the hook helpers.",
"is_bot": false,
"headline": "refactor: overhaul native hook infrastructure for safety and auditabi…",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-28T01:19:36Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1bf222244615600896a0678f5340a88f464818e7",
"body": null,
"is_bot": false,
"headline": "fix(settings): add early return after spoofing bluetooth name",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-28T00:25:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "33417cf2496b1795caec066784f3812ce968b5f4",
"body": null,
"is_bot": false,
"headline": "Limit SettingsProvider hook target",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-28T00:20:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "866ef10b1bbf106a3282d326322dac54f1832cff",
"body": null,
"is_bot": false,
"headline": "docs: clarify package visibility management",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-27T21:28:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "59a4dca8a8b28c5380be235c16e8711bdbac0d24",
"body": null,
"is_bot": false,
"headline": "docs: add missing README screenshots",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-27T21:17:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ea6f0621cde3976dc7fb5f1c155da3ef5474e7bb",
"body": null,
"is_bot": false,
"headline": "Update README.md",
"author_name": "PaulPerkenstein",
"author_login": "dddqmmx",
"committed_at": "2026-06-27T21:13:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "77c65467c6641e165c04ca8426ebc334567f68a4",
"body": null,
"is_bot": false,
"headline": "Update screenshots",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-27T21:02:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1304b3a7f486652d413886ea24bb9762434a3cff",
"body": null,
"is_bot": false,
"headline": "Refactor hook modules by domain",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-27T19:52:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1b4309585e873005bd598b3b5b1136bac6d23743",
"body": "…d vtable false-positive guard\n\n- Split absolute jump into build (offline, unused memory) and publish\n (live function, ordered stores so entry word is visible last)\n- Replace RWX mmap with RW + mprotect(RX) to satisfy W^X/SELinux policies\n- Use MAP_FIXED_NOREPLACE for branch-trampoline page allocat\n[…]\nke_absolute_vtable_slot() to reject isolated global\n pointers that happen to hold the target address\n- Emit warnings instead of silently succeeding when mprotect restore\n fails during unprotect_page",
"is_bot": false,
"headline": "Refactor inline hook: thread-safe atomic patching, W^X compliance, an…",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-27T16:17:44Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2c6917719e6a3f881bb9ee55305978d1b2095aea",
"body": null,
"is_bot": false,
"headline": "Add randomize button for Bluetooth MAC and WiFi BSSID fields",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-27T14:04:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "611aa5726b762a14992a87483bff55ddd0dae485",
"body": null,
"is_bot": false,
"headline": "Refactor: Extract hardcoded strings to resources and add i18n support",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-27T13:02:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6335fc610a0557874e85ec967f03fcc6ea9293ac",
"body": "Stop tracking .idea/ and AGENTS.md (add to .gitignore)",
"is_bot": false,
"headline": "Add Bluetooth feature description to README",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-27T07:14:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e28a9838720e981775e9a28ed9bb6939c3e5dcd0",
"body": "Removed mention of 'arirang-submodule' from installation steps.",
"is_bot": false,
"headline": "Update installation instructions in README.md",
"author_name": "PaulPerkenstein",
"author_login": "dddqmmx",
"committed_at": "2026-06-26T21:12:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "77427028ccdcbc128f4d213b4a7862f9a5c53f6a",
"body": "Updated warning section to clarify software stability and ongoing code review process.",
"is_bot": false,
"headline": "Revise warning about software stability and code review",
"author_name": "PaulPerkenstein",
"author_login": "dddqmmx",
"committed_at": "2026-06-26T21:06:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6637663f9605b920590e9e2501fba96861c6c377",
"body": "Updated README.md to clarify the status of features and installation instructions.",
"is_bot": false,
"headline": "Revise feature descriptions and installation steps",
"author_name": "PaulPerkenstein",
"author_login": "dddqmmx",
"committed_at": "2026-06-26T20:53:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a9f64794dbd8987a76e52680bbeabe8850de4af3",
"body": null,
"is_bot": false,
"headline": "Merge remote-tracking branch 'origin/master'",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-26T20:47:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a99757f4b732e44172e615d235a771f5e626077d",
"body": "Reworded sections for clarity and consistency in the README.",
"is_bot": false,
"headline": "Refine README content for clarity and consistency",
"author_name": "PaulPerkenstein",
"author_login": "dddqmmx",
"committed_at": "2026-06-26T20:47:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4bfe1421cea95154ac65e50b0fcd7c2f477f1e0f",
"body": null,
"is_bot": false,
"headline": "Add configuration backup and restore",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-26T20:45:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "078e604dba4e900eb142813c4765412d35095fa8",
"body": null,
"is_bot": false,
"headline": "Fix package visibility UID recursion",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-26T20:41:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3e6e93c46a0d2f9d1b6a861fd0bcd4059e607b44",
"body": "…Uid attack surface",
"is_bot": false,
"headline": "feat(selfcheck): add multi-method app enumeration with getPackagesFor…",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-26T00:19:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "74ddc1ee5b8f61ecf7a7b8da010d5979b8f099a5",
"body": null,
"is_bot": false,
"headline": "fix: declare PackageTemplateManagerActivity in AndroidManifest.xml",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-25T15:33:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "de7d67f43f08da56853c651e25c6bd0d3d8efee6",
"body": null,
"is_bot": false,
"headline": "feat(sensor): prevent spaces in vendor replacement keywords and value",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-25T06:40:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "814539cdaa8a4923f880feb64a7de81ccbe60d2a",
"body": null,
"is_bot": false,
"headline": "feat(sensor): remove default vendor keywords for replacement",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-25T06:36:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9b99cfa05e0f19bcdaf1ccd561d768af5685c323",
"body": "…d variables",
"is_bot": false,
"headline": "refactor: optimize clipboard ANR bypass reflection and clean up unuse…",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-25T00:24:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "307ce569ede0b55382218eb5cff2ec40ea698188",
"body": "Remove timeoutMs from IArirangService AIDL and ArirangClient, making the App side (ClipboardController) the single source of truth for timeout logic.",
"is_bot": false,
"headline": "refactor: Consolidate clipboard timeout configuration",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-25T00:14:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "49325c608ebf58c32fd59d856a967831d76140d3",
"body": "1. Increase clipboard timeout from 2500ms to 10000ms in Hook and App side. 2. Implement ANR exemption by spoofing isDebugging in system_server's ProcessRecord and WindowProcessController while waiting for user decision.",
"is_bot": false,
"headline": "feat: Extend clipboard interception timeout and prevent ANR",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-24T23:49:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b9b2fd9e5582854c74f4a51a7d5eb290b43f7639",
"body": null,
"is_bot": false,
"headline": "feat(ui): complete About screen implementation and update navigation",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-24T23:08:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "74d0b1c7487301cdfc6545e5e4d0757bbdc0f84b",
"body": "…in AboutFragment",
"is_bot": false,
"headline": "fix(ui): resolve IllegalArgumentException when loading adaptive icon …",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-24T23:07:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0df88ed4faaf82ba97d9d2e275976b4763fe2644",
"body": "…r classes",
"is_bot": false,
"headline": "Refactor: Modularize SelfCheckActivity checks into independent checke…",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-24T18:29:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a72b8773e423338ce2f55f345056714b2460f7cd",
"body": "… mount\n\nPreviously, we used a full directory bind-mount or OverlayFS to inject\nthe audio HAL. However, Android's Bionic Linker and hwservicemanager\nenforce strict security checks on vendor HALs. Bind-mounting a directory\nfrom /data (or a tmpfs with overlayfs) causes the st_dev of the path\nto change\n[…]\nuccessfully\npoints to the real hardware HAL (e.g., taro.so).\n\nThis completely avoids any SELinux or linker namespace rejections,\nensuring 100% stability while maintaining the spoofed audio properties.",
"is_bot": false,
"headline": "fix(audio): resolve gralloc-mapper crash by using file-over-file bind…",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-24T17:17:09Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ec56c63f6b89d6543164291372af8026cb3a5116",
"body": "- Resolved an issue where spoofing `ro.board.platform` caused silent audio due to the system falling back to a stub `audio.primary.default.so` library.\n- Added logic to `post-fs-data.sh` to extract the device's actual platform identifier from `/vendor/build.prop`.\n- Implemented a bind-mount of the h\n[…]\nand `/vendor/lib64/hw` directories.\n- Ensured the primary audio HAL remains functional while maintaining spoofed `ro.product.board` and `ro.board.platform` properties for application-level visibility.",
"is_bot": false,
"headline": "Implement audio HAL bind-mount workaround for platform spoofing",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-24T07:17:21Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c2a1798e25209d05bc624bd9ea1d294f8e25d768",
"body": "…x SELinux config access\n\n- SelfCheckActivity: check all 5 sensor types (accelerometer, gyroscope,\n magnetic field, gravity, linear acceleration) instead of just one\n- SelfCheckActivity: add live monitoring mode with real-time 500ms refresh\n- SelfCheckActivity: add Start/Stop Live Monitor button in\n[…]\ne-aware stop in onPause\n- Fix SELinux: add system_server app_data_file rules in sepolicy.rule\n- Fix permissions: chmod 644 + chcon watchdog in service.sh\n- Remove debug logging from sensor_spoofer.cpp",
"is_bot": false,
"headline": "feat: multi-sensor precision check, live monitoring in self-check; fi…",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-18T13:28:04Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c2dd472f9b4fe6b0ab17cbe85950ed8fa1af2fd3",
"body": "…a BnSensorServer::onTransact vtable patch\n\n- Fix VectorImpl::removeItemsAt symbol name (13 vs 14 chars) in sensor_spoofer.cpp\n- Add inline_hook_branch() for small functions (getName/getVendor too small)\n- Switch strategy: inline-hook BnSensorServer::onTransact (exported, 2472 bytes) from libsensor.\n[…]\niles sync rules to submodule config.json\n- Add preServerSpecialize fallback install; idempotent guards\n- Verified on Pixel 8 Pro (Android 16, KernelSU Next): xiaomi/XiaoMi vendors replaced with Google",
"is_bot": false,
"headline": "sensor_spoofer: implement system-level sensor name/vendor spoofing vi…",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-16T22:06:58Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2e4aaad4c42605f690c5875fd004c3d9f3040cbd",
"body": "…itActivity",
"is_bot": false,
"headline": "refactor(ui): use LocalActivity instead of casting LocalContext in In…",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-15T11:55:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "52f582ac04139dfdc480342bd454384ac1c7b946",
"body": "…ith Randomize All",
"is_bot": false,
"headline": "feat: update UniqueIdentifier default slots to 2 and replace Import w…",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-14T23:40:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "76be76bd1e85a1b90ec00a407ce64f1c6f884b53",
"body": "The previous implementation rewrote AArch64 instructions in\ngetPropertyByteArray prologues, which is fragile and breaks on\nPAC / compiler / OEM differences.\n\n- Add hook/vtable_hook.cpp|hpp: patch function-pointer slots in\n vtables / method tables instead of machine code. Supports both\n absolute 64\n[…]\nrification notes.\n\nVerified on Pixel 8 Pro (Android 16, KernelSU Next): the hook\ninstalls successfully and MediaDrm.getPropertyByteArray(PROPERTY_\nDEVICE_UNIQUE_ID) returns the configured spoof value.",
"is_bot": false,
"headline": "refactor: replace DRM inline hook with data-level vtable hook",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-14T23:04:04Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2e6eefb6aed8faa8801812114edf0d82ee4b0196",
"body": null,
"is_bot": false,
"headline": "refactor: externalize sensor type strings to resources",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-11T12:32:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3f470600f8ef44f7152af33a2c832bb954432c5e",
"body": "…hing issue\n\n- Removed Swipe-to-Dismiss deletion and simplified layout with inline Delete icon and Switch\n- Added unique persistent UUIDs to SensorEntry to fix Compose LazyColumn caching issues when removing/resetting items",
"is_bot": false,
"headline": "Refactor: Redesign SensorListActivity UI and fix LazyColumn state cac…",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-11T06:24:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ad48f53f4596d6b0b18a1bffa4189f52601b011f",
"body": "- Extend arirang_injector with a 'config' command for robust JSON parsing using nlohmann/json.\n- Refactor post-fs-data.sh to utilize the injector for configuration extraction, replacing fragile grep/sed logic.\n- Add comprehensive Japanese localization for sensor settings, camera controls, and advanced features.\n- Cleanup gradle.properties and streamline Kotlin plugin declarations across modules.\n- Add missing UI strings (OK/Cancel) to the self-check module.",
"is_bot": false,
"headline": "Refactor configuration parsing and update localizations",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-10T13:40:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c5bce8ff95f4b44f168758bc44e606f20b36f4b6",
"body": "- Added string resources for \"Global Settings\" and \"Advanced Settings\" categories in Chinese (Simplified).\n- Introduced strings for the \"Restrict hot switching\" feature, which allows hooks to be installed only at app startup to reduce background overhead.\n- Added UI labels and summaries for the \"Hide all connected devices\" option within the Bluetooth spoofing module.",
"is_bot": false,
"headline": "Add localized strings for advanced settings and Bluetooth configuration",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-10T07:16:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2a3da155cbb4a6a8a34fec0e8bd5bd9d0b36d0f3",
"body": "- Removed trailing periods from UI strings across the `app` and `arirang-selfcheck` modules.\n- Updated localized string resources for English, Chinese (Simplified), and Japanese to ensure punctuation consistency.\n- Standardized formatting for summaries, hints, and status messages to maintain a uniform UI style across all configuration screens.",
"is_bot": false,
"headline": "Standardize string resources by removing trailing punctuation",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-10T07:11:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9623c1d87671155e9c366f4b9b1bca5d119eb61a",
"body": "- Moved the per-app location configuration entry card to a more prominent position above the coordinate settings section.",
"is_bot": false,
"headline": "Adjust UI layout in LocationConfigActivity",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-10T06:34:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "63f60c3d817974ccb0387cdebb3a960aa0e2d84e",
"body": "… separate activity\n\n- Extracted sensor list management, vendor replacement configuration, and the \"Hide all\" toggle from `SensorConfigActivity` into a new `SensorListActivity`.\n- Implemented an `ActivityResultLauncher` in `SensorConfigActivity` to navigate to the sensor list and synchronize configu\n[…]\nr type labeling logic to the new activity to improve code modularity.\n- Registered `SensorListActivity` in `AndroidManifest.xml`.\n- Removed an unused `Binder.getCallingUid` import in `ArirangService`.",
"is_bot": false,
"headline": "Refactor sensor configuration and extract sensor list management to a…",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-10T06:24:11Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9a3bfa0c28e4ebf34ce6073195b2d2a7c2321d66",
"body": "- Refactored `ArirangService` to act as a facade, delegating business logic to dedicated components for improved maintainability and separation of concerns.\n- Introduced `CallerValidator` to encapsulate security logic, including UID trust verification and package ownership validation.\n- Implemented \n[…]\nding request tracking and policy caching, from the service into specialized manager classes.\n- Simplified `ArirangService` by delegating AIDL interface implementations to the new modular architecture.",
"is_bot": false,
"headline": "Refactor ArirangService into modular controller and provider classes",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-10T05:48:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "41131ef51f5e0dc2a7a0ac3a47f3980b92cb5db2",
"body": "…njection\n\n- Restricted Zygisk module injection and Java hooks to framework-level components (`android` and `com.android.phone`) to minimize performance overhead and improve system stability.\n- Implemented native inline hooks for `libc` system property functions, including `__system_property_get`, `\n[…]\n.\n- Updated `HookManager` and `FuckProcess` with documentation highlighting the design shift toward intercepting data at the source (system_server/phone process) rather than third-party app injection.",
"is_bot": false,
"headline": "Refactor property spoofing to a system-level model and restrict app i…",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-09T12:20:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1ebb2299934d3ee26db95dcdd0b69a19563890ad",
"body": null,
"is_bot": false,
"headline": "fix: unescape JSON forward slashes in post-fs-data.sh",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-09T08:24:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cf7671dd36ac34a40c790f1801e7f4581c70fca4",
"body": "…njection\n\n- Restricted Zygisk module injection and Java hooks to framework-level components (`android` and `com.android.phone`) to minimize performance overhead and improve system stability.\n- Implemented native inline hooks for `libc` system property functions, including `__system_property_get`, `\n[…]\n.\n- Updated `HookManager` and `FuckProcess` with documentation highlighting the design shift toward intercepting data at the source (system_server/phone process) rather than third-party app injection.",
"is_bot": false,
"headline": "Refactor property spoofing to a system-level model and restrict app i…",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-09T06:45:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c511f7f556b87c2bda6f9bd6bb8556fff721f3f6",
"body": "- Added an `onRandomize` callback to `ImeiRow` in `UniqueIdentifierConfigActivity` to trigger UI recomposition via state revision increments when values are randomized.\n- Updated `ImeiRow` to invoke `onRandomize` whenever a new random IMEI or TAC is generated.\n- Added informational logging of system property check results in `SelfCheckActivity` to improve visibility into blocked, leaked, or consistent states during self-checks.",
"is_bot": false,
"headline": "Enhance IMEI randomization UI state and add diagnostic logging",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-08T09:59:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fcbdee223f72f57a2c4b9e37b1b95e3f051cf08a",
"body": null,
"is_bot": false,
"headline": "Intercept ProcessBuilder.start to spoof getprop child processes",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-08T09:08:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e8082d7ac23ace428d245a086a3eae6a7ed8304e",
"body": null,
"is_bot": false,
"headline": "Fix system property leaks for per-partition and vendor ro.* keys",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-08T08:48:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c82b3d811d73809fdaffd42ac20b0b05750ae09b",
"body": "…erty categories\n\n- Implemented raw `getprop` checks in `SelfCheckActivity` to detect RIL/GSM property leaks that bypass standard `TelephonyManager` Binder hooks.\n- Introduced a `LEAKED` check state to highlight sensitive hardware identifiers (e.g., IMEI, IMSI, ICCID) retrieved via side channels.\n- \n[…]\nChinese and Japanese to support new leak detection statuses and property labels.\n- Expanded the self-check summary logic to provide granular reporting on visible, hidden, and leaked information items.",
"is_bot": false,
"headline": "Enhance Self Check with side-channel leak detection and expanded prop…",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-08T08:44:44Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "bbf205f67439826451eac27cb3a688cdb79b7b51",
"body": null,
"is_bot": false,
"headline": "Remove PackageList related code from main branch",
"author_name": "dddqmmx",
"author_login": "dddqmmx",
"committed_at": "2026-06-08T08:12:51Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 5,
"commits_last_year": 241,
"latest_release_at": "2026-06-27T20:16:44Z",
"latest_release_tag": "v0.4.0-experimental",
"releases_from_tags": false,
"days_since_last_push": 2,
"active_weeks_last_year": 23,
"days_since_latest_release": 35,
"mean_days_between_releases": 15.6
},
"community": {
"has_readme": true,
"has_license": true,
"readme_badges": {
"hosts": [],
"total": 0,
"header": 0,
"collected": true,
"has_inspect_badge": false
},
"has_description": true,
"has_contributing": false,
"health_percentage": 42,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": []
},
"popularity": {
"forks": 2,
"stars": 25,
"watchers": 2,
"fork_history": {
"days": [
{
"date": "2026-03-24",
"count": 1
},
{
"date": "2026-05-19",
"count": 1
}
],
"complete": true,
"collected": 2,
"total_forks": 2
},
"star_history": null,
"open_issues_and_prs": 2
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"app/build.gradle.kts",
"build.gradle.kts",
"selfcheck/build.gradle.kts",
"submodule/build.gradle.kts"
],
"largest_source_bytes": 993716,
"source_files_sampled": 256,
"oversized_source_files": 2,
"agent_instruction_files": [
"AGENTS.md"
],
"agent_instruction_max_bytes": 6024
},
"dependencies": {
"manifests": [
"app/build.gradle.kts",
"build.gradle.kts",
"selfcheck/build.gradle.kts",
"submodule/build.gradle.kts"
],
"advisories": {
"error": null,
"scope": null,
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"maven"
],
"dependencies": [],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 1,
"open_issues": 2,
"closed_ratio": 0.6,
"closed_issues": 3,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "dddqmmx",
"commits": 250,
"avatar_url": "https://avatars.githubusercontent.com/u/58079930?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"android.yml"
],
"has_docs_dir": false,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 9,
"reason": "binaries present in source code",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 0,
"reason": "0 out of 1 merged PRs checked by a CI test -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/14 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 3,
"reason": "project has 1 contributing companies or organizations -- score normalized to 3",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "30 commit(s) and 5 issue activity found in the last 90 days -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "SAST tool is not run on all commits -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": 0,
"reason": "Project has not signed or included provenance with any releases.",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 9,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 10,
"reason": "0 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "98acb6bda950fc66688b98ee53c0efcd4ad11fdd",
"ran_at": "2026-08-02T17:26:34Z",
"aggregate_score": 4.2,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"recent_prs": {
"merged_7d": 1,
"decided_7d": 1,
"merged_30d": 1,
"authors_30d": 1,
"decided_30d": 1,
"sample_size": 1,
"window_days": 30,
"sample_exhausted": false,
"authors_probed_30d": 1,
"newcomer_merged_30d": 1,
"bot_prs_excluded_30d": 0,
"newcomer_authors_30d": 1,
"newcomer_decided_30d": 1
},
"ci_last_run_at": "2026-07-30T20:54:44Z",
"oldest_open_prs": [],
"last_merged_pr_at": "2026-07-27T06:54:43Z",
"ci_last_conclusion": null,
"oldest_open_issues": [
{
"number": 4,
"created_at": "2026-07-26T11:31:25Z",
"last_comment_at": "2026-07-26T12:50:28Z",
"last_comment_author": "dddqmmx"
},
{
"number": 6,
"created_at": "2026-07-31T13:13:12Z",
"last_comment_at": "2026-08-01T04:24:36Z",
"last_comment_author": "dddqmmx"
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/dddqmmx/arirang",
"host": "github.com",
"name": "arirang",
"owner": "dddqmmx"
},
"metrics": {
"overall": {
"key": "overall",
"band": "critical",
"name": "Overall health",
"note": "The weighted overall 46 is calibrated to 44 on the published index scale (record calibration 2026-08-02). High-Risk Jurisdiction Policy applies a 20% multiplier to weighted overall health and gives it an At Risk ceiling of 34.",
"notes": [
{
"code": "overall_calibration",
"params": {
"raw": 46,
"calibrated": 44,
"calibration": "2026-08-02"
}
},
{
"code": "jurisdiction_overall_adjustment",
"params": {
"cap": 34,
"pct": 20
}
}
],
"value": 9,
"inputs": {
"security": 8,
"vitality": 84,
"community": 35,
"governance": 40,
"calibration": "2026-08-02",
"engineering": 45,
"ai_readiness": 74,
"weighted_overall_raw": 46,
"high_risk_jurisdiction_cap": 34,
"high_risk_jurisdiction_multiplier": 20,
"weighted_overall_before_jurisdiction": 44,
"overall_after_jurisdiction_multiplier": 9
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "excellent",
"name": "Vitality",
"value": 84,
"weight": 0.21,
"metrics": [
{
"key": "development_activity",
"band": "excellent",
"name": "Development activity",
"note": null,
"notes": [],
"value": 80,
"inputs": {
"commits_last_year": 241,
"human_commit_share": 1,
"days_since_last_push": 2,
"active_weeks_last_year": 23
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 2 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 2
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "23/52 weeks with commits",
"points": 15.9,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 23
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "241 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 241
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 5 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"releases_count": 5,
"latest_release_tag": "v0.4.0-experimental",
"releases_from_tags": false,
"days_since_latest_release": 35,
"mean_days_between_releases": 15.6
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "5 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 5
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 35 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 35
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~15.6 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 15.6
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "exceptional",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "maintained",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": null,
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": 4,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 4 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 4
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "weak",
"name": "Community & Adoption",
"value": 35,
"weight": 0.17,
"metrics": [
{
"key": "popularity",
"band": "at_risk",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 22,
"inputs": {
"forks": 2,
"stars": 25,
"watchers": 2,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "25 stars",
"points": 22.4,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 25
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "2 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 2
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "2 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 2
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"has_readme": true,
"has_license": true,
"readme_badges": 0,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"readme_badge_services": [],
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (MIT)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "MIT"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "weak",
"name": "Sustainability & Governance",
"value": 40,
"weight": 0.23,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 13,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 1,
"top_contributor_share": 1
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 100% of commits",
"points": 0,
"status": "missed",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 100
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "1 contributors",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 1
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 68,
"inputs": {
"merged_prs": 1,
"open_issues": 2,
"closed_issues": 3,
"prs_merged_7d": 1,
"prs_decided_7d": 1,
"prs_merged_30d": 1,
"prs_decided_30d": 1,
"issue_closed_ratio": 0.6,
"closed_unmerged_prs": 0,
"first_time_authors_30d": 1,
"first_time_prs_merged_30d": 1,
"first_time_prs_decided_30d": 1
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "60% of issues closed",
"points": 25.2,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 60
}
}
],
"max_points": 42
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "1/1 decided PRs merged",
"points": 30,
"status": "met",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 1,
"decided": 1
}
}
],
"max_points": 30
},
{
"key": "newcomer_pr_acceptance",
"name": "Newcomer PR acceptance",
"detail": "1/1 first-time contributors' PRs merged in 30d",
"points": 13,
"status": "met",
"details": [
{
"code": "newcomer_prs_merged",
"params": {
"days": 30,
"merged": 1,
"decided": 1
}
}
],
"max_points": 13
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/14 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "weak",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 44,
"inputs": {
"followers": 3,
"owner_type": "User",
"is_verified": null,
"owner_login": "dddqmmx",
"public_repos": 15,
"account_age_days": 2445
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "personal (user) account",
"points": 10,
"status": "partial",
"details": [
{
"code": "owner_personal",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": "not applicable to user accounts",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_applicable_to_user_accounts",
"params": {}
}
],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "3 followers of dddqmmx",
"points": 4.3,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 3,
"login": "dddqmmx"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "15 public repos, account ~6 yr old",
"points": 20.8,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 15
}
},
{
"code": "account_age_years",
"params": {
"years": 6
}
}
],
"max_points": 25
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "weak",
"name": "Engineering Quality",
"value": 45,
"weight": 0.19,
"metrics": [
{
"key": "engineering_practices",
"band": "weak",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 48,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "1 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 1
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "0 out of 1 merged PRs checked by a CI test -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "weak",
"name": "Documentation",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"topics": [],
"has_wiki": false,
"homepage": null,
"has_readme": true,
"has_docs_dir": false,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "critical",
"name": "Security",
"value": 8,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "critical",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Packaging. Remaining weights renormalized. High-Risk Jurisdiction Policy applies a 20% multiplier to Security posture and gives it an At Risk ceiling of 34.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"packaging"
]
}
},
{
"code": "weights_renormalized",
"params": {}
},
{
"code": "jurisdiction_posture_adjustment",
"params": {
"cap": 34,
"pct": 20
}
}
],
"value": 8,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 17,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 1,
"scorecard_aggregate": 4.2,
"high_risk_jurisdiction_cap": 34,
"high_risk_jurisdiction_multiplier": 20,
"security_posture_after_multiplier": 8,
"security_posture_before_jurisdiction": 42
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "binaries present in source code",
"points": 6.8,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "0 out of 1 merged PRs checked by a CI test -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/14 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "30 commit(s) and 5 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is not run on all commits -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 6.8,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "at_risk",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 20,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": true,
"exposures": [
{
"role": "owner",
"count": 1,
"country": "North Korea"
},
{
"role": "top_contributor",
"count": 1,
"country": "North Korea"
}
],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"commit_weight_rule": {
"min_commits": 50,
"min_commit_share": 0.1
},
"review_only_matches": 0,
"below_threshold_exposures": [],
"assessed_self_published_locations": 2
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "North Korea: owner (1); North Korea: top_contributor (1)",
"points": 20,
"status": "partial",
"details": [
{
"code": "jurisdiction_exposure",
"params": {
"role": "owner",
"count": 1,
"country": "North Korea"
}
},
{
"code": "jurisdiction_exposure_next",
"params": {
"role": "top_contributor",
"count": 1,
"country": "North Korea"
}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "good",
"name": "AI Readiness",
"value": 74,
"weight": 0.04,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.83,
"agent_instruction_files": [
"AGENTS.md"
],
"agent_instruction_max_bytes": 6024
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "AGENTS.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "AGENTS.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "83 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 83,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 56,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0.16,
"toolchain_manifests": [
"app/build.gradle.kts",
"build.gradle.kts",
"selfcheck/build.gradle.kts",
"submodule/build.gradle.kts"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "app/build.gradle.kts, build.gradle.kts, selfcheck/build.gradle.kts (toolchain convention, no task runner)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "toolchain_convention",
"params": {
"files": "app/build.gradle.kts, build.gradle.kts, selfcheck/build.gradle.kts"
}
}
],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "Kotlin (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Kotlin"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "16 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 16,
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "exceptional",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "Kotlin",
"largest_source_bytes": 993716,
"source_files_sampled": 256,
"oversized_source_files": 2
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Kotlin (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Kotlin"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "2/256 source files over 60KB",
"points": 54.6,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 256,
"oversized": 2
}
}
],
"max_points": 55
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
}
],
"classification": {
"top": [],
"labels": [],
"scores": {},
"primary": null,
"evidence": [],
"artifacts": [],
"confidence": "none",
"host_extension": false,
"runs_as_process": false,
"consumed_by_code": false
},
"metrics_version": "2.5.0"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-08-02T17:26:44.287025Z",
"schema_version": "0.29.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/dddqmmx/arirang.svg",
"full_name": "dddqmmx/arirang",
"license_state": "standard",
"license_spdx": "MIT"
}