@maccesar/titools 5.2.0 → 5.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/CONTRIBUTING.md +82 -0
  2. package/README.md +83 -72
  3. package/agents/ti-pro.md +1 -1
  4. package/commands/ti-audit.md +2 -2
  5. package/docs/examples.md +91 -0
  6. package/docs/knowledge-index.md +57 -0
  7. package/lib/commands/uninstall.js +19 -16
  8. package/lib/commands/update.js +1 -1
  9. package/lib/downloader.js +1 -1
  10. package/lib/utils.js +2 -0
  11. package/package.json +4 -2
  12. package/skills/purgetss/references/multi-density-images.md +1 -1
  13. package/skills/ti-admob-unified/SKILL.md +21 -7
  14. package/skills/ti-admob-unified/assets/example/app.js +229 -25
  15. package/skills/ti-admob-unified/assets/example/lib/ads.js +30 -2
  16. package/skills/ti-admob-unified/assets/example/library-usage.js +33 -1
  17. package/skills/ti-admob-unified/references/api-reference.md +39 -16
  18. package/skills/ti-admob-unified/references/banners.md +9 -9
  19. package/skills/ti-admob-unified/references/contributing.md +14 -9
  20. package/skills/ti-admob-unified/references/dependencies.md +31 -25
  21. package/skills/ti-admob-unified/references/fullscreen.md +43 -28
  22. package/skills/ti-admob-unified/references/game-monetization.md +138 -7
  23. package/skills/ti-admob-unified/references/getting-started.md +75 -31
  24. package/skills/ti-admob-unified/references/index.md +5 -2
  25. package/skills/ti-admob-unified/references/integration.md +8 -6
  26. package/skills/ti-admob-unified/references/library.md +41 -10
  27. package/skills/ti-admob-unified/references/mediation-parity.md +17 -0
  28. package/skills/ti-admob-unified/references/mediation.md +22 -9
  29. package/skills/ti-admob-unified/references/migration.md +11 -7
  30. package/skills/ti-admob-unified/references/module-changelog.md +41 -11
  31. package/skills/ti-admob-unified/references/privacy.md +35 -8
  32. package/skills/ti-admob-unified/references/production.md +67 -0
  33. package/skills/ti-admob-unified/references/rewarded-interstitial.md +101 -0
  34. package/skills/ti-admob-unified/references/roadmap.md +28 -31
  35. package/skills/ti-admob-unified/references/source-notes.md +51 -4
  36. package/skills/ti-admob-unified/references/source-snapshot.json +249 -45
  37. package/skills/ti-admob-unified/references/third-party-notices.md +4 -4
  38. package/skills/ti-game/SKILL.md +23 -6
  39. package/skills/ti-game/references/api.md +34 -30
  40. package/skills/ti-game/references/debugging-performance.md +18 -9
  41. package/skills/ti-game/references/examples.md +103 -20
  42. package/skills/ti-game/references/input.md +101 -0
  43. package/skills/ti-game/references/patterns.md +39 -15
  44. package/skills/ti-game/references/physics.md +80 -52
  45. package/skills/ti-game/references/project-setup.md +118 -56
  46. package/skills/ti-game/references/recipes-action.md +107 -8
  47. package/skills/ti-game/references/recipes-adventure-effects.md +41 -9
  48. package/skills/ti-game/references/roadmap.md +10 -3
  49. package/skills/ti-game/references/source-notes.md +81 -0
  50. package/skills/ti-game/references/tilemaps.md +12 -4
  51. package/skills/ti-synthengine/SKILL.md +81 -95
  52. package/skills/ti-synthengine/assets/example/README.md +84 -0
  53. package/skills/ti-synthengine/assets/example/app.js +1178 -0
  54. package/skills/ti-synthengine/assets/example/lib/sequenceOwner.js +83 -0
  55. package/skills/ti-synthengine/assets/example/lib/sequenceScore.js +25 -0
  56. package/skills/ti-synthengine/references/advanced-examples.md +174 -0
  57. package/skills/ti-synthengine/references/android-sim80-correction-evidence.zip +0 -0
  58. package/skills/ti-synthengine/references/android-sim80-correction.json +162 -0
  59. package/skills/ti-synthengine/references/api.md +434 -380
  60. package/skills/ti-synthengine/references/audio-engine.md +157 -230
  61. package/skills/ti-synthengine/references/bypass-physical-recheck-evidence.zip +0 -0
  62. package/skills/ti-synthengine/references/examples.md +123 -253
  63. package/skills/ti-synthengine/references/frontier-android-evidence.zip +0 -0
  64. package/skills/ti-synthengine/references/frontier-ipad-evidence.zip +0 -0
  65. package/skills/ti-synthengine/references/frontier-physical-validation.json +1918 -0
  66. package/skills/ti-synthengine/references/guide.md +188 -156
  67. package/skills/ti-synthengine/references/performance-review-evidence.zip +0 -0
  68. package/skills/ti-synthengine/references/performance-review.json +1146 -0
  69. package/skills/ti-synthengine/references/physical-validation.json +1457 -0
  70. package/skills/ti-synthengine/references/recipes-interaction.md +549 -0
  71. package/skills/ti-synthengine/references/recipes.md +423 -599
  72. package/skills/ti-synthengine/references/recommendations.md +63 -113
  73. package/skills/ti-synthengine/references/sound-design.md +134 -258
  74. package/skills/ti-synthengine/references/source-notes.md +93 -105
  75. package/skills/ti-synthengine/references/source-snapshot.json +379 -32
  76. package/skills/ti-synthengine/references/stats-performance.md +64 -20
  77. package/skills/ti-synthengine/references/studio-validation.json +6202 -0
  78. package/skills/ti-synthengine/references/troubleshooting.md +109 -121
  79. package/skills/ti-synthengine/references/unified-bypass-performance.json +22425 -0
  80. package/skills/ti-synthengine/references/unified-validation.json +314 -0
  81. package/AGENTS-VERCEL-RESEARCH.md +0 -175
@@ -0,0 +1,101 @@
1
+ > Source snapshot: official ti.admob.unified 1.0.0 documentation at release source commit `034843299b2984253988e0ffccb9f6a1c91682c9` (copied 2026-10-24). Relative links rebased for this skill.
2
+
3
+ # Rewarded interstitial ads
4
+
5
+ Rewarded interstitials offer a reward at a natural transition, such as the end of a level. Before showing one, your app must explain the reward and give the user a way to skip the ad. The native proxy does not create that introduction for you. See Google's requirements for [Android](https://developers.google.com/admob/android/rewarded-interstitial) and [iOS](https://developers.google.com/admob/ios/rewarded-interstitial).
6
+
7
+ Use `createRewarded()` for a placement the user explicitly chooses to open in exchange for a reward. Use `createRewardedInterstitial()` for a transition placement with its required introduction. An ordinary interstitial must not offer a reward.
8
+
9
+ ## Load ahead of the transition
10
+
11
+ After UMP permits requests and initialization completes:
12
+
13
+ ```js
14
+ const Admob = require('ti.admob.unified')
15
+ const ad = Admob.createRewardedInterstitial({
16
+ adUnitId: Admob.TEST_REWARDED_INTERSTITIAL,
17
+ autoReload: false,
18
+ requestAgent: 'my Titanium app'
19
+ })
20
+
21
+ function onReward(event) {
22
+ Ti.API.info(`Earned ${event.rewardAmount} ${event.rewardType}`)
23
+ // Credit the reward here, using the values reported by the SDK.
24
+ }
25
+
26
+ function onLoaded() {
27
+ Ti.API.info('Rewarded interstitial is ready for a later transition')
28
+ }
29
+
30
+ ad.addEventListener(Admob.AD_REWARDED, onReward)
31
+ ad.addEventListener(Admob.AD_LOADED, onLoaded)
32
+ ad.load()
33
+ ```
34
+
35
+ Preloading does not present the ad. An explicit Show request may wait for loading and present when ready, provided the app cancels it when the presentation context ends.
36
+
37
+ ## Explain the reward and allow skipping
38
+
39
+ The [playground](../assets/example/app.js) explains the demo reward and AdMob’s requirements in its card and links to the [official rule](https://support.google.com/admob/answer/9884467?hl=en). Show opens a dialog with Watch test ad and Skip. Skip cancels the pending presentation; Watch permits it. If a size change requires a replacement, the example waits and presents it without another Show tap. Leaving the foreground, losing eligibility, closing the window or selecting another fullscreen invalidates an outstanding introduction.
40
+
41
+ The production example below uses an AlertDialog with visible Watch and Skip buttons on both platforms. An iPad OptionDialog popover hides its cancel item, so it does not provide the same visible Skip button.
42
+
43
+ Use the reward configured for your ad unit in the introduction. The module reports the actual reward in `rewarded`; it does not expose a pre-presentation reward getter.
44
+
45
+ ```js
46
+ function offerTransitionAd(rewardDescription, continueApp) {
47
+ if (!Admob.canRequestAds() || !ad.isLoaded()) {
48
+ continueApp()
49
+ return
50
+ }
51
+
52
+ const intro = Ti.UI.createAlertDialog({
53
+ title: 'Rewarded interstitial',
54
+ message: `Complete the ad to earn ${rewardDescription}. You can skip it.`,
55
+ buttonNames: ['Watch ad', 'Skip'],
56
+ cancel: 1
57
+ })
58
+
59
+ function onChoice(event) {
60
+ intro.removeEventListener('click', onChoice)
61
+ if (event.index === 0 && Admob.canRequestAds() && ad.isLoaded()) {
62
+ ad.show()
63
+ } else {
64
+ continueApp()
65
+ }
66
+ }
67
+
68
+ intro.addEventListener('click', onChoice)
69
+ intro.show()
70
+ }
71
+ ```
72
+
73
+ Connect `closed` and `failed_to_show` to the app's continuation too, so a presentation error cannot strand navigation. Use a continuation that runs once. Coordinate the introduction with your window's lifetime and other modal flows. Raw API consumers must also recheck fullscreen dimensions if the app rotates while the introduction is open; the [integration library](library.md#fullscreen-ads) handles that check at `show()`.
74
+
75
+ ## Shared lifecycle and rewards
76
+
77
+ The proxy exposes `load()`, `show()`, `isLoaded()` and terminal `destroy()` on both platforms. It accepts the same mutable properties as Rewarded: `adUnitId`, `autoReload`, `keywords`, `requestAgent` and `extras`. See [fullscreen configuration](fullscreen.md#creation-properties).
78
+
79
+ Events use `adType: 'rewarded_interstitial'` and the shared [fullscreen payloads](fullscreen.md#events). Only `rewarded` grants a reward; closing, clicking or recording an impression does not. A repeated native reward callback emits at most one reward per presentation. The event preserves the presented ad's unit ID and SDK reward even if the next ad starts loading before that callback arrives.
80
+
81
+ The native ad is single-use. Load again after dismissal, or use `autoReload: true` to reload after `closed`. That option never presents the next ad. Handle load/show failures at a later opportunity rather than creating an immediate retry loop.
82
+
83
+ ## Use the integration library
84
+
85
+ `ads.createRewardedInterstitial(options)` returns the same manager as `ads.createRewarded(options)`, including `load()`, `show()`, `retry()`, `isLoaded()` and `destroy()`. Pass the same callbacks, including `onRewarded`. Call the manager's `show()` only after your introduction permits presentation.
86
+
87
+ The [raw demo](../assets/example/app.js) includes a skip option and uses Google test traffic. The [library example](../assets/example/library-usage.js) shows the equivalent manager integration.
88
+
89
+ ## Cleanup and validation
90
+
91
+ Remove named listeners before disposal:
92
+
93
+ ```js
94
+ ad.removeEventListener(Admob.AD_REWARDED, onReward)
95
+ ad.removeEventListener(Admob.AD_LOADED, onLoaded)
96
+ ad.destroy()
97
+ ```
98
+
99
+ Destroy is idempotent and terminal. Late native callbacks cannot revive the proxy or grant another reward.
100
+
101
+ Native builds, wrapper tests and an iPadOS 18.6 simulator pass cover this implementation. The simulator pass verified visible Watch/Skip buttons, presentation, a single SDK reward, dismissal, reload and the Show-time orientation guard. Physical tests on an iPad (9th generation, iPadOS 27.0.1) and an OPPO CPH2639 (Android 16) confirmed visible test content, presentation, one SDK reward per completed ad, dismissal and reload. Android also verified that one Show tap after rotation replaces the stale ad and presents its replacement. The current playground introduces the reward in a dialog with visible Watch test ad and Skip buttons. See [release readiness](roadmap.md#release-readiness) for remaining coverage. Provider delivery requires its own mappings and single-source tests.
@@ -1,23 +1,23 @@
1
- > Source snapshot: official ti.admob.unified 1.0.0 documentation at commit `5b4cbf9` (copied 2026-10-11). Relative links rebased for this skill.
1
+ > Source snapshot: official ti.admob.unified 1.0.0 documentation at release source commit `034843299b2984253988e0ffccb9f6a1c91682c9` (copied 2026-10-24). Relative links rebased for this skill.
2
2
 
3
3
  # ti.admob.unified roadmap
4
4
 
5
5
  ## Current baseline
6
6
 
7
- Version `1.0.0` establishes one portable AdMob distribution with five optional mediation complements:
7
+ Version `1.0.0` includes the core and five optional mediation complements:
8
8
 
9
- - Titanium `13.2.0.GA`
9
+ - Titanium `13.4.1.GA`
10
10
  - iOS `15.0+`
11
- - Google Mobile Ads iOS `13.10.0`
11
+ - Google Mobile Ads iOS `13.11.0`
12
12
  - User Messaging Platform iOS `3.1.0`
13
- - Android API `24+`, the floor the Titanium module template sets
13
+ - Android API `24+`, required by the pinned Google Mobile Ads SDK
14
14
  - Google Mobile Ads Android `25.5.0`
15
15
  - User Messaging Platform Android `4.0.0`
16
16
  - five optional per-network modules on iOS and Android; ironSource mediation deferred
17
17
  - idempotent initialization and consent
18
18
  - terminal `consent_complete` events
19
19
  - one standard/adaptive banner lifecycle on both platforms
20
- - one interstitial/rewarded/app open lifecycle and event contract on both platforms
20
+ - one interstitial/rewarded/rewarded interstitial/app open lifecycle and event contract on both platforms
21
21
  - portable tracking-authorization completion on both platforms
22
22
  - no manual TCF personalization inference
23
23
 
@@ -47,7 +47,7 @@ Version `1.0.0` establishes one portable AdMob distribution with five optional m
47
47
 
48
48
  ### Fullscreen contract
49
49
 
50
- - Interstitial, rewarded, and app open proxies expose the same `load()`, `show()`, `isLoaded()`, and terminal `destroy()` lifecycle.
50
+ - Interstitial, rewarded, rewarded interstitial, and app open proxies expose the same `load()`, `show()`, `isLoaded()`, and terminal `destroy()` lifecycle.
51
51
  - Duplicate loads are serialized and native fullscreen references are single-use.
52
52
  - Common events include `adUnitId` and `adType`; failures add `error`, `message`, and `code`.
53
53
  - Both platforms emit `opened`, `showed_fullscreen_content`, and `destroyed`.
@@ -56,26 +56,33 @@ Version `1.0.0` establishes one portable AdMob distribution with five optional m
56
56
 
57
57
  ### Distribution
58
58
 
59
- - The `ti.admob.unified` artifacts contain Google Mobile Ads and UMP alone: ~14 MB on iOS, ~325 KB on Android, and no network SDK in the consuming application's POM.
59
+ - The `ti.admob.unified` artifacts contain Google Mobile Ads and UMP, with no third-party ad-network SDK in the core POM. Android resolves its SDK dependencies during the consumer build, so module ZIP size is not the installed app size.
60
60
  - Five dependency modules under `mediation/<network>/` distribute eleven iOS frameworks and five Android adapter coordinates. Unity includes Coherence; neither AdQuality nor ironSource advertising is included.
61
61
  - Dependency versions and iOS checksums are reproducible.
62
62
  - Static contract tests cover privacy, lifecycle, payload, cleanup, artifacts, and documentation.
63
63
 
64
64
  ## Release readiness
65
65
 
66
- The September 2026 audit distinguishes module behavior, consumer integration and provider delivery. A successful build or Google test banner proves neither third-party delivery nor all privacy scenarios.
66
+ Rewarded Interstitial was added after the earlier five-format checks. Its native builds and wrapper tests pass. Physical iPadOS 27.0.1 and Android 16 tests confirmed visible Google test content, presentation, SDK rewards, dismissal and reload. The playground explains the reward in its card and offers Watch test ad or Skip in a dialog after Show. Selected-provider delivery still needs configured accounts and mappings.
67
67
 
68
- The correction pass now has executable coverage for library cleanup and reentrant retries, consent reset ordering, percentage volume validation and delayed reward callbacks. Both native bridges returned the expected Boolean types and loaded all five implemented formats. Repeated banner taps preserved the scroll position in the Android emulator. Three physical-iPad launches loaded the adaptive banner at 810 × 150 and all three fullscreen formats; the earlier startup sizing failure did not recur, but its cause has not been isolated.
68
+ The maintainer reported a store-published app using the module on October 23, 2026. The checks below record what has been verified. Open issues remain listed until a retest confirms a fix.
69
69
 
70
- Remaining acceptance work:
70
+ The September checks covered both native bridges, wrapper Boolean types, all five implemented formats, library cleanup/reentrant retries, consent reset ordering, volume validation and delayed reward callbacks. Core-only and selected-complement consumers were compiled on both platforms. Physical-iPad tests confirmed fullscreen presentation, dismissal and Rewarded delivery; a previous rotation-specific size failure recovered after reloading. The current library instead checks dimensions at Show and reloads only the incompatible ad. That revised policy has build/test coverage. An October 24 physical Android test also verified a single Show tap replacing a stale ad after rotation and presenting the replacement when loaded.
71
71
 
72
- - record fullscreen dismissal and actual reward delivery separately from load and presentation;
73
- - cover consent acceptance/rejection, privacy reopening, ATT states and orientation/lifecycle changes on the available devices;
74
- - retain the intermittent iOS Rewarded timeout and its UIKit reproduction until a reproducible SDK/runtime resolution is established;
75
- - verify provider-side consent propagation and review the updated transitive dependency results in [Dependencies](dependencies.md#transitive-security-review);
76
- - validate intended mediation providers with configured accounts, mappings and Ad Inspector. Core-only applications need no provider accounts.
72
+ The October 23 dependency refresh passed physical Android 16 load checks for standard and adaptive banners, interstitial, rewarded and app open ads. An isolated consumer build completed consent and initialization, loaded test interstitial/rewarded ads and resumed from the background. SDK startup now runs outside the Android UI thread. These checks do not establish third-party provider delivery.
77
73
 
78
- The declared minimum OS versions and complete physical-device interaction matrix remain unverified. Simulator and emulator evidence is recorded separately. No additional device purchase is required to continue independent checks.
74
+ Earlier simulator runs had fullscreen request timeouts. A later October 23 iPadOS 18.6 simulator pass rendered fixed/adaptive banners and all four fullscreen formats, verified one reward per completed Rewarded and Rewarded Interstitial presentation, and exercised the rotation guard and background recovery. It also covered ATT denial, a permission change in Settings, UMP rejection and privacy reopening. The demo now keeps its Skip button visible on iPad. These simulator results do not close the physical-iPad issues below; the updated binaries still need physical-iOS acceptance.
75
+
76
+ Known issues and remaining coverage:
77
+
78
+ - A physical iPad intermittently renders Google's Interstitial demo creative with a zero-width image-bearing SVG inside a correctly sized WebView. Independent UIKit, React Native and Flutter integrations also reproduce it with GMA 13.11.0. A bounded native workaround restores the collapsed column-flex Google SVG on iPad, based on the detected markup rather than the unit ID. Integrated demo presentations confirmed a visible image. The workaround uses internal creative markup and is not an official SDK fix. It also checks publisher-owned Interstitial units for that exact failure; production creative rendering remains unverified.
79
+ - Intermittent iOS Rewarded timeouts, including a reproduction without Titanium, remain unresolved; a public error alone does not establish the cause.
80
+ - An earlier physical-iPad adaptive startup sizing failure did not recur in repeated launches; its cause was not isolated.
81
+ - Complete the consent acceptance/rejection, privacy reopening, ATT, banner orientation and lifecycle matrix on available physical devices. Complete physical-iPad coverage of the final example's Show-time dimension policy; the Android replacement-and-show path has passed.
82
+ - Provider delivery and consent propagation require configured publisher accounts, mappings and Ad Inspector single-source tests. Google test ads and adapter initialization do not establish them. Core-only apps need no provider accounts.
83
+ - The declared minimum OS versions have not been validated across a complete physical-device matrix. Keep simulator/emulator results separate from hardware results.
84
+
85
+ The pinned dependency matrix is recorded in [Dependencies](dependencies.md), including the dated transitive security review. Follow [Shipping an application](production.md) for the publisher's production checks. A module build, app-store approval or a version scan does not establish every runtime scenario.
79
86
 
80
87
  ## Next contract work
81
88
 
@@ -103,11 +110,11 @@ Both platforms must expose an identical JavaScript surface. An audit against the
103
110
 
104
111
  ## Differences that stay
105
112
 
106
- The following differences are classified as SDK limitations and are documented where relevant. They are not scheduled for correction:
113
+ These differences come from the native SDKs and remain documented limitations:
107
114
 
108
115
  | Difference | Why it stays |
109
116
  | -------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
110
- | `module_initialized` has no error branch | Neither SDK reports one. `GADInitializationStatus` carries no error, and Android's callback has no failure path either; its only `success: false` is a missing-Activity pre-check. |
117
+ | `module_initialized` describes core completion | Native initialization callbacks provide status rather than a unified error contract. Android can emit `success: false` before startup when no Activity exists. Adapter failures belong in `getMediationStatus()`; synchronous native exceptions may also propagate. |
111
118
  | `applicable` in `tracking_authorization_completed` | App Tracking Transparency does not exist on Android. |
112
119
  | The values of the `TEST_*` constants | They are Google's own demo unit IDs, deliberately different per platform. |
113
120
  | `isTestDevice()` | iOS answers "are any test devices registered?", Android "is this device one?". The iOS SDK does not offer the second. |
@@ -115,17 +122,7 @@ The following differences are classified as SDK limitations and are documented w
115
122
 
116
123
  ## Deferred formats
117
124
 
118
- - Rewarded interstitial
119
- - Native
120
-
121
- Their constants are already exported, but they do not have working cross-platform factories. Implementing one requires a complete native proxy, shared events and payloads, cleanup semantics, tests, examples, and physical validation.
122
-
123
- These formats remain to be implemented to match the modules this one replaces. As of 4 August 2026: `ti.android.admob` `11.1.0` ships proxies for app open, rewarded interstitial and native, and `ti.admob` `8.1.0` on iOS documents an `AD_TYPE_APP_OPEN`. App open ships here on both platforms, which leaves rewarded interstitial and native.
124
-
125
- Decided on 4 August 2026:
126
-
127
- - Rewarded interstitial is planned next. App open came first because it was the only format present in both replaced modules.
128
- - Native remains deferred because none of the applications in progress has a content list that needs ads styled as list items. The decision reflects current use cases, rather than implementation difficulty. A future app with a content feed would justify reconsidering it.
125
+ Native remains reserved without a factory. Its constants are already exported. Implementation requires a complete native proxy, shared events and payloads, cleanup semantics, tests, examples, and physical validation.
129
126
 
130
127
  Each new format must meet the existing contract: a complete native proxy on both platforms, shared events and payloads, terminal cleanup, contract tests, an example, and physical validation.
131
128
 
@@ -137,7 +134,7 @@ The five complements live in `mediation/<network>/` and target the same first re
137
134
  - Keep every adapter out of the core module. A contract test fails if `ios/module.xcconfig`, `android/build.gradle`, the core `pbxproj`, or the core checksum inventory names a network again.
138
135
  - Preserve one JavaScript ad contract and portable diagnostics.
139
136
  - Track privacy manifests, resource bundles, SKAdNetwork guidance, and store disclosure changes with every dependency update.
140
- - Require consumer builds, physical-device tests, and Ad Inspector evidence before release: record hardware evidence separately from simulator integration and Google test ads.
137
+ - Require the consumer build matrix described in the mediation guide before release. Record physical-device coverage separately from simulator integration. Validate each provider with configured accounts, mappings and Ad Inspector before claiming its ad delivery; Google test ads establish integration only.
141
138
  - Evaluate additional networks only when they can be supported on both platforms without fragmenting the public API.
142
139
 
143
140
  ## Longer-term platform work
@@ -4,11 +4,56 @@ The native module is `ti.admob.unified`; this skill is `ti-admob-unified`. It wo
4
4
 
5
5
  ## Provenance
6
6
 
7
- Copied from César's module repository `macCesar/ti.admob.unified`, at clean commit `5b4cbf9347a51c4f959dc262ac1500f82f28b4a0` on 2026-10-11. The source checkout in this workspace is `/Users/cesar/Developer/openSource/TiAdmobUnified/ti.admob.unified`; use the installed package's documentation or the module's actual repository in other environments, not that machine-specific path as a dependency. The 1.0.0 first public release remains under preparation according to this session; re-check its release status when installing later.
7
+ Reviewed against public official **1.0.0** source
8
+ `034843299b2984253988e0ffccb9f6a1c91682c9` on 2026-10-24. Clean local HEAD,
9
+ remote main and Android/iOS annotated release tags match. Repository visibility
10
+ and non-draft/non-prerelease platform releases were verified.
8
11
 
9
- `source-snapshot.json` records original paths, source SHA-256, destination hashes and rebased Markdown links. Eleven official `documentation/*.md` guides are preserved, with dependency inventory, roadmap, contributing guide, upstream changelog and module license. Each Markdown file adds a source line and rewrites relative links (with any separately recorded broken-anchor correction) so they resolve inside the skill. Long API/banner references add generated TOCs. This provenance applies to the copied references, not to TiTools' curated `game-monetization.md` or this note.
12
+ | Platform | Published downloads | Verified core ZIP SHA-256 |
13
+ | --- | --- | --- |
14
+ | Android | [android-1.0.0](https://github.com/macCesar/ti.admob.unified/releases/tag/android-1.0.0) | `533ae21b6462ba2d773209f91ea607e975ce34413b165c1d77a34fc5680ec055` |
15
+ | iOS | [ios-1.0.0](https://github.com/macCesar/ti.admob.unified/releases/tag/ios-1.0.0) | `665e0ad85c0d343c47bc1b671d57a1f2ac41cb9f57305053c6ab64b7951ebb20` |
10
16
 
11
- `assets/example/lib/ads.js`, `assets/example/library-usage.js` and `assets/example/app.js` are byte-identical official source files. They are application code resources, not scripts to run in Node for ad delivery. The library is intended to be copied unchanged into the consuming app; keep project policies in a separate director/controller. Review native integration on both target platforms.
17
+ Both core archives were downloaded, independently hashed and CRC/manifest
18
+ checked without installation. Each release's SHA256SUMS lists core plus five
19
+ optional network ZIPs; all twelve hashes match published GitHub asset digests.
20
+ Complement binaries were not downloaded or executed. Core manifests require
21
+ Titanium 13.4.1.GA; Android has four ABIs and Apple declares `mac:false`.
22
+ App requirements also include iOS 15+, Android API 24+ and compile SDK 36. Use
23
+ [installation guidance](getting-started.md) and only selected complements;
24
+ installing adapters alone does not configure provider demand.
25
+
26
+ `source-snapshot.json` records each source, original/mirror hash and declared
27
+ link/correction transformations. It covers thirteen official documentation pages,
28
+ dependency/roadmap/contributing/changelog/license material and the public
29
+ [mediation parity comparison](mediation-parity.md). The root README is a reviewed,
30
+ hashed exclusion whose operational requirements map to the available guides.
31
+
32
+ The three official JavaScript resources under `assets/example/` remain
33
+ byte-identical. Copy `lib/ads.js` unchanged; keep app policy/director logic
34
+ outside it. The curated [game guide](game-monetization.md) and this provenance
35
+ note are TiTools contributions rather than upstream mirrors.
36
+
37
+ ## Current source distinctions
38
+
39
+ - Rewarded interstitial and synchronous ATT status query are implemented.
40
+ Read the dedicated format/production guides before integration; older
41
+ unsupported-format guidance does not describe this release.
42
+ - Native `autoReload` is read live at fullscreen close. The other four mutable
43
+ request options affect the next load. Official API/fullscreen prose grouped
44
+ all five as next-load properties; exact reversible errata preserve original
45
+ source hashes while describing current native behavior.
46
+ - Raw proxy `load()`/`show()` do not return success. Manager returns and mocked
47
+ tests do not establish a delivered ad. UMP consent, ATT query, initialization,
48
+ per-format layout and account readiness remain separate boundaries.
49
+ - The iOS collapsed-SVG repair is narrowly scoped to the Google interstitial
50
+ creative case documented in source. Host lifecycle/DOM assertions are not
51
+ new physical visual acceptance or a generic creative replacement API.
52
+
53
+ The earlier skill pin `5b4cbf9` is no longer resolvable in the source checkout.
54
+ The audit uses prior shipped mirrors/library as its documentation baseline and
55
+ verifies current released implementation independently. It does not invent an
56
+ unavailable historical native diff or restore removed private history.
12
57
 
13
58
  ## Source priority and updates
14
59
 
@@ -30,4 +75,6 @@ node scripts/verify-module-snapshot.mjs --source /path/to/ti.admob.unified
30
75
 
31
76
  It reports changed/missing sources, newly added official Markdown, modified shipped mirrors, source dirtiness and commit changes. It performs no fetch, pull, write or hash refresh. Compare the pinned commit to the candidate commit, review the report and relevant native/library changes, then perform only the authorized update. Native-module releases, provider SDK changes and official-doc corrections can all trigger a review.
32
77
 
33
- Snapshot link correction: the official API page still links to `#mediation-diagnostics-and-compatibility` after its heading became `Mediation diagnostics`. The mirrored link targets `#mediation-diagnostics`; `source-snapshot.json` records the exact transformation and tests reconstruct the original source hash. The module repository was not edited. Re-check this correction during the next refresh.
78
+ The old broken mediation heading link was corrected upstream and no longer
79
+ needs a local transformation. Current semantic errata are explicitly recorded
80
+ and reconstructed by the source-fidelity regression.