[{"data":1,"prerenderedAt":872},["ShallowReactive",2],{"navigation_docs":3,"-monorepos-misplaced-usages":357,"-monorepos-misplaced-usages-surround":869},[4,22,40,53,78,107,132,153,167,176,347],{"title":5,"path":6,"stem":7,"children":8,"page":21},"Introduction","\u002Fintroduction","1.introduction",[9,13,17],{"title":10,"path":11,"stem":12},"Why the-i18n-kit","\u002Fintroduction\u002Fwhy","1.introduction\u002F1.why",{"title":14,"path":15,"stem":16},"Architecture","\u002Fintroduction\u002Farchitecture","1.introduction\u002F2.architecture",{"title":18,"path":19,"stem":20},"Built for Agents","\u002Fintroduction\u002Fbuilt-for-agents","1.introduction\u002F3.built-for-agents",false,{"title":23,"icon":24,"path":25,"stem":26,"children":27,"page":21},"ESLint Plugin","i-lucide-shield-check","\u002Feslint-plugin","10.eslint-plugin",[28,32,36],{"title":29,"path":30,"stem":31},"Install and Presets","\u002Feslint-plugin\u002Finstall","10.eslint-plugin\u002F1.install",{"title":33,"path":34,"stem":35},"The Rules","\u002Feslint-plugin\u002Frules","10.eslint-plugin\u002F2.rules",{"title":37,"path":38,"stem":39},"Layer-Aware Missing Keys","\u002Feslint-plugin\u002Flayer-aware","10.eslint-plugin\u002F3.layer-aware",{"title":41,"path":42,"stem":43,"children":44,"page":21},"Getting Started","\u002Fgetting-started","2.getting-started",[45,49],{"title":46,"path":47,"stem":48},"Set Up the MCP Server","\u002Fgetting-started\u002Fagent-setup","2.getting-started\u002F1.agent-setup",{"title":50,"path":51,"stem":52},"From an Unconfigured Repository to a Gated CI Job","\u002Fgetting-started\u002Fcold-start","2.getting-started\u002F2.cold-start",{"title":54,"path":55,"stem":56,"children":57,"page":21},"Monorepos","\u002Fmonorepos","3.monorepos",[58,62,66,70,74],{"title":59,"path":60,"stem":61},"Layers","\u002Fmonorepos\u002Flayers","3.monorepos\u002F1.layers",{"title":63,"path":64,"stem":65},"The Consumer Graph","\u002Fmonorepos\u002Fconsumer-graph","3.monorepos\u002F2.consumer-graph",{"title":67,"path":68,"stem":69},"The Shared Library Scenario","\u002Fmonorepos\u002Fshared-libraries","3.monorepos\u002F3.shared-libraries",{"title":71,"path":72,"stem":73},"Duplicates and Divergence","\u002Fmonorepos\u002Fduplicates-and-divergence","3.monorepos\u002F4.duplicates-and-divergence",{"title":75,"path":76,"stem":77},"Misplaced Usages","\u002Fmonorepos\u002Fmisplaced-usages","3.monorepos\u002F5.misplaced-usages",{"title":79,"path":80,"stem":81,"children":82,"page":21},"Frameworks","\u002Fframeworks","4.frameworks",[83,87,91,95,99,103],{"title":84,"path":85,"stem":86},"Detection","\u002Fframeworks\u002Fdetection","4.frameworks\u002F1.detection",{"title":88,"path":89,"stem":90},"Nuxt","\u002Fframeworks\u002Fnuxt","4.frameworks\u002F2.nuxt",{"title":92,"path":93,"stem":94},"Laravel","\u002Fframeworks\u002Flaravel","4.frameworks\u002F3.laravel",{"title":96,"path":97,"stem":98},"Vue","\u002Fframeworks\u002Fvue","4.frameworks\u002F4.vue",{"title":100,"path":101,"stem":102},"React \u002F Next.js","\u002Fframeworks\u002Freact-next","4.frameworks\u002F5.react-next",{"title":104,"path":105,"stem":106},"Generic","\u002Fframeworks\u002Fgeneric","4.frameworks\u002F6.generic",{"title":108,"path":109,"stem":110,"children":111,"page":21},"Configuration","\u002Fconfiguration","5.configuration",[112,116,120,124,128],{"title":113,"path":114,"stem":115},"Where Configuration Lives","\u002Fconfiguration\u002Fwhere-config-lives","5.configuration\u002F1.where-config-lives",{"title":117,"path":118,"stem":119},"Precedence and Conflicts","\u002Fconfiguration\u002Fprecedence","5.configuration\u002F2.precedence",{"title":121,"path":122,"stem":123},"Declared vs. Derived Configuration","\u002Fconfiguration\u002Fdeclared-vs-derived","5.configuration\u002F3.declared-vs-derived",{"title":125,"path":126,"stem":127},"Configuration Fields","\u002Fconfiguration\u002Freference","5.configuration\u002F4.reference",{"title":129,"path":130,"stem":131},"Referring to Locales","\u002Fconfiguration\u002Flocale-refs","5.configuration\u002F5.locale-refs",{"title":133,"path":134,"stem":135,"children":136,"page":21},"Nuxt Module","\u002Fnuxt-module","6.nuxt-module",[137,141,145,149],{"title":138,"path":139,"stem":140},"Install and Setup","\u002Fnuxt-module\u002Finstall","6.nuxt-module\u002F1.install",{"title":142,"path":143,"stem":144},"What It Publishes","\u002Fnuxt-module\u002Fwhat-it-publishes","6.nuxt-module\u002F2.what-it-publishes",{"title":146,"path":147,"stem":148},"What It Validates","\u002Fnuxt-module\u002Fvalidation","6.nuxt-module\u002F3.validation",{"title":150,"path":151,"stem":152},"Options and Limits","\u002Fnuxt-module\u002Foptions-and-limits","6.nuxt-module\u002F4.options-and-limits",{"title":154,"icon":155,"path":156,"stem":157,"children":158,"page":21},"CI\u002FCD","i-lucide-git-pull-request","\u002Fci-cd","7.ci-cd",[159,163],{"title":160,"path":161,"stem":162},"GitHub Actions","\u002Fci-cd\u002Fgithub-actions","7.ci-cd\u002F1.github-actions",{"title":164,"path":165,"stem":166},"GitLab CI","\u002Fci-cd\u002Fgitlab-ci","7.ci-cd\u002F2.gitlab-ci",{"title":168,"path":169,"stem":170,"children":171,"page":21},"Concepts","\u002Fconcepts","8.concepts",[172],{"title":173,"path":174,"stem":175},"Translation Modes","\u002Fconcepts\u002Ftranslation-modes","8.concepts\u002F1.translation-modes",{"title":177,"path":178,"stem":179,"children":180,"page":-1},"Reference","\u002Freference","9.reference",[181,183,261,339,343],{"title":177,"path":178,"stem":182},"9.reference\u002Findex",{"title":184,"path":185,"stem":186,"children":187,"page":-1},"CLI Commands","\u002Freference\u002Fcli","9.reference\u002F1.cli\u002Findex",[188,189,193,197,201,205,209,213,217,221,225,229,233,237,241,245,249,253,257],{"title":184,"path":185,"stem":186},{"title":190,"path":191,"stem":192},"add","\u002Freference\u002Fcli\u002Fadd","9.reference\u002F1.cli\u002Fadd",{"title":194,"path":195,"stem":196},"check","\u002Freference\u002Fcli\u002Fcheck","9.reference\u002F1.cli\u002Fcheck",{"title":198,"path":199,"stem":200},"find-duplicates","\u002Freference\u002Fcli\u002Ffind-duplicates","9.reference\u002F1.cli\u002Ffind-duplicates",{"title":202,"path":203,"stem":204},"get","\u002Freference\u002Fcli\u002Fget","9.reference\u002F1.cli\u002Fget",{"title":206,"path":207,"stem":208},"init","\u002Freference\u002Fcli\u002Finit","9.reference\u002F1.cli\u002Finit",{"title":210,"path":211,"stem":212},"missing","\u002Freference\u002Fcli\u002Fmissing","9.reference\u002F1.cli\u002Fmissing",{"title":214,"path":215,"stem":216},"move","\u002Freference\u002Fcli\u002Fmove","9.reference\u002F1.cli\u002Fmove",{"title":218,"path":219,"stem":220},"remove","\u002Freference\u002Fcli\u002Fremove","9.reference\u002F1.cli\u002Fremove",{"title":222,"path":223,"stem":224},"remove-orphans","\u002Freference\u002Fcli\u002Fremove-orphans","9.reference\u002F1.cli\u002Fremove-orphans",{"title":226,"path":227,"stem":228},"rename","\u002Freference\u002Fcli\u002Frename","9.reference\u002F1.cli\u002Frename",{"title":230,"path":231,"stem":232},"scaffold","\u002Freference\u002Fcli\u002Fscaffold","9.reference\u002F1.cli\u002Fscaffold",{"title":234,"path":235,"stem":236},"scan","\u002Freference\u002Fcli\u002Fscan","9.reference\u002F1.cli\u002Fscan",{"title":238,"path":239,"stem":240},"search","\u002Freference\u002Fcli\u002Fsearch","9.reference\u002F1.cli\u002Fsearch",{"title":242,"path":243,"stem":244},"status","\u002Freference\u002Fcli\u002Fstatus","9.reference\u002F1.cli\u002Fstatus",{"title":246,"path":247,"stem":248},"translate","\u002Freference\u002Fcli\u002Ftranslate","9.reference\u002F1.cli\u002Ftranslate",{"title":250,"path":251,"stem":252},"translate-key","\u002Freference\u002Fcli\u002Ftranslate-key","9.reference\u002F1.cli\u002Ftranslate-key",{"title":254,"path":255,"stem":256},"update","\u002Freference\u002Fcli\u002Fupdate","9.reference\u002F1.cli\u002Fupdate",{"title":258,"path":259,"stem":260},"write","\u002Freference\u002Fcli\u002Fwrite","9.reference\u002F1.cli\u002Fwrite",{"title":262,"path":263,"stem":264,"children":265,"page":-1},"MCP Tools","\u002Freference\u002Fmcp","9.reference\u002F2.mcp\u002Findex",[266,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335],{"title":262,"path":263,"stem":264},{"title":268,"path":269,"stem":270},"discover","\u002Freference\u002Fmcp\u002Fdiscover","9.reference\u002F2.mcp\u002Fdiscover",{"title":272,"path":273,"stem":274},"find_duplicate_keys","\u002Freference\u002Fmcp\u002Ffind_duplicate_keys","9.reference\u002F2.mcp\u002Ffind_duplicate_keys",{"title":276,"path":277,"stem":278},"find_empty_translations","\u002Freference\u002Fmcp\u002Ffind_empty_translations","9.reference\u002F2.mcp\u002Ffind_empty_translations",{"title":280,"path":281,"stem":282},"find_orphan_keys","\u002Freference\u002Fmcp\u002Ffind_orphan_keys","9.reference\u002F2.mcp\u002Ffind_orphan_keys",{"title":284,"path":285,"stem":286},"find_undefined_keys","\u002Freference\u002Fmcp\u002Ffind_undefined_keys","9.reference\u002F2.mcp\u002Ffind_undefined_keys",{"title":288,"path":289,"stem":290},"get_missing_translations","\u002Freference\u002Fmcp\u002Fget_missing_translations","9.reference\u002F2.mcp\u002Fget_missing_translations",{"title":292,"path":293,"stem":294},"get_translation_status","\u002Freference\u002Fmcp\u002Fget_translation_status","9.reference\u002F2.mcp\u002Fget_translation_status",{"title":296,"path":297,"stem":298},"get_translations","\u002Freference\u002Fmcp\u002Fget_translations","9.reference\u002F2.mcp\u002Fget_translations",{"title":300,"path":301,"stem":302},"list_namespaces","\u002Freference\u002Fmcp\u002Flist_namespaces","9.reference\u002F2.mcp\u002Flist_namespaces",{"title":304,"path":305,"stem":306},"move_translation_key","\u002Freference\u002Fmcp\u002Fmove_translation_key","9.reference\u002F2.mcp\u002Fmove_translation_key",{"title":308,"path":309,"stem":310},"remove_orphan_keys","\u002Freference\u002Fmcp\u002Fremove_orphan_keys","9.reference\u002F2.mcp\u002Fremove_orphan_keys",{"title":312,"path":313,"stem":314},"remove_translations","\u002Freference\u002Fmcp\u002Fremove_translations","9.reference\u002F2.mcp\u002Fremove_translations",{"title":316,"path":317,"stem":318},"rename_translation_key","\u002Freference\u002Fmcp\u002Frename_translation_key","9.reference\u002F2.mcp\u002Frename_translation_key",{"title":320,"path":321,"stem":322},"scaffold_locale","\u002Freference\u002Fmcp\u002Fscaffold_locale","9.reference\u002F2.mcp\u002Fscaffold_locale",{"title":324,"path":325,"stem":326},"search_translations","\u002Freference\u002Fmcp\u002Fsearch_translations","9.reference\u002F2.mcp\u002Fsearch_translations",{"title":328,"path":329,"stem":330},"translate_key","\u002Freference\u002Fmcp\u002Ftranslate_key","9.reference\u002F2.mcp\u002Ftranslate_key",{"title":332,"path":333,"stem":334},"translate_missing","\u002Freference\u002Fmcp\u002Ftranslate_missing","9.reference\u002F2.mcp\u002Ftranslate_missing",{"title":336,"path":337,"stem":338},"write_translations","\u002Freference\u002Fmcp\u002Fwrite_translations","9.reference\u002F2.mcp\u002Fwrite_translations",{"title":340,"path":341,"stem":342},"GitHub Action","\u002Freference\u002Faction","9.reference\u002F3.action",{"title":344,"path":345,"stem":346},"Programmatic API","\u002Freference\u002Fprogrammatic-api","9.reference\u002F4.programmatic-api",{"title":348,"icon":349,"path":350,"stem":351,"children":352,"page":21},"Extra Topics","i-lucide-microscope","\u002Fextra-topics","91.extra-topics",[353],{"title":354,"path":355,"stem":356},"How Detection Scores Adapters","\u002Fextra-topics\u002Fdetection-scoring","91.extra-topics\u002F1.detection-scoring",{"id":358,"title":75,"body":359,"description":422,"extension":862,"links":863,"meta":864,"navigation":865,"path":76,"seo":866,"stem":77,"__hash__":868},"docs\u002F3.monorepos\u002F5.misplaced-usages.md",{"type":360,"value":361,"toc":854},"minimark",[362,367,376,395,398,404,408,416,537,545,549,560,621,624,655,659,662,671,748,759,769,776,780,783,816,819,823,850],[363,364,366],"h2",{"id":365},"what-a-misplaced-usage-is","What a Misplaced Usage Is",[368,369,370,371,375],"p",{},"A ",[372,373,374],"strong",{},"misplaced usage"," is a key referenced only from apps that do not consume its\nlayer. It is the third outcome of orphan detection, alongside used and orphaned,\nand it exists because those two labels are both wrong for this case:",[377,378,379,388],"ul",{},[380,381,382,383,387],"li",{},"Calling it ",[384,385,386],"em",{},"used"," would protect a key on the strength of a reference that\ncannot resolve at runtime — the app doing the referencing never loads that\nlayer, so the screen renders the raw key.",[380,389,390,391,394],{},"Calling it an ",[384,392,393],{},"orphan"," would delete a key that a real call site depends on,\nturning a rendering bug into a missing translation in whichever layer the fix\neventually lands in.",[368,396,397],{},"So the scan reports it as its own finding and stops there. The report carries\nthis note verbatim next to the entries:",[399,400,401],"blockquote",{},[368,402,403],{},"Keys referenced only from apps that do not consume their layer. Either the key\nbelongs in a broader (shared) layer, or the usage is a bug. These keys are not\ncounted as orphans and are never removed.",[363,405,407],{"id":406},"reading-an-entry","Reading an Entry",[368,409,410,411,415],{},"A key with no evidence inside its layer's\n",[412,413,414],"a",{"href":64},"scope"," is a candidate orphan. Where the evidence\nexists outside that scope — an exact reference, a bare-string occurrence, or a\ndynamic pattern that could produce the key — it is recorded as misplaced\ninstead:",[417,418,423],"pre",{"className":419,"code":420,"language":421,"meta":422,"style":422},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"misplacedUsages\": [\n    { \"key\": \"checkout.cart.title\", \"layer\": \"checkout\", \"usingApps\": [\"admin\"] }\n  ]\n}\n","json","",[424,425,426,435,454,525,531],"code",{"__ignoreMap":422},[427,428,431],"span",{"class":429,"line":430},"line",1,[427,432,434],{"class":433},"sMK4o","{\n",[427,436,438,441,445,448,451],{"class":429,"line":437},2,[427,439,440],{"class":433},"  \"",[427,442,444],{"class":443},"spNyl","misplacedUsages",[427,446,447],{"class":433},"\"",[427,449,450],{"class":433},":",[427,452,453],{"class":433}," [\n",[427,455,457,460,463,467,469,471,473,477,479,482,484,487,489,491,493,496,498,500,502,505,507,509,512,514,517,519,522],{"class":429,"line":456},3,[427,458,459],{"class":433},"    {",[427,461,462],{"class":433}," \"",[427,464,466],{"class":465},"sBMFI","key",[427,468,447],{"class":433},[427,470,450],{"class":433},[427,472,462],{"class":433},[427,474,476],{"class":475},"sfazB","checkout.cart.title",[427,478,447],{"class":433},[427,480,481],{"class":433},",",[427,483,462],{"class":433},[427,485,486],{"class":465},"layer",[427,488,447],{"class":433},[427,490,450],{"class":433},[427,492,462],{"class":433},[427,494,495],{"class":475},"checkout",[427,497,447],{"class":433},[427,499,481],{"class":433},[427,501,462],{"class":433},[427,503,504],{"class":465},"usingApps",[427,506,447],{"class":433},[427,508,450],{"class":433},[427,510,511],{"class":433}," [",[427,513,447],{"class":433},[427,515,516],{"class":475},"admin",[427,518,447],{"class":433},[427,520,521],{"class":433},"]",[427,523,524],{"class":433}," }\n",[427,526,528],{"class":429,"line":527},4,[427,529,530],{"class":433},"  ]\n",[427,532,534],{"class":429,"line":533},5,[427,535,536],{"class":433},"}\n",[368,538,539,541,542,544],{},[424,540,486],{}," is where the key is defined; ",[424,543,504],{}," names the out-of-scope\ndirectories that referenced it — an app's name where an app owns the directory,\nand a layer's name otherwise, so an entry can name a layer rather than an app.",[363,546,548],{"id":547},"they-are-reported-never-removed","They Are Reported, Never Removed",[368,550,551,552,555,556,559],{},"Only ",[424,553,554],{},"orphanKeys"," is ever deleted, and that is not a default you can flip. The\nsame holds for ",[424,557,558],{},"uncertainKeys",", the keys whose evidence overlaps a dynamic\npattern: reported every run, removed by nothing.",[561,562,563,579],"table",{},[564,565,566],"thead",{},[567,568,569,573,576],"tr",{},[570,571,572],"th",{},"Bucket",[570,574,575],{},"Meaning",[570,577,578],{},"Removed",[580,581,582,598,610],"tbody",{},[567,583,584,589,592],{},[585,586,587],"td",{},[424,588,554],{},[585,590,591],{},"No evidence of use in any app that consumes the layer",[585,593,594,595],{},"Yes, on ",[424,596,597],{},"--no-dry-run",[567,599,600,604,607],{},[585,601,602],{},[424,603,558],{},[585,605,606],{},"Evidence is ambiguous — a dynamic pattern could produce the key",[585,608,609],{},"Never",[567,611,612,616,619],{},[585,613,614],{},[424,615,444],{},[585,617,618],{},"Referenced only from apps that do not consume the layer",[585,620,609],{},[368,622,623],{},"Two consequences worth knowing:",[377,625,626,636],{},[380,627,628,631,632,635],{},[424,629,630],{},"summary.usedCount"," excludes misplaced keys, and ",[424,633,634],{},"summary.misplacedCount","\ncounts them separately, so a misplaced key never inflates your used total.",[380,637,638,639,642,643,646,647,650,651,654],{},"The ",[424,640,641],{},"--fail-on-orphans"," gate reads ",[424,644,645],{},"orphanCount",". Misplaced usages do not trip\nit. If you want them to fail a pipeline, read ",[424,648,649],{},"misplacedCount"," from the report.\nThe Code Quality report written by ",[424,652,653],{},"--codequality-output"," likewise contains\norphan findings only.",[363,656,658],{"id":657},"fixing-one","Fixing One",[368,660,661],{},"Every entry is one of two situations, and the report cannot tell them apart —\nonly you know which app is supposed to own the string.",[368,663,664,667,668,670],{},[372,665,666],{},"The key is in the wrong layer."," The referencing app is legitimate and the key\nbelongs somewhere it can reach: a shared layer both apps consume, or that app's\nown layer. There is no cross-layer move — ",[424,669,226],{}," operates within one layer —\nso write the key into the target layer and remove it from the old one:",[417,672,676],{"className":673,"code":674,"language":675,"meta":422,"style":422},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","the-i18n-cli get --layer checkout --locale '*' --keys checkout.cart.title\nthe-i18n-cli write --layer admin --translations '{\"checkout.cart.title\": {\"en\": \"Your cart\", \"de\": \"Ihr Warenkorb\"}}'\nthe-i18n-cli remove --layer checkout --keys checkout.cart.title\n","bash",[424,677,678,710,733],{"__ignoreMap":422},[427,679,680,683,686,689,692,695,698,701,704,707],{"class":429,"line":430},[427,681,682],{"class":465},"the-i18n-cli",[427,684,685],{"class":475}," get",[427,687,688],{"class":475}," --layer",[427,690,691],{"class":475}," checkout",[427,693,694],{"class":475}," --locale",[427,696,697],{"class":433}," '",[427,699,700],{"class":475},"*",[427,702,703],{"class":433},"'",[427,705,706],{"class":475}," --keys",[427,708,709],{"class":475}," checkout.cart.title\n",[427,711,712,714,717,719,722,725,727,730],{"class":429,"line":437},[427,713,682],{"class":465},[427,715,716],{"class":475}," write",[427,718,688],{"class":475},[427,720,721],{"class":475}," admin",[427,723,724],{"class":475}," --translations",[427,726,697],{"class":433},[427,728,729],{"class":475},"{\"checkout.cart.title\": {\"en\": \"Your cart\", \"de\": \"Ihr Warenkorb\"}}",[427,731,732],{"class":433},"'\n",[427,734,735,737,740,742,744,746],{"class":429,"line":456},[427,736,682],{"class":465},[427,738,739],{"class":475}," remove",[427,741,688],{"class":475},[427,743,691],{"class":475},[427,745,706],{"class":475},[427,747,709],{"class":475},[368,749,750,751,754,755,758],{},"Read the values first with ",[424,752,753],{},"--locale '*'"," so every locale moves, not only the\nreference one. If the key's namespace no longer fits its new home, rename it\ninside the target layer afterwards with ",[424,756,757],{},"the-i18n-cli rename",", which updates\nevery locale file at once.",[368,760,761,764,765,768],{},[372,762,763],{},"The usage is a bug."," The referencing app was never meant to render that\nstring — a copied component, a stale import. Fix the call site to use a key its\nown layers define, and the finding disappears on the next run. ",[424,766,767],{},"the-i18n-cli check"," is the view from the other side: it reports keys referenced in code that\nno layer the app consumes defines, which is the same defect seen from the call\nsite.",[368,770,771,772,775],{},"A third possibility, rarer but real: the app ",[384,773,774],{},"should"," consume that layer and the\nproject does not say so. Then the fix is in the app's own configuration, and the\ngraph picks it up on the next run.",[363,777,779],{"id":778},"when-you-will-not-see-any","When You Will Not See Any",[368,781,782],{},"Misplaced usages need at least one directory outside a layer's scope. They are\nabsent whenever there is none:",[377,784,785,791,797],{},[380,786,787,790],{},[372,788,789],{},"Single-app projects"," — the app's scope is the whole project, so nothing is\nout of scope.",[380,792,793,796],{},[372,794,795],{},"Configurations with no app information"," — every layer is checked against\nthe whole project.",[380,798,799,802,803,806,807,809,810,812,813,815],{},[372,800,801],{},"Explicit scan directories"," — passing ",[424,804,805],{},"scanDirs"," to ",[424,808,280],{},",\n",[424,811,308],{}," or their programmatic equivalents switches to one\ncombined usage set for all layers, and misplaced-usage detection is off. Use\nit when you deliberately want the unscoped behavior; an empty\n",[424,814,444],{}," from such a run says nothing about the project.",[368,817,818],{},"Since app-to-layer edges are derived today only for Nuxt monorepos, those are\nalso the projects where this finding appears at all. Everywhere else the scan\nstill runs, still reports per layer, and still refuses to remove anything it is\nunsure about — there is no second app to be misplaced from.",[363,820,822],{"id":821},"limits","Limits",[377,824,825,832,843],{},[380,826,827,828,831],{},"Detection is only as sharp as the evidence classes the scanner recognizes. A\nkey built at runtime from data the scanner cannot see is neither used nor\nmisplaced; it is a candidate orphan, which is why dry runs and\n",[424,829,830],{},"orphanScan.ignorePatterns"," exist.",[380,833,834,835,838,839,842],{},"A dynamic pattern in an out-of-scope app matches conservatively. An expression\nlike ",[424,836,837],{},"t(`${prefix}.title`)"," in a non-consuming app can mark every ",[424,840,841],{},".title","\nkey in another layer as misplaced. Keep a literal leading segment in dynamic\nkeys and the report stays specific.",[380,844,845,846,849],{},"The finding names apps and layers, not files. To see where the references\nare, run ",[424,847,848],{},"the-i18n-cli scan --keys \u003Ckey>"," for the key in question.",[851,852,853],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":422,"searchDepth":456,"depth":456,"links":855},[856,857,858,859,860,861],{"id":365,"depth":437,"text":366},{"id":406,"depth":437,"text":407},{"id":547,"depth":437,"text":548},{"id":657,"depth":437,"text":658},{"id":778,"depth":437,"text":779},{"id":821,"depth":437,"text":822},"md",null,{},true,{"description":867,"title":75},"Keys referenced only from apps that do not consume their layer — how they are detected, why they are reported but never removed, and how to fix each one.","kg6hM1MbbX3BxDoL9Ru2m1UPyb_5NH3eNm3TnaGJ9hA",[870,871],{"title":71,"path":72,"stem":73,"description":422,"children":-1},{"title":84,"path":85,"stem":86,"description":422,"children":-1},1787604647516]