{"id":"3194637f-900d-4fd3-ab78-f016c4d9790c","shortId":"2n5RYD","kind":"skill","title":"jahro-production","tagline":"Configures Jahro lifecycle controls for safe production deployment including JAHRO_DISABLE, auto-disable, and build validation. Use when the user mentions production builds, release builds, disabling Jahro, shipping, CI/CD, lifecycle controls, or production safety.","description":"# Jahro Production Readiness\n\nHelp users configure Jahro for safe production deployment so debugging tools never leak into release builds.\n\n## Three-Tier Disable Mechanism\n\nJahro evaluates these conditions at startup in priority order:\n\n```\n1. JAHRO_DISABLE defined?           → Disabled (highest priority)\n2. Auto-disable ON + Release build? → Disabled\n3. Enable Jahro switch              → Uses switch value (lowest priority)\n```\n\n### Tier 1: JAHRO_DISABLE Preprocessor Define\n\n**What:** Compile-time disable. When defined, Jahro exits at initialization regardless of all other settings.\n\n**How to set:**\n1. Open **Edit → Project Settings → Player**\n2. Under **Other Settings → Scripting Define Symbols**\n3. Add `JAHRO_DISABLE` (semicolon-separated if other defines exist: `MY_DEFINE;JAHRO_DISABLE`)\n\n**When to use:** CI/CD pipelines, absolute control, platform-specific disabling (set per-platform defines).\n\n**Validation:** Build logs show \"Jahro Console: Disabled in this build\".\n\n### Tier 2: Auto-disable in Release Builds\n\n**What:** Runtime check. Jahro checks `Debug.isDebugBuild` at startup. If `false` (Release build) and this setting is ON, Jahro disables itself.\n\n**How to set:**\n1. Open **Tools → Jahro Settings → General Settings**\n2. Enable **Auto-disable in Release Builds**\n\n**When to use:** Recommended default for most projects. Development and Debug builds keep Jahro active; Release builds automatically disable it.\n\n**Validation:** Same build log message when triggered.\n\n### Tier 3: Manual Enable/Disable\n\n**What:** The master toggle in Jahro Settings.\n\n**How to set:** Tools → Jahro Settings → General Settings → **Enable Jahro**\n\n**When to use:** Temporarily disable during development (e.g., testing without Jahro interference).\n\n### Recommendation\n\nFor most projects:\n1. Enable **Auto-disable in Release Builds** (Tier 2) — this is sufficient\n2. Add **JAHRO_DISABLE** (Tier 1) in CI/CD for extra safety\n3. Leave the manual toggle ON for development\n\n## Lifecycle\n\n### Initialization (BeforeSplashScreen)\n\nJahro initializes via `[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSplashScreen)]`:\n\n1. Loads settings from `Assets/Jahro/Resources/jahro-settings.asset`\n2. Evaluates the three-tier disable logic\n3. If disabled: logs \"Jahro Console: Disabled in this build\" and **exits early** — minimal overhead\n4. If enabled: sets up logging infrastructure, then continues to runtime boot\n\nThe `BeforeSplashScreen` timing ensures Jahro is ready before any game code runs, so it captures logs from the very start.\n\n### Runtime Boot\n\nAfter initialization (if enabled):\n- Initializes console storage and UI view\n- Verifies API key, starts session\n- Injects UI manager (window, tabs, launch button)\n- Binds hotkeys and mobile activation\n\n### Shutdown\n\nTriggered on app quit, assembly reload, or explicit `Jahro.Release()`:\n- Saves console state (window size, position, favorites)\n- Disposes logger, destroys UI\n- Ends Jahro session\n\n## CI/CD Guidance\n\n### Setting JAHRO_DISABLE per build configuration\n\nIn your build script or CI/CD pipeline:\n\n```csharp\n// In a custom build script\nPlayerSettings.SetScriptingDefineSymbolsForGroup(\n    BuildTargetGroup.Android,\n    \"JAHRO_DISABLE;OTHER_DEFINES\");\n```\n\nOr via command line:\n\n```bash\nunity -batchmode -executeMethod Build.PerformReleaseBuild \\\n  -define \"JAHRO_DISABLE\"\n```\n\n### Build log validation\n\nAfter a Release build, verify Jahro is properly disabled:\n\n```\n// Expected in build log output:\nJahro Console: Disabled in this build\n```\n\nIf this message is absent and Jahro was expected to be disabled, check:\n- `JAHRO_DISABLE` is in the correct platform's Scripting Define Symbols\n- Auto-disable is ON and the build is actually a Release build (not Development)\n\n## Runtime Validation Code\n\nAdd this to verify Jahro's state in a build:\n\n```csharp\nvoid Start()\n{\n    #if JAHRO_DISABLE\n    Debug.Log(\"JAHRO_DISABLE is defined — Jahro stripped at compile time\");\n    #else\n    Debug.Log($\"Jahro.Enabled: {Jahro.Enabled}\");\n    if (Jahro.Enabled)\n        Debug.LogWarning(\"Jahro is ENABLED in this build — is this intentional?\");\n    #endif\n}\n```\n\n## Production Readiness Checklist\n\nUse this checklist before shipping:\n\n- [ ] **Auto-disable in Release Builds** is ON in Tools → Jahro Settings\n- [ ] (Optional) **JAHRO_DISABLE** added to Scripting Define Symbols for release platform\n- [ ] Build configuration is **Release** (not Development Build)\n- [ ] Build log contains \"Jahro Console: Disabled in this build\"\n- [ ] Test the Release build: pressing ~ or triple-tap does NOT open console\n- [ ] `Jahro.Enabled` returns `false` at runtime in the Release build\n- [ ] `jahro-settings.asset` is committed to version control with correct settings\n- [ ] API key is NOT exposed in public builds (Jahro handles this — when disabled, no network calls are made)\n\n## Role-Based Access (Team Projects)\n\nFor teams using the Jahro web console:\n\n| Role | Permissions |\n|:-----|:------------|\n| **Owner** | Billing, subscription, team settings, role assignment, ownership transfer |\n| **Admin** | Manage members (except Owner), configure integrations, access all content |\n| **Member** | Create/view/edit snapshots, interact with assigned content |\n\nConfigure roles at **console.jahro.io** → Team Settings.\n\n## Contextual Awareness\n\n| Pattern | Suggestion |\n|:--------|:-----------|\n| User mentions \"release build\" or \"shipping\" | Guide through production checklist |\n| User mentions CI/CD or build pipeline | Show JAHRO_DISABLE in build scripts |\n| User has JAHRO_DISABLE but expects Jahro to work | Explain priority: define overrides everything |\n| User asks about performance in production | Reassure: disabled Jahro exits early with near-zero overhead |\n\n## Verification\n\n> **Verify:** Make a Release build (not Development Build). Run it. Confirm:\n> 1. Build log shows \"Jahro Console: Disabled in this build\"\n> 2. Console does NOT open on ~ or triple-tap\n> 3. `Jahro.Enabled` returns `false`\n>\n> Then make a Development Build and confirm Jahro works normally.","tags":["jahro","production","unity","agent","skills","jahro-console","agent-skills","ai-assistant","ai-coding","claude-code","cursor","debugging"],"capabilities":["skill","source-jahro-console","skill-jahro-production","topic-agent-skills","topic-ai-assistant","topic-ai-coding","topic-claude-code","topic-cursor","topic-debugging","topic-gamedev","topic-in-game-console","topic-jahro","topic-logging","topic-unity","topic-unity-package"],"categories":["unity-agent-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/jahro-console/unity-agent-skills/jahro-production","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add jahro-console/unity-agent-skills","source_repo":"https://github.com/jahro-console/unity-agent-skills","install_from":"skills.sh"}},"qualityScore":"0.456","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 12 github stars · SKILL.md body (6,029 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:07:09.235Z","embedding":null,"createdAt":"2026-04-23T13:04:13.855Z","updatedAt":"2026-05-18T19:07:09.235Z","lastSeenAt":"2026-05-18T19:07:09.235Z","tsv":"'1':72,97,121,206,285,303,325,796 '2':79,127,176,213,294,298,330,806 '3':87,134,249,309,338,816 '4':353 'absent':504 'absolut':154 'access':684,712 'activ':235,413 'actual':533 'ad':608 'add':135,299,542 'admin':705 'api':398,663 'app':417 'ask':769 'assembl':419 'assets/jahro/resources/jahro-settings.asset':329 'assign':702,720 'auto':16,81,178,216,288,525,594 'auto-dis':15,80,177,215,287,524,593 'automat':238 'awar':729 'base':683 'bash':469 'batchmod':471 'beforesplashscreen':319,366 'bill':697 'bind':409 'boot':364,386 'build':19,27,29,57,85,166,174,182,194,220,232,237,243,292,347,444,448,457,477,483,491,499,531,536,551,580,598,616,622,623,631,635,653,670,735,746,752,789,792,797,805,824 'build.performreleasebuild':473 'buildtargetgroup.android':460 'button':408 'call':678 'captur':379 'check':185,187,512 'checklist':587,590,741 'ci/cd':33,152,305,438,451,744 'code':375,541 'command':467 'commit':656 'compil':104,566 'compile-tim':103 'condit':66 'configur':4,44,445,617,710,722 'confirm':795,826 'consol':170,343,392,425,495,627,644,693,801,807 'console.jahro.io':725 'contain':625 'content':714,721 'contextu':728 'continu':361 'control':7,35,155,659 'correct':518,661 'create/view/edit':716 'csharp':453,552 'custom':456 'debug':51,231 'debug.isdebugbuild':188 'debug.log':558,569 'debug.logwarning':574 'default':225 'defin':75,101,108,132,143,146,164,464,474,522,562,611,765 'deploy':11,49 'destroy':433 'develop':229,275,316,538,621,791,823 'disabl':14,17,30,61,74,76,82,86,99,106,137,148,159,171,179,201,217,239,273,289,301,336,340,344,442,462,476,488,496,511,514,526,557,560,595,607,628,675,750,757,775,802 'dispos':431 'e.g':276 'earli':350,778 'edit':123 'els':568 'enabl':88,214,267,286,355,390,577 'enable/disable':251 'end':435 'endif':584 'ensur':368 'evalu':64,331 'everyth':767 'except':708 'executemethod':472 'exist':144 'exit':110,349,777 'expect':489,508,759 'explain':763 'explicit':422 'expos':667 'extra':307 'fals':192,647,819 'favorit':430 'game':374 'general':211,265 'guid':738 'guidanc':439 'handl':672 'help':42 'highest':77 'hotkey':410 'includ':12 'infrastructur':359 'initi':112,318,321,388,391 'inject':402 'integr':711 'intent':583 'interact':718 'interfer':280 'jahro':2,5,13,31,39,45,63,73,89,98,109,136,147,169,186,200,209,234,257,263,268,279,300,320,342,369,436,441,461,475,485,494,506,513,546,556,559,563,575,603,606,626,671,691,749,756,760,776,800,827 'jahro-product':1 'jahro-settings.asset':654 'jahro.enabled':570,571,573,645,817 'jahro.release':423 'keep':233 'key':399,664 'launch':407 'leak':54 'leav':310 'lifecycl':6,34,317 'line':468 'load':326 'log':167,244,341,358,380,478,492,624,798 'logger':432 'logic':337 'lowest':94 'made':680 'make':786,821 'manag':404,706 'manual':250,312 'master':254 'mechan':62 'member':707,715 'mention':25,733,743 'messag':245,502 'minim':351 'mobil':412 'near':781 'near-zero':780 'network':677 'never':53 'normal':829 'open':122,207,643,810 'option':605 'order':71 'output':493 'overhead':352,783 'overrid':766 'owner':696,709 'ownership':703 'pattern':730 'per':162,443 'per-platform':161 'perform':771 'permiss':695 'pipelin':153,452,747 'platform':157,163,519,615 'platform-specif':156 'player':126 'playersettings.setscriptingdefinesymbolsforgroup':459 'posit':429 'preprocessor':100 'press':636 'prioriti':70,78,95,764 'product':3,10,26,37,40,48,585,740,773 'project':124,228,284,686 'proper':487 'public':669 'quit':418 'readi':41,371,586 'reassur':774 'recommend':224,281 'regardless':113 'releas':28,56,84,181,193,219,236,291,482,535,597,614,619,634,652,734,788 'reload':420 'return':646,818 'role':682,694,701,723 'role-bas':681 'run':376,793 'runtim':184,363,385,539,649 'runtimeinitializeloadtype.beforesplashscreen':324 'runtimeinitializeonloadmethod':323 'safe':9,47 'safeti':38,308 'save':424 'script':131,449,458,521,610,753 'semicolon':139 'semicolon-separ':138 'separ':140 'session':401,437 'set':117,120,125,130,160,197,205,210,212,258,261,264,266,327,356,440,604,662,700,727 'ship':32,592,737 'show':168,748,799 'shutdown':414 'size':428 'skill' 'skill-jahro-production' 'snapshot':717 'source-jahro-console' 'specif':158 'start':384,400,554 'startup':68,190 'state':426,548 'storag':393 'strip':564 'subscript':698 'suffici':297 'suggest':731 'switch':90,92 'symbol':133,523,612 'tab':406 'tap':640,815 'team':685,688,699,726 'temporarili':272 'test':277,632 'three':59,334 'three-tier':58,333 'tier':60,96,175,248,293,302,335 'time':105,367,567 'toggl':255,313 'tool':52,208,262,602 'topic-agent-skills' 'topic-ai-assistant' 'topic-ai-coding' 'topic-claude-code' 'topic-cursor' 'topic-debugging' 'topic-gamedev' 'topic-in-game-console' 'topic-jahro' 'topic-logging' 'topic-unity' 'topic-unity-package' 'transfer':704 'trigger':247,415 'tripl':639,814 'triple-tap':638,813 'ui':395,403,434 'uniti':470 'use':21,91,151,223,271,588,689 'user':24,43,732,742,754,768 'valid':20,165,241,479,540 'valu':93 'verif':784 'verifi':397,484,545,785 'version':658 'via':322,466 'view':396 'void':553 'web':692 'window':405,427 'without':278 'work':762,828 'zero':782","prices":[{"id":"c64f8233-9ac8-497a-a244-1ac19a1d0894","listingId":"3194637f-900d-4fd3-ab78-f016c4d9790c","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"jahro-console","category":"unity-agent-skills","install_from":"skills.sh"},"createdAt":"2026-04-23T13:04:13.855Z"}],"sources":[{"listingId":"3194637f-900d-4fd3-ab78-f016c4d9790c","source":"github","sourceId":"jahro-console/unity-agent-skills/jahro-production","sourceUrl":"https://github.com/jahro-console/unity-agent-skills/tree/main/skills/jahro-production","isPrimary":false,"firstSeenAt":"2026-04-23T13:04:13.855Z","lastSeenAt":"2026-05-18T19:07:09.235Z"}],"details":{"listingId":"3194637f-900d-4fd3-ab78-f016c4d9790c","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"jahro-console","slug":"jahro-production","github":{"repo":"jahro-console/unity-agent-skills","stars":12,"topics":["agent-skills","ai-assistant","ai-coding","claude-code","cursor","debugging","gamedev","in-game-console","jahro","logging","unity","unity-package","unity3d"],"license":"mit","html_url":"https://github.com/jahro-console/unity-agent-skills","pushed_at":"2026-03-20T15:39:45Z","description":"Agent skills for AI-assisted Unity debugging — structured logging, runtime commands, variable watching, and more","skill_md_sha":"bf552795308a0847a565ff774b2a1a886ee4a1d8","skill_md_path":"skills/jahro-production/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/jahro-console/unity-agent-skills/tree/main/skills/jahro-production"},"layout":"multi","source":"github","category":"unity-agent-skills","frontmatter":{"name":"jahro-production","description":"Configures Jahro lifecycle controls for safe production deployment including JAHRO_DISABLE, auto-disable, and build validation. Use when the user mentions production builds, release builds, disabling Jahro, shipping, CI/CD, lifecycle controls, or production safety."},"skills_sh_url":"https://skills.sh/jahro-console/unity-agent-skills/jahro-production"},"updatedAt":"2026-05-18T19:07:09.235Z"}}