tillerhand 3.48.1 → 3.49.1

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 (108) hide show
  1. package/.claude/agents/board-chair.md +1 -1
  2. package/.claude/agents/security-auditor.md +1 -1
  3. package/.claude/agents/test-writer.md +1 -1
  4. package/.claude/board/board-product.md +1 -1
  5. package/.claude/board/council.md +1 -1
  6. package/.claude/board/rules.md +6 -6
  7. package/.claude/commands/adopt.md +3 -3
  8. package/.claude/commands/ask-mode.md +4 -4
  9. package/.claude/commands/board.md +1 -1
  10. package/.claude/commands/build.md +1 -1
  11. package/.claude/commands/design.md +4 -4
  12. package/.claude/commands/findings-business.md +1 -1
  13. package/.claude/commands/findings-legal.md +1 -1
  14. package/.claude/commands/findings-perf.md +1 -1
  15. package/.claude/commands/findings-security.md +2 -2
  16. package/.claude/commands/findings-tech.md +1 -1
  17. package/.claude/commands/findings-ux.md +1 -1
  18. package/.claude/commands/fix-bug.md +2 -2
  19. package/.claude/commands/handoff.md +2 -2
  20. package/.claude/commands/kit-update.md +2 -2
  21. package/.claude/commands/qa.md +1 -1
  22. package/.claude/commands/release.md +2 -2
  23. package/.claude/commands/research.md +3 -3
  24. package/.claude/commands/retro.md +1 -1
  25. package/.claude/commands/rollback.md +3 -3
  26. package/.claude/commands/start.md +4 -4
  27. package/.claude/commands/tools.md +1 -1
  28. package/.claude/commands/user-feedback.md +1 -1
  29. package/.claude/findings/lenses/business.md +1 -1
  30. package/.claude/findings/protocol.md +2 -2
  31. package/.claude/hooks/budget.mjs +1 -1
  32. package/.claude/hooks/checkpoint.mjs +2 -2
  33. package/.claude/hooks/commit-gate.mjs +18 -17
  34. package/.claude/hooks/council.mjs +37 -52
  35. package/.claude/hooks/dashboard-data.mjs +34 -42
  36. package/.claude/hooks/dashboard.mjs +18 -20
  37. package/.claude/hooks/destructive-guard.mjs +2 -2
  38. package/.claude/hooks/flow.mjs +1 -1
  39. package/.claude/hooks/freeze-guard.mjs +2 -2
  40. package/.claude/hooks/gate.mjs +21 -13
  41. package/.claude/hooks/labels.mjs +92 -152
  42. package/.claude/hooks/lang.mjs +25 -9
  43. package/.claude/hooks/messages.mjs +497 -494
  44. package/.claude/hooks/notify.mjs +1 -1
  45. package/.claude/hooks/prefs.mjs +10 -18
  46. package/.claude/hooks/preview.mjs +1 -1
  47. package/.claude/hooks/progress.mjs +7 -9
  48. package/.claude/hooks/qa-report.mjs +1 -3
  49. package/.claude/hooks/session-start.mjs +2 -3
  50. package/.claude/hooks/status-read.mjs +5 -5
  51. package/.claude/hooks/statusline.mjs +4 -4
  52. package/.claude/hooks/tools.mjs +3 -7
  53. package/.claude/hooks/usage.mjs +2 -2
  54. package/.claude/i18n/tr.json +496 -0
  55. package/.claude/security-patterns.json +1 -1
  56. package/.claude/skills/logo-design/SKILL.md +2 -2
  57. package/.claude/skills/motion-video/SKILL.md +1 -1
  58. package/.claude/skills/source-research/SKILL.md +1 -1
  59. package/.claude/skills/ui-motion/SKILL.md +1 -1
  60. package/AGENTS.md +1 -1
  61. package/CHANGELOG.md +1 -1
  62. package/README.md +2 -2
  63. package/README.tr.md +2 -2
  64. package/docs/architecture/overview.md +1 -1
  65. package/docs/decisions/log.md +1 -1
  66. package/docs/legal/privacy-kvkk.md +35 -35
  67. package/docs/operations/deploy-setup.md +1 -1
  68. package/docs/operations/feature-flags.md +1 -1
  69. package/docs/product/glossary.md +3 -3
  70. package/docs/product/launch.md +1 -1
  71. package/docs/product/prd.md +2 -2
  72. package/docs/product/roadmap.md +1 -1
  73. package/docs/product/specs/_template.md +1 -1
  74. package/docs/product/unit-economics.md +1 -1
  75. package/docs/quality/test-plan.md +5 -5
  76. package/docs/workflow/decision-protocol.md +1 -2
  77. package/docs/workflow/mcp-catalog.md +1 -1
  78. package/docs/workflow/skills.md +2 -2
  79. package/docs/workflow/usage-limits.md +1 -1
  80. package/kit/CHANGELOG.md +34 -0
  81. package/kit/VERSION +1 -1
  82. package/kit/guide.html +56 -56
  83. package/kit/guide.tr.html +10 -10
  84. package/kit/kit.mjs +7 -42
  85. package/kit/templates/addons/ai/.env.example.append +3 -3
  86. package/kit/templates/addons/tr/docs/legal/turkiye.md +55 -55
  87. package/kit/templates/addons/tr/types/backend/.env.example.append +2 -2
  88. package/kit/templates/addons/tr/types/backend/app/shared/payments.py +1 -1
  89. package/kit/templates/addons/tr/types/backend/tests/security/test_payment_webhook.py +3 -3
  90. package/kit/templates/addons/tr/types/web-saas/.env.example.append +2 -2
  91. package/kit/templates/addons/tr/types/web-saas/.github/workflows/payment-webhook.yml +3 -3
  92. package/kit/templates/addons/tr/types/web-saas/src/lib/payments/webhook-signature.ts +1 -1
  93. package/kit/templates/addons/tr/types/web-saas/tests/security/payment-webhook.mjs +4 -4
  94. package/kit/templates/backend/.github/dependabot.yml +1 -1
  95. package/kit/templates/backend/.github/workflows/live-monitoring.yml +1 -1
  96. package/kit/templates/backend/docs/architecture/stack.md +3 -3
  97. package/kit/templates/mobile/.github/dependabot.yml +1 -1
  98. package/kit/templates/mobile/.github/workflows/ci.yml +2 -2
  99. package/kit/templates/mobile/docs/architecture/stack.md +4 -4
  100. package/kit/templates/mobile/docs/architecture/structure.md +1 -1
  101. package/kit/templates/mobile/docs/design/design-guide.md +1 -1
  102. package/kit/templates/web-saas/.github/dependabot.yml +1 -1
  103. package/kit/templates/web-saas/.github/workflows/ci.yml +2 -2
  104. package/kit/templates/web-saas/.github/workflows/live-monitoring.yml +1 -1
  105. package/kit/templates/web-saas/docs/architecture/stack.md +4 -4
  106. package/kit/templates/web-saas/docs/design/design-guide.md +1 -1
  107. package/kit/tools/antigravity/.agents/hooks.json +5 -5
  108. package/package.json +1 -1
@@ -1,496 +1,499 @@
1
- // Text hooks show the user directly, in Turkish and English. Other languages: .claude/i18n/<lang>.json, written once by the AI
2
- // (node .claude/hooks/lang.mjs --export → translate → --write). Words in braces ({command}, {step}) are placeholders; keep them in every translation.
1
+ // Text hooks show the user directly, in English. Every other language (Turkish included) is .claude/i18n/<lang>.json:
2
+ // tr ships with the kit; others are written once by the AI (node .claude/hooks/lang.mjs --export → translate → --write).
3
+ // Words in braces ({command}, {step}) are placeholders; keep them in every translation.
3
4
  export const MESSAGES = {
4
- 'session.begin': { tr: 'Başlamak için: /start [proje fikrin] · var olan projede: /adopt', en: 'To begin: /start [your project idea] · existing project: /adopt' },
5
- 'session.resume': { tr: 'Devam: {command} (adım {step})', en: 'Continue: {command} (step {step})' },
6
- 'session.next': { tr: 'Sıradaki: /build {code} · {title}', en: 'Next: /build {code} · {title}' },
7
- 'session.handoff': { tr: 'Devir notu var: /handoff take', en: 'Handoff note waiting: /handoff take' },
8
- 'session.handoffThen': { tr: 'Devir notu var: /handoff take · sonra {next}', en: 'Handoff note waiting: /handoff take · then {next}' },
9
- 'dashboard.title': { tr: 'Kontrol paneli', en: 'Dashboard' },
10
- 'dashboard.sevCritical': { tr: 'Kritik', en: 'Critical' },
11
- 'dashboard.sevWarn': { tr: 'Dikkat', en: 'Attention' },
12
- 'dashboard.sevInfo': { tr: 'Bilgi', en: 'Info' },
13
- 'dashboard.sevGood': { tr: 'Yolunda', en: 'On track' },
14
- 'dashboard.healthWarn': { tr: 'Dikkat gerekiyor', en: 'Needs attention' },
15
- 'dashboard.healthCritical': { tr: 'Engel var', en: 'Blocked' },
16
- 'dashboard.kitNotInstalled': { tr: 'kit kurulmadı', en: 'kit not set up' },
17
- 'dashboard.kitVersion': { tr: 'kit {version}', en: 'kit {version}' },
18
- 'dashboard.autoRefresh': { tr: '30 sn\'de yenile', en: 'Refresh every 30 s' },
19
- 'dashboard.now': { tr: 'Şimdi', en: 'Now' },
20
- 'dashboard.questionMode': { tr: 'Soru modu', en: 'Question mode' },
21
- 'dashboard.profile': { tr: 'Profil', en: 'Profile' },
22
- 'dashboard.lastUpdate': { tr: 'Son güncelleme', en: 'Last updated' },
23
- 'dashboard.startStep': { tr: 'Başlangıç adımı', en: 'Start step' },
24
- 'dashboard.nextStep': { tr: 'Sıradaki adım', en: 'Next step' },
25
- 'dashboard.pasteHint': { tr: 'Kopyala, Claude sohbetine yapıştır.', en: 'Copy it and paste it into the Claude chat.' },
26
- 'dashboard.status': { tr: 'Durum', en: 'Status' },
27
- 'dashboard.attention': { tr: 'Dikkat gerektirenler', en: 'Needs attention' },
28
- 'dashboard.moreItems': { tr: '{count} madde daha', en: '{count} more' },
29
- 'dashboard.allGood': { tr: 'Her şey yolunda', en: 'All good' },
30
- 'dashboard.allGoodText': { tr: 'Bekleyen karar, kritik bulgu veya açık sorun yok.', en: 'No pending decision, critical finding or open issue.' },
31
- 'dashboard.copy': { tr: 'Kopyala', en: 'Copy' },
32
- 'dashboard.copied': { tr: 'Kopyalandı', en: 'Copied' },
33
- 'dashboard.copyFailed': { tr: 'Kopyalanamadı', en: 'Copy failed' },
34
- 'dashboard.copyAria': { tr: '{command} komutunu kopyala', en: 'Copy the {command} command' },
35
- 'dashboard.startIdeaCode': { tr: '`/start [fikrin]`', en: '`/start [your idea]`' },
36
- 'dashboard.kpiTasks': { tr: 'Görevler', en: 'Tasks' },
37
- 'dashboard.donePct': { tr: '%{percent} tamam', en: '{percent}% done' },
38
- 'dashboard.acceptanceTests': { tr: 'Kabul testleri', en: 'Acceptance tests' },
39
- 'dashboard.criteriaTested': { tr: '{count} kriterin testi var', en: '{count} criteria have a test' },
40
- 'dashboard.kpiMvp': { tr: 'MVP kriterleri', en: 'MVP criteria' },
41
- 'dashboard.featuresCount': { tr: '{count} özellik', en: '{count} features' },
42
- 'dashboard.kpiDecisions': { tr: 'Kararlar', en: 'Decisions' },
43
- 'dashboard.usersAuto': { tr: '{user} kullanıcı · {auto} otomatik', en: '{user} user · {auto} auto' },
44
- 'dashboard.board': { tr: 'Kurul', en: 'Board' },
45
- 'dashboard.rejects': { tr: '{count} ret', en: '{count} rejected' },
46
- 'dashboard.kpiRejects': { tr: 'Ret', en: 'Rejected' },
47
- 'dashboard.membersCount': { tr: '{count} üye', en: '{count} members' },
48
- 'dashboard.kpiCommits7': { tr: 'Commit · 7 gün', en: 'Commits · 7 days' },
49
- 'dashboard.filesWaiting': { tr: '{count} dosya bekliyor', en: '{count} files waiting' },
50
- 'dashboard.noGit': { tr: 'git yok', en: 'no git' },
51
- 'dashboard.kpiLimit': { tr: 'Limit', en: 'Limit' },
52
- 'dashboard.weeklyLevel': { tr: 'haftalık %{percent} · {level}', en: 'weekly {percent}% · {level}' },
53
- 'dashboard.unknown': { tr: 'bilinmiyor', en: 'unknown' },
54
- 'dashboard.tabsLabel': { tr: 'Bölümler', en: 'Sections' },
55
- 'dashboard.tabOverview': { tr: 'Genel', en: 'Overview' },
56
- 'dashboard.tabRoadmap': { tr: 'Yol haritası', en: 'Roadmap' },
57
- 'dashboard.tabDecisions': { tr: 'Kararlar', en: 'Decisions' },
58
- 'dashboard.tabFindings': { tr: 'Bulgular', en: 'Findings' },
59
- 'dashboard.tabQuality': { tr: 'Kalite', en: 'Quality' },
60
- 'dashboard.tabActivity': { tr: 'Aktivite', en: 'Activity' },
61
- 'dashboard.tabProduct': { tr: 'Ürün ve teknik', en: 'Product and tech' },
62
- 'dashboard.tabOperations': { tr: 'Operasyon', en: 'Operations' },
63
- 'dashboard.tabLimit': { tr: 'Limit ve maliyet', en: 'Limit and cost' },
64
- 'dashboard.footer': { tr: 'Üretildi: {when} · Kaynak: docs/*.md, git, .claude/state/usage.json · Her Claude cevabından sonra otomatik güncellenir (<code>node .claude/hooks/dashboard.mjs</code>)', en: 'Generated: {when} · Source: docs/*.md, git, .claude/state/usage.json · Updated automatically after every Claude answer (<code>node .claude/hooks/dashboard.mjs</code>)' },
65
- 'dashboard.statusSummary': { tr: 'Durum özeti', en: 'Status summary' },
66
- 'dashboard.noSummary': { tr: 'Henüz özet yok.', en: 'No summary yet.' },
67
- 'dashboard.lastSession': { tr: 'Son oturumda', en: 'In the last session' },
68
- 'dashboard.noRecords': { tr: 'Kayıt yok.', en: 'No records.' },
69
- 'dashboard.recentActivity': { tr: 'Son hareketler', en: 'Recent activity' },
70
- 'dashboard.noActivity': { tr: 'Henüz hareket yok.', en: 'No activity yet.' },
71
- 'dashboard.stages': { tr: 'Aşamalar', en: 'Stages' },
72
- 'dashboard.stageStart': { tr: 'Başlangıç', en: 'Start' },
73
- 'dashboard.stageStartLetter': { tr: 'B', en: 'S' },
74
- 'dashboard.feedCommit': { tr: 'commit', en: 'commit' },
75
- 'dashboard.feedDecision': { tr: 'karar', en: 'decision' },
76
- 'dashboard.feedBoard': { tr: 'kurul', en: 'board' },
77
- 'dashboard.feedMaintenance': { tr: 'bakım', en: 'maintenance' },
78
- 'dashboard.commitKindOther': { tr: 'diğer', en: 'other' },
79
- 'dashboard.noRoadmap': { tr: 'Yol haritası henüz yok. `/start` Adım 8\'de oluşur.', en: 'The roadmap does not exist yet. It is created in `/start` step 8.' },
80
- 'dashboard.topicFilter': { tr: 'Konu filtresi', en: 'Topic filter' },
81
- 'dashboard.all': { tr: 'Hepsi', en: 'All' },
82
- 'dashboard.auto': { tr: 'otomatik', en: 'auto' },
83
- 'dashboard.oneWay': { tr: 'tek yönlü', en: 'one-way' },
84
- 'dashboard.user': { tr: 'kullanıcı', en: 'user' },
85
- 'dashboard.noDecisions': { tr: 'Henüz karar verilmedi. Kararlar `/start` ile başlar.', en: 'No decision made yet. Decisions start with `/start`.' },
86
- 'dashboard.members': { tr: 'Üyeler', en: 'Members' },
87
- 'dashboard.boardSetUp': { tr: 'kuruldu', en: 'set up' },
88
- 'dashboard.notSetUp': { tr: 'kurulmadı', en: 'not set up' },
89
- 'dashboard.boardNotSetUp': { tr: 'Kurul kurulmadı.', en: 'The board is not set up.' },
90
- 'dashboard.commitReview': { tr: 'Commit denetimi: {value}', en: 'Commit review: {value}' },
91
- 'dashboard.on': { tr: 'açık', en: 'on' },
92
- 'dashboard.off': { tr: 'kapalı', en: 'off' },
93
- 'dashboard.summary': { tr: 'Özet', en: 'Summary' },
94
- 'dashboard.kpiMeetings': { tr: 'Toplantı', en: 'Meetings' },
95
- 'dashboard.kpiApproval': { tr: 'Onay oranı', en: 'Approval rate' },
96
- 'dashboard.criticalFinding': { tr: 'kritik bulgu', en: 'critical finding' },
97
- 'dashboard.councilHeading': { tr: 'Konsey · ilk görüş → anonim çapraz oy → başkan', en: 'Council · first opinion → anonymous cross vote → chair' },
98
- 'dashboard.noDecision': { tr: 'karar yok', en: 'no decision' },
99
- 'dashboard.latestCouncil': { tr: 'Son: {topic}', en: 'Latest: {topic}' },
100
- 'dashboard.low': { tr: 'düşük', en: 'low' },
101
- 'dashboard.kpiDisputed': { tr: 'Tartışmalı', en: 'Disputed' },
102
- 'dashboard.kpiEliminated': { tr: 'Elenen', en: 'Eliminated' },
103
- 'dashboard.byCrossVote': { tr: 'çapraz oyla', en: 'by cross vote' },
104
- 'dashboard.overallRanking': { tr: 'Toplu sıralama', en: 'Overall ranking' },
105
- 'dashboard.opinion': { tr: 'Görüş {letter}', en: 'Opinion {letter}' },
106
- 'dashboard.avg': { tr: 'ort. {average}', en: 'avg. {average}' },
107
- 'dashboard.open': { tr: 'aç', en: 'open' },
108
- 'dashboard.noCouncil': { tr: 'Henüz konsey toplanmadı. Plan, faz sonu, canlıya alma ve tek yönlü kararlarda otomatik toplanır.', en: 'No council has met yet. It meets automatically for plans, end of phase, going live and one-way decisions.' },
109
- 'dashboard.meetingLog': { tr: 'Toplantı günlüğü', en: 'Meeting log' },
110
- 'dashboard.noMeetings': { tr: 'Henüz toplantı yapılmadı.', en: 'No meeting held yet.' },
111
- 'dashboard.checklists': { tr: 'Kontrol listeleri', en: 'Checklists' },
112
- 'dashboard.codeHealth': { tr: 'Kod sağlığı · son 30 gün', en: 'Code health · last 30 days' },
113
- 'dashboard.fixRate': { tr: 'Düzeltme oranı', en: 'Fix rate' },
114
- 'dashboard.uncommitted': { tr: 'Commit edilmemiş', en: 'Uncommitted' },
115
- 'dashboard.fixRateNote': { tr: 'Yüksek düzeltme oranı, yeni özelliklerin sık bozulduğunu gösterebilir; retroda konuşulmalı.', en: 'A high fix rate can mean new features break often; discuss it in the retro.' },
116
- 'dashboard.lastQa': { tr: 'Son QA · {name}', en: 'Last QA · {name}' },
117
- 'dashboard.passed': { tr: 'Geçti', en: 'Passed' },
118
- 'dashboard.failed': { tr: 'Kaldı', en: 'Failed' },
119
- 'dashboard.notRun': { tr: 'Koşulmadı', en: 'Not run' },
120
- 'dashboard.withEvidence': { tr: 'kanıtıyla', en: 'with evidence' },
121
- 'dashboard.openReport': { tr: 'raporu aç', en: 'open report' },
122
- 'dashboard.kpiTested': { tr: 'Testi olan', en: 'With a test' },
123
- 'dashboard.kpiPassing': { tr: 'Geçen', en: 'Passing' },
124
- 'dashboard.reportTime': { tr: 'rapor: {when}', en: 'report: {when}' },
125
- 'dashboard.noJunit': { tr: 'JUnit raporu yok', en: 'No JUnit report' },
126
- 'dashboard.noAcceptanceIds': { tr: 'PRD\'de kimlikli kabul kriteri yok (`AC-01.1` biçimi).', en: 'The PRD has no acceptance criteria with an id (`AC-01.1` format).' },
127
- 'dashboard.metricsMonthly': { tr: 'Metrikler · aylık', en: 'Metrics · monthly' },
128
- 'dashboard.noMetrics': { tr: 'Henüz metrik kaydı yok. `/maintain monthly` ve `/retro` ekler.', en: 'No metrics recorded yet. `/maintain monthly` and `/retro` add them.' },
129
- 'dashboard.criticalFlowTests': { tr: 'Kritik akış testleri', en: 'Critical flow tests' },
130
- 'dashboard.present': { tr: 'var', en: 'present' },
131
- 'dashboard.missing': { tr: 'yok', en: 'missing' },
132
- 'dashboard.noTestPlan': { tr: 'Test planı yok.', en: 'No test plan.' },
133
- 'dashboard.maintenanceLog': { tr: 'Bakım kaydı', en: 'Maintenance log' },
134
- 'dashboard.noMaintenance': { tr: 'Henüz bakım yapılmadı.', en: 'No maintenance done yet.' },
135
- 'dashboard.lastRetro': { tr: 'Son retro: {value}', en: 'Last retro: {value}' },
136
- 'dashboard.commitsLast14': { tr: 'Commit · son 14 gün', en: 'Commits · last 14 days' },
137
- 'dashboard.totalParen': { tr: '(toplam {total})', en: '(total {total})' },
138
- 'dashboard.sparkAria': { tr: 'Son 14 günde günlük commit sayısı', en: 'Daily commit count over the last 14 days' },
139
- 'dashboard.commitTip': { tr: '{date}: {count} commit', en: '{date}: {count} commits' },
140
- 'dashboard.today': { tr: 'bugün', en: 'today' },
141
- 'dashboard.showTable': { tr: 'Tablo olarak göster', en: 'Show as table' },
142
- 'dashboard.feed': { tr: 'Akış', en: 'Feed' },
143
- 'dashboard.product': { tr: 'Ürün', en: 'Product' },
144
- 'dashboard.problem': { tr: 'Problem', en: 'Problem' },
145
- 'dashboard.noPrd': { tr: 'PRD henüz yazılmadı.', en: 'The PRD has not been written yet.' },
146
- 'dashboard.valueProp': { tr: 'Değer önerisi', en: 'Value proposition' },
147
- 'dashboard.outOfScope': { tr: 'Kapsam dışı', en: 'Out of scope' },
148
- 'dashboard.mvpFeatures': { tr: 'MVP özellikleri', en: 'MVP features' },
149
- 'dashboard.noMvp': { tr: 'MVP henüz tanımlanmadı.', en: 'The MVP is not defined yet.' },
150
- 'dashboard.criteriaResults': { tr: 'Kabul kriterleri · test sonucu', en: 'Acceptance criteria · test result' },
151
- 'dashboard.passedBadge': { tr: 'geçti', en: 'passed' },
152
- 'dashboard.failedBadge': { tr: 'kaldı', en: 'failed' },
153
- 'dashboard.noResult': { tr: 'sonuç yok', en: 'no result' },
154
- 'dashboard.noTest': { tr: 'test yok', en: 'no test' },
155
- 'dashboard.technology': { tr: 'Teknoloji', en: 'Technology' },
156
- 'dashboard.noStack': { tr: 'Stack seçilmedi.', en: 'No stack chosen.' },
157
- 'dashboard.design': { tr: 'Tasarım', en: 'Design' },
158
- 'dashboard.noDesign': { tr: 'Tasarım yönü seçilmedi.', en: 'No design direction chosen.' },
159
- 'dashboard.previews': { tr: 'Önizlemeler', en: 'Previews' },
160
- 'dashboard.unitEconomics': { tr: 'Birim ekonomisi', en: 'Unit economics' },
161
- 'dashboard.kpiMargin': { tr: 'Katkı payı', en: 'Contribution margin' },
162
- 'dashboard.perPayingUserMonth': { tr: 'ödeyen kullanıcı başı / ay', en: 'per paying user / month' },
163
- 'dashboard.kpiBreakEven': { tr: 'Başa baş', en: 'Break-even' },
164
- 'dashboard.payingUsers': { tr: 'ödeyen kullanıcı', en: 'paying users' },
165
- 'dashboard.negativeMargin': { tr: 'katkı negatif', en: 'negative margin' },
166
- 'dashboard.atTarget': { tr: 'Hedefte ({target} kullanıcı)', en: 'At target ({target} users)' },
167
- 'dashboard.monthlyProfitLoss': { tr: 'aylık kâr / zarar', en: 'monthly profit / loss' },
168
- 'dashboard.variableOverPrice': { tr: 'Değişken / fiyat', en: 'Variable / price' },
169
- 'dashboard.over30': { tr: '%30 üstü', en: 'over 30%' },
170
- 'dashboard.noInputs': { tr: 'Girdiler boş.', en: 'Inputs are empty.' },
171
- 'dashboard.userFeedback': { tr: 'Kullanıcı geri bildirimi', en: 'User feedback' },
172
- 'dashboard.kpiTotal': { tr: 'Toplam', en: 'Total' },
173
- 'dashboard.kpiNew': { tr: 'Yeni', en: 'New' },
174
- 'dashboard.kpiPlanned': { tr: 'Planlandı', en: 'Planned' },
175
- 'dashboard.topThemes': { tr: 'Öne çıkan temalar', en: 'Top themes' },
176
- 'dashboard.noFeedback': { tr: 'Henüz geri bildirim yok.', en: 'No feedback yet.' },
177
- 'dashboard.learning': { tr: 'Öğrenme · anlama kontrolü', en: 'Learning · comprehension check' },
178
- 'dashboard.kpiRight': { tr: 'Doğru', en: 'Right' },
179
- 'dashboard.kpiWrong': { tr: 'Yanlış', en: 'Wrong' },
180
- 'dashboard.kpiSuccess': { tr: 'Başarı', en: 'Success rate' },
181
- 'dashboard.oftenMissed': { tr: 'Sık yanılan kavramlar', en: 'Often missed concepts' },
182
- 'dashboard.brandPack': { tr: 'Marka paketi', en: 'Brand pack' },
183
- 'dashboard.filesCount': { tr: '{count} dosya', en: '{count} files' },
184
- 'dashboard.usageRules': { tr: 'kullanım kuralları', en: 'usage rules' },
185
- 'dashboard.noLogo': { tr: 'Logo henüz yok.', en: 'No logo yet.' },
186
- 'dashboard.promoResearch': { tr: 'Tanıtım ve araştırma', en: 'Promo and research' },
187
- 'dashboard.videos': { tr: 'Videolar', en: 'Videos' },
188
- 'dashboard.noRender': { tr: 'render yok', en: 'no render' },
189
- 'dashboard.noVideos': { tr: 'Video yok.', en: 'No videos.' },
190
- 'dashboard.researchNotes': { tr: 'Araştırma notları', en: 'Research notes' },
191
- 'dashboard.noNotes': { tr: 'Not yok.', en: 'No notes.' },
192
- 'dashboard.unreleased': { tr: 'Yayınlanmamış değişiklikler (CHANGELOG)', en: 'Unreleased changes (CHANGELOG)' },
193
- 'dashboard.noUnreleased': { tr: 'Yayınlanmamış değişiklik yok.', en: 'No unreleased changes.' },
194
- 'dashboard.limit5h': { tr: '5 saatlik', en: '5-hour' },
195
- 'dashboard.limitWeeklyLower': { tr: 'haftalık', en: 'weekly' },
196
- 'dashboard.limitWeekly': { tr: 'Haftalık', en: 'Weekly' },
197
- 'dashboard.yellowThreshold': { tr: 'sarı eşik', en: 'yellow threshold' },
198
- 'dashboard.redThreshold': { tr: 'kırmızı eşik', en: 'red threshold' },
199
- 'dashboard.resetsLabel': { tr: 'Sıfırlanma: {when}', en: 'Resets: {when}' },
200
- 'dashboard.resetsParen': { tr: '(yenilenme {when})', en: '(resets {when})' },
201
- 'dashboard.renewed': { tr: 'Yenilendi', en: 'Renewed' },
202
- 'dashboard.thresholdsNote': { tr: 'eşikler %{yellow} / %{red}', en: 'thresholds {yellow}% / {red}%' },
203
- 'dashboard.usageLimit': { tr: 'Kullanım limiti', en: 'Usage limit' },
204
- 'dashboard.contextWindow': { tr: 'Bağlam penceresi', en: 'Context window' },
205
- 'dashboard.lastSessionShort': { tr: 'Son oturum', en: 'Last session' },
206
- 'dashboard.contextHint': { tr: '%50\'de /wrap-up + /clear önerilir · {time} itibarıyla', en: '/wrap-up + /clear is suggested at 50% · as of {time}' },
207
- 'dashboard.noContext': { tr: 'Bağlam bilgisi yok (durum çubuğu yazar).', en: 'No context data (the status line writes it).' },
208
- 'dashboard.modelEffort': { tr: 'Model ve effort · rol bazında', en: 'Model and effort · per role' },
209
- 'dashboard.modelsHint': { tr: '/build her görevin başında sorar (docs/workflow/models.md).', en: '/build asks at the start of every task (docs/workflow/models.md).' },
210
- 'dashboard.tokenCost': { tr: 'Token ve maliyet · son 30 gün', en: 'Tokens and cost · last 30 days' },
211
- 'dashboard.totalTokens': { tr: 'Toplam token', en: 'Total tokens' },
212
- 'dashboard.apiEquivalent': { tr: 'API karşılığı', en: 'API equivalent' },
213
- 'dashboard.notBilled': { tr: 'abonelikte fatura değildir', en: 'not a bill on a subscription' },
214
- 'dashboard.dailyAvg': { tr: 'Günlük ortalama', en: 'Daily average' },
215
- 'dashboard.activeDays': { tr: '{count} aktif gün', en: '{count} active days' },
216
- 'dashboard.ccusageNote': { tr: 'ccusage · {when} itibarıyla · ayrıntı için <code>/session-report</code>', en: 'ccusage · as of {when} · for details see <code>/session-report</code>' },
217
- 'dashboard.noData': { tr: 'Veri yok.', en: 'No data.' },
218
- 'dashboard.costLog': { tr: 'Maliyet günlüğü', en: 'Cost log' },
219
- 'dashboard.avgSize': { tr: 'Ortalama · {size}', en: 'Average · {size}' },
220
- 'dashboard.recordsCount': { tr: '{count} kayıt', en: '{count} records' },
221
- 'dashboard.noCostRecords': { tr: 'Henüz kayıt yok. `/build` her görevin limit maliyetini buraya yazar.', en: 'No records yet. `/build` writes each task\'s limit cost here.' },
222
- 'dashboard.accountsDeadlines': { tr: 'Hesaplar ve son tarihler', en: 'Accounts and deadlines' },
223
- 'dashboard.noAccounts': { tr: 'Hesap envanteri boş.', en: 'The account inventory is empty.' },
224
- 'dashboard.none': { tr: 'yok', en: 'none' },
225
- 'dashboard.daysOverdue': { tr: '{days} gün geçti', en: '{days} days overdue' },
226
- 'dashboard.daysLeft': { tr: '{days} gün', en: '{days} days' },
227
- 'dashboard.dateExpiry': { tr: 'bitiş', en: 'expiry' },
228
- 'dashboard.dateKeyRotation': { tr: 'anahtar yenileme', en: 'key rotation' },
229
- 'dashboard.spendAlarms': { tr: 'Harcama alarmları', en: 'Spend alarms' },
230
- 'dashboard.noSpendAlarms': { tr: 'Ücretli servis için alarm kaydı yok.', en: 'No alarm recorded for a paid service.' },
231
- 'dashboard.notSet': { tr: 'ayarlanmadı', en: 'not set' },
232
- 'dashboard.checkIt': { tr: 'kontrol et', en: 'check' },
233
- 'dashboard.flagsHeading': { tr: 'Özellik bayrakları', en: 'Feature flags' },
234
- 'dashboard.overdue': { tr: 'gecikti', en: 'overdue' },
235
- 'dashboard.untested': { tr: 'denenmedi', en: 'not tested' },
236
- 'dashboard.tested': { tr: 'denendi', en: 'tested' },
237
- 'dashboard.noFlags': { tr: 'Bayrak yok.', en: 'No flags.' },
238
- 'dashboard.liveMonitoring': { tr: 'Canlı izleme', en: 'Live monitoring' },
239
- 'dashboard.liveLastRun': { tr: 'son çalışma', en: 'last run' },
240
- 'dashboard.liveUrlHint': { tr: 'GitHub → Settings → Variables\'a LIVE_URL ekle', en: 'Add LIVE_URL under GitHub → Settings → Variables' },
241
- 'dashboard.succeeded': { tr: 'başarılı', en: 'succeeded' },
242
- 'dashboard.failedRun': { tr: 'başarısız', en: 'failed' },
243
- 'dashboard.logLink': { tr: 'kayıt', en: 'log' },
244
- 'dashboard.liveBroken': { tr: 'Canlı izleme bozuk', en: 'Live monitoring is broken' },
245
- 'dashboard.recentWorkflows': { tr: 'Son iş akışları', en: 'Recent workflows' },
246
- 'dashboard.noRuns': { tr: 'Henüz çalışma yok.', en: 'No runs yet.' },
247
- 'dashboard.openPrs': { tr: 'Açık PR\'lar', en: 'Open PRs' },
248
- 'dashboard.draft': { tr: 'taslak', en: 'draft' },
249
- 'dashboard.noPrs': { tr: 'Açık PR yok.', en: 'No open PRs.' },
250
- 'dashboard.ghNote': { tr: 'gh CLI ile okunur, 5 dakikada bir yenilenir.', en: 'Read with the gh CLI, refreshed every 5 minutes.' },
251
- 'dashboard.noGithub': { tr: 'GitHub bilgisi yok: gh CLI kurulu ve giriş yapılmış olmalı, depo GitHub\'a bağlı olmalı.', en: 'No GitHub data: the gh CLI must be installed and logged in, and the repo must be linked to GitHub.' },
252
- 'dashboard.healthHealthy': { tr: 'Sağlıklı', en: 'Healthy' },
253
- 'dashboard.healthGood': { tr: 'İyi', en: 'Good' },
254
- 'dashboard.healthRisky': { tr: 'Riskli', en: 'At risk' },
255
- 'dashboard.areaScores': { tr: 'Alan sağlık puanları', en: 'Health score by area' },
256
- 'dashboard.findingsLine': { tr: '{date} · {findings} bulgu', en: '{date} · {findings} findings' },
257
- 'dashboard.findingsCritical': { tr: ' · {critical} kritik', en: ' · {critical} critical' },
258
- 'dashboard.noReportYet': { tr: 'Henüz raporu olmayanlar:', en: 'Without a report yet:' },
259
- 'dashboard.noFindingReports': { tr: 'Henüz bulgu raporu yok. Başlamak için:', en: 'No finding report yet. To start:' },
260
- 'dashboard.reportHistory': { tr: 'Rapor geçmişi', en: 'Report history' },
261
- 'dashboard.noReports': { tr: 'Rapor yok.', en: 'No reports.' },
262
- 'dashboard.scoringNote': { tr: 'Puanlama: bulgu önemi = etki (40) + olasılık (25) + yayılım (20) + aciliyet (15); sağlık = 100 − ceza (kritik 15, yüksek 8, orta 4, düşük 1). Yöntem: <code>.claude/findings/protocol.md</code>', en: 'Scoring: finding severity = impact (40) + likelihood (25) + spread (20) + urgency (15); health = 100 − penalty (critical 15, high 8, medium 4, low 1). Method: <code>.claude/findings/protocol.md</code>' },
263
- 'dashboard.findingKind.tech': { tr: 'Teknik', en: 'Technical' },
264
- 'dashboard.findingKind.business': { tr: 'İş', en: 'Business' },
265
- 'dashboard.findingKind.security': { tr: 'Güvenlik', en: 'Security' },
266
- 'dashboard.findingKind.ux': { tr: 'UX', en: 'UX' },
267
- 'dashboard.findingKind.perf': { tr: 'Performans', en: 'Performance' },
268
- 'dashboard.findingKind.legal': { tr: 'Hukuk', en: 'Legal' },
269
- 'dashboard.th.date': { tr: 'Tarih', en: 'Date' },
270
- 'dashboard.th.stage': { tr: 'Aşama', en: 'Stage' },
271
- 'dashboard.th.topic': { tr: 'Konu', en: 'Topic' },
272
- 'dashboard.th.question': { tr: 'Soru', en: 'Question' },
273
- 'dashboard.th.chosen': { tr: 'Seçilen', en: 'Chosen' },
274
- 'dashboard.th.door': { tr: 'Kapı', en: 'Door' },
275
- 'dashboard.th.decidedBy': { tr: 'Veren', en: 'Decided by' },
276
- 'dashboard.th.kind': { tr: 'Tür', en: 'Type' },
277
- 'dashboard.th.decision': { tr: 'Karar', en: 'Decision' },
278
- 'dashboard.th.consensus': { tr: 'Uzlaşma', en: 'Consensus' },
279
- 'dashboard.th.minutes': { tr: 'Tutanak', en: 'Minutes' },
280
- 'dashboard.th.scope': { tr: 'Kapsam', en: 'Scope' },
281
- 'dashboard.th.attendees': { tr: 'Katılan', en: 'Attendees' },
282
- 'dashboard.th.result': { tr: 'Sonuç', en: 'Result' },
283
- 'dashboard.th.critical': { tr: 'Kritik', en: 'Critical' },
284
- 'dashboard.th.userDecision': { tr: 'Kullanıcı kararı', en: 'User decision' },
285
- 'dashboard.th.period': { tr: 'Dönem', en: 'Period' },
286
- 'dashboard.th.task': { tr: 'Görev', en: 'Task' },
287
- 'dashboard.th.avgMinutes': { tr: 'Ort. süre (dk)', en: 'Avg. time (min)' },
288
- 'dashboard.th.avgLimit': { tr: 'Ort. limit', en: 'Avg. limit' },
289
- 'dashboard.th.fixes': { tr: 'Düzeltme', en: 'Fixes' },
290
- 'dashboard.th.reverts': { tr: 'Geri alma', en: 'Reverts' },
291
- 'dashboard.th.duplicateCode': { tr: 'Kopya kod', en: 'Duplicate code' },
292
- 'dashboard.th.openCritical': { tr: 'Açık kritik', en: 'Open critical' },
293
- 'dashboard.th.acceptance': { tr: 'Kabul', en: 'Acceptance' },
294
- 'dashboard.th.flow': { tr: 'Akış', en: 'Flow' },
295
- 'dashboard.th.testKind': { tr: 'Test türü', en: 'Test type' },
296
- 'dashboard.th.file': { tr: 'Dosya', en: 'File' },
297
- 'dashboard.th.day': { tr: 'Gün', en: 'Day' },
298
- 'dashboard.th.commit': { tr: 'Commit', en: 'Commits' },
299
- 'dashboard.th.criterion': { tr: 'Kriter', en: 'Criterion' },
300
- 'dashboard.th.test': { tr: 'Test', en: 'Test' },
301
- 'dashboard.th.job': { tr: 'İş', en: 'Job' },
302
- 'dashboard.th.size': { tr: 'Boyut', en: 'Size' },
303
- 'dashboard.th.usage5h': { tr: '5s kullanım', en: '5h usage' },
304
- 'dashboard.th.service': { tr: 'Servis', en: 'Service' },
305
- 'dashboard.th.purpose': { tr: 'Amaç', en: 'Purpose' },
306
- 'dashboard.th.owner': { tr: 'Sahip', en: 'Owner' },
307
- 'dashboard.th.dates': { tr: 'Tarihler', en: 'Dates' },
308
- 'dashboard.th.amount': { tr: 'Tutar', en: 'Amount' },
309
- 'dashboard.th.alertThresholds': { tr: 'Uyarı eşikleri', en: 'Alert thresholds' },
310
- 'dashboard.th.lastCheck': { tr: 'Son kontrol', en: 'Last check' },
311
- 'dashboard.th.flag': { tr: 'Bayrak', en: 'Flag' },
312
- 'dashboard.th.removal': { tr: 'Kaldırma', en: 'Removal' },
313
- 'dashboard.th.killSwitch': { tr: 'Acil kapatma', en: 'Kill switch' },
314
- 'dashboard.th.workflow': { tr: 'İş akışı', en: 'Workflow' },
315
- 'dashboard.th.branch': { tr: 'Dal', en: 'Branch' },
316
- 'dashboard.th.time': { tr: 'Zaman', en: 'Time' },
317
- 'dashboard.th.health': { tr: 'Sağlık', en: 'Health' },
318
- 'dashboard.th.change': { tr: 'Değişim', en: 'Change' },
319
- 'dashboard.th.finding': { tr: 'Bulgu', en: 'Finding' },
320
- 'dashboard.th.report': { tr: 'Rapor', en: 'Report' },
321
- 'dashboard.alert.kitPending': { tr: 'Proje henüz kurulmadı. Var olan kodu kite almak için /adopt.', en: 'Project is not set up yet. To bring existing code into the kit, run /adopt.' },
322
- 'dashboard.act.startIdea': { tr: '/start [fikrin]', en: '/start [your idea]' },
323
- 'dashboard.alert.handoffPending': { tr: 'Devir notu bekliyor: proje başka kişiden veya hesaptan devralınıyor (docs/workflow/handoff.md).', en: 'Handoff note waiting: the project is being taken over from another person or account (docs/workflow/handoff.md).' },
324
- 'dashboard.alert.boardReject': { tr: 'Kurul RET verdi ({kind}, {scope}): {critical}', en: 'The board rejected ({kind}, {scope}): {critical}' },
325
- 'dashboard.act.askClaudeFix': { tr: 'Claude\'a sor: düzelt / riski kabul et', en: 'Ask Claude: fix / accept the risk' },
326
- 'dashboard.alert.limitRed': { tr: 'Kullanım limiti kırmızı: {short}', en: 'Usage limit is red: {short}' },
327
- 'dashboard.act.limitRed': { tr: 'Yeni işten önce seçenekleri değerlendir (Limit sekmesi)', en: 'Weigh the options before new work (Limit tab)' },
328
- 'dashboard.alert.limitYellow': { tr: 'Kullanım limiti sarı: {short}', en: 'Usage limit is yellow: {short}' },
329
- 'dashboard.act.limitYellow': { tr: 'Büyük işleri limite göre planla', en: 'Plan big tasks around the limit' },
330
- 'dashboard.alert.pendingDecision': { tr: 'Bekleyen karar: {text}', en: 'Pending decision: {text}' },
331
- 'dashboard.act.claudeWaiting': { tr: 'Claude seni bekliyor', en: 'Claude is waiting for you' },
332
- 'dashboard.alert.leftOff': { tr: 'Yarıda kalan iş: {text}', en: 'Unfinished work: {text}' },
333
- 'dashboard.act.buildContinue': { tr: '/build ile devam', en: '/build to continue' },
334
- 'dashboard.alert.openIssue': { tr: 'Açık sorun: {text}', en: 'Open issue: {text}' },
335
- 'dashboard.alert.repeatedBug': { tr: 'Aynı hata sınıfı {count} kez: {cls} ({specs}). Tekrarı önleyen bir kural eklenebilir.', en: 'Same bug class {count} times: {cls} ({specs}). A rule that prevents the repeat could be added.' },
336
- 'dashboard.alert.uncommitted': { tr: '{count} dosya commit edilmemiş.', en: '{count} files are not committed.' },
337
- 'dashboard.act.commitOrWrapUp': { tr: 'Commit veya /wrap-up', en: 'Commit or /wrap-up' },
338
- 'dashboard.alert.progressStale': { tr: 'docs/workflow/progress.md {count} commit\'tir güncellenmedi.', en: 'docs/workflow/progress.md has not been updated for {count} commits.' },
339
- 'dashboard.alert.closedTopics': { tr: 'Soru modu kapalı konular: {topics}. Bu konulardaki kararlar otomatik veriliyor.', en: 'Question mode closed topics: {topics}. Decisions on these topics are made automatically.' },
340
- 'dashboard.act.askModeOpen': { tr: '/ask-mode on <konu>', en: '/ask-mode on <topic>' },
341
- 'dashboard.alert.boardNotSetUp': { tr: 'Uzman kurulu kurulmadı.', en: 'The expert board is not set up.' },
342
- 'dashboard.alert.liveMonitoring': { tr: 'Canlı izleme: {title}', en: 'Live monitoring: {title}' },
343
- 'dashboard.act.fixLive': { tr: '/fix-bug canlı izleme #{number}', en: '/fix-bug live monitoring #{number}' },
344
- 'dashboard.alert.liveRunFailed': { tr: 'Canlı izlemenin son çalışması başarısız.', en: 'The last live monitoring run failed.' },
345
- 'dashboard.act.fixLiveShort': { tr: '/fix-bug canlı izleme', en: '/fix-bug live monitoring' },
346
- 'dashboard.alert.ciFailed': { tr: 'main dalında son CI çalışması başarısız.', en: 'The last CI run on the main branch failed.' },
347
- 'dashboard.act.operationsTab': { tr: 'Operasyon sekmesi', en: 'Operations tab' },
348
- 'dashboard.alert.dateOverdue': { tr: '{service}: {kind} tarihi geçti ({date}).', en: '{service}: {kind} date has passed ({date}).' },
349
- 'dashboard.alert.dateSoon': { tr: '{service}: {kind} {left} gün sonra ({date}).', en: '{service}: {kind} in {left} days ({date}).' },
350
- 'dashboard.act.renew': { tr: 'Yenile veya otomatik yenilemeyi aç', en: 'Renew or turn on auto-renewal' },
351
- 'dashboard.alert.noTwoFactor': { tr: '{service} hesabında 2FA yok.', en: 'The {service} account has no 2FA.' },
352
- 'dashboard.alert.spendUnset': { tr: '{service}: harcama tavanı veya uyarısı ayarlanmadı.', en: '{service}: spend cap or alert is not set.' },
353
- 'dashboard.alert.negativeEconomics': { tr: 'Birim ekonomisi negatif: her ödeyen kullanıcı {amount} {currency} zarar ettiriyor.', en: 'Unit economics are negative: every paying user costs you {amount} {currency}.' },
354
- 'dashboard.act.priceDecision': { tr: 'Fiyat veya maliyet kararı (/plan-task)', en: 'Price or cost decision (/plan-task)' },
355
- 'dashboard.alert.acceptRed': { tr: '{id} PRD\'de tamam işaretli ama kabul testi kırmızı.', en: '{id} is marked done in the PRD but its acceptance test is red.' },
356
- 'dashboard.alert.acceptNoResult': { tr: '{id} PRD\'de tamam işaretli ama kabul testi sonuçsuz.', en: '{id} is marked done in the PRD but its acceptance test has no result.' },
357
- 'dashboard.alert.acceptMissing': { tr: '{id} PRD\'de tamam işaretli ama kabul testi yok.', en: '{id} is marked done in the PRD but it has no acceptance test.' },
358
- 'dashboard.act.acceptFix': { tr: 'Testi çalıştır veya işareti kaldır', en: 'Run the test or remove the mark' },
359
- 'dashboard.alert.flagsOverdue': { tr: 'Kaldırma tarihi geçen {count} bayrak: {names}.', en: '{count} flags past their removal date: {names}.' },
360
- 'dashboard.act.removeFlag': { tr: 'Bayrağı ve eski kod yolunu kaldır', en: 'Remove the flag and the old code path' },
361
- 'dashboard.alert.newFeedback': { tr: '{count} işlenmemiş kullanıcı geri bildirimi var.', en: '{count} user feedback items have not been processed.' },
362
- 'dashboard.alert.packagesOn': { tr: 'Açık bağlam paketleri: {names}. Her oturumda skill listesine yük ekler.', en: 'Context packages that are on: {names}. They add load to the skill list in every session.' },
363
- 'dashboard.act.packagesOff': { tr: 'Kullanmıyorsan /tools kapat <paket>', en: 'If you do not use them: /tools kapat <package>' },
364
- 'dashboard.alert.cmdListLight': { tr: 'Profil Tam ama komut listesi hafif: seyrek komutların açıklaması bağlamda yok.', en: 'The profile is Full but the command list is light: descriptions of rarely used commands are not in the context.' },
365
- 'dashboard.act.cmdFull': { tr: '/tools komutlar tam', en: '/tools komutlar tam' },
366
- 'dashboard.alert.cmdListHeavy': { tr: 'Komut listesi {mode}: seyrek komutların açıklaması her oturumda bağlama giriyor (~1.100 token).', en: 'The command list is {mode}: descriptions of rarely used commands enter the context in every session (~1,100 tokens).' },
367
- 'dashboard.cmdModeFull': { tr: 'tam', en: 'full' },
368
- 'dashboard.cmdModeMixed': { tr: 'karışık', en: 'mixed' },
369
- 'dashboard.act.cmdLight': { tr: 'Profil Tam değilse /tools komutlar hafif', en: 'If the profile is not Full: /tools komutlar hafif' },
370
- 'dashboard.alert.codeMapStale': { tr: 'İnsan için kod haritası (Understand-Anything) {days} gündür güncellenmedi.', en: 'The code map for humans (Understand-Anything) has not been updated for {days} days.' },
371
- 'dashboard.act.understand': { tr: '/understand (sadece değişenleri okur; yayin paketi)', en: '/understand (reads only what changed; yayin package)' },
372
- 'dashboard.alert.contextFull': { tr: 'Bağlam %{percent} dolu; yanıt kalitesi düşebilir.', en: 'Context is {percent}% full; answer quality may drop.' },
373
- 'dashboard.act.wrapUpClear': { tr: '/wrap-up ve /clear', en: '/wrap-up and /clear' },
374
- 'dashboard.alert.findingsCritical': { tr: '{kind} bulgu raporunda {critical} kritik bulgu var (sağlık {health}/100).', en: 'The {kind} finding report has {critical} critical findings (health {health}/100).' },
375
- 'dashboardData.prodRefInMcp': { tr: 'Prod projesinin ref\'i ({ref}) .mcp.json\'da: AI prod\'a bağlanabiliyor.', en: 'The prod project\'s ref ({ref}) is in .mcp.json: the AI can connect to prod.' },
376
- 'dashboardData.prodRefAction': { tr: '.mcp.json → dev ref (docs/operations/accounts.md → Environments)', en: '.mcp.json → dev ref (docs/operations/accounts.md → Environments)' },
377
- 'dashboardData.rlsMissing': { tr: 'Supabase kullanılıyor ama RLS saldırgan testi yok (tests/security/rls.mjs).', en: 'Supabase is in use but there is no RLS attacker test (tests/security/rls.mjs).' },
378
- 'dashboardData.rlsAction': { tr: '/kit-update ile şablonu al, tabloları TABLES\'a ekle', en: 'Get the template with /kit-update, add the tables to TABLES' },
379
- 'guard.commit.skipAsk': { tr: 'Commit kapısı: --skip kurul denetimini ve deterministik kapıyı aşar. Sadece kullanıcı açıkça isterse onayla.', en: 'Commit gate: --skip bypasses the board review and the deterministic gate. Approve only if the user explicitly asks.' },
380
- 'guard.commit.noCommands': { tr: '(tanımlı komut yok)', en: '(no commands defined)' },
381
- 'guard.commit.gateApprovalAsk': { tr: 'Kapı komut onayı: AGENTS.md → Komutlar\'daki şu komutlar bundan sonra her kapıda çalışır:\n{list}\nGüvendiğin komutlarsa onayla.', en: 'Gate command approval: from now on the gate runs these commands from AGENTS.md → Komutlar every time:\n{list}\nApprove only if you trust them.' },
382
- 'guard.destructive.approvalSuffix': { tr: '{reason}. Kullanıcı onayı gerekli.', en: '{reason}. User approval required.' },
383
- 'guard.destructive.prodDeploy': { tr: 'Prod ortamına deploy', en: 'Deploy to the prod environment' },
384
- 'guard.destructive.promoteRollback': { tr: 'Prod ortamı değişiyor (promote/rollback)', en: 'The prod environment is changing (promote/rollback)' },
385
- 'guard.destructive.unclearEnv': { tr: 'Ortam değişkenleri çekiliyor ama ortam düz development/preview değil (değişken veya özel ortam: prod olabilir)', en: 'Environment variables are being pulled but the environment is not plain development/preview (a variable or custom environment: could be prod)' },
386
- 'guard.destructive.serverDeploy': { tr: 'Sunucuya deploy', en: 'Deploy to a server' },
387
- 'guard.destructive.storeSubmit': { tr: 'Mağazaya gönderim, prod OTA güncellemesi veya geri alma', en: 'Store submission, prod OTA update or rollback' },
388
- 'guard.destructive.pushMain': { tr: 'Ana dala doğrudan push', en: 'Direct push to the main branch' },
389
- 'guard.destructive.rewriteHistory': { tr: 'Git geçmişi yeniden yazılıyor', en: 'Git history is being rewritten' },
390
- 'guard.destructive.migration': { tr: 'Migration uygulanıyor (hedef ortamı kontrol et)', en: 'A migration is being applied (check the target environment)' },
391
- 'guard.destructive.remoteDb': { tr: 'Komut localhost dışındaki bir veritabanına bağlanıyor (prod olabilir). Kullanıcı onayı gerekli; AI prod erişim bilgisi kullanmamalı.', en: 'The command connects to a database other than localhost (could be prod). User approval required; the AI must not use prod access credentials.' },
392
- 'guard.destructive.testShell': { tr: 'Test dosyası kabuk komutuyla değiştiriliyor, taşınıyor veya siliniyor. Testi geçirmek için testi zayıflatmak yasak (AGENTS.md kural 7); test düzenlemesini dosya aracıyla yap. Kullanıcı onayı gerekli.', en: 'A test file is being changed, moved or deleted with a shell command. Weakening a test to make it pass is forbidden (AGENTS.md rule 7); edit tests with a file tool. User approval required.' },
393
- 'guard.destructive.inlineTest': { tr: 'Satır içi betik bir test yolunu anıyor; test dosyasına yazıyor olabilir. Test dosyasına yalnız test-writer ajanı yazar (AGENTS.md kural 7). Kullanıcı onayı gerekli.', en: 'An inline script names a test path; it may write to a test file. Only the test-writer agent writes to test files (AGENTS.md rule 7). User approval required.' },
394
- 'guard.destructive.obfuscated': { tr: 'Komut gizlenmiş görünüyor (satır sonu \\, $\'..\', $(...), `...` veya ${...}) ve korunan bir işlem içeriyor. Kullanıcı onayı gerekli.', en: 'The command looks obfuscated (line ending \\, $\'..\', $(...), `...` or ${...}) and contains a guarded operation. User approval required.' },
395
- 'guard.destructive.indirectHook': { tr: 'Kitin koruma betiği dolaylı yazımla çalıştırılıyor ($DEĞİŞKEN, $(...), `...`, ${...} veya * ?); kural metni bunun içini göremez. Kullanıcı onayı gerekli.', en: 'A kit guard script is run with an indirect spelling ($VARIABLE, $(...), `...`, ${...} or * ?); the rule text cannot see inside it. User approval required.' },
396
- 'guard.destructive.perm.freezeOff': { tr: 'Düzenleme kilidi kaldırılıyor', en: 'The edit lock is being removed' },
397
- 'guard.destructive.perm.toolsCommands': { tr: 'Paylaşılan .claude/settings.json → skillOverrides değişiyor (komut listesi)', en: 'The shared .claude/settings.json → skillOverrides is changing (command list)' },
398
- 'guard.destructive.perm.planAdd': { tr: 'Onaylı planın dosya listesi genişliyor (kapsam kalkanı)', en: 'The approved plan\'s file list is widening (scope shield)' },
399
- 'guard.destructive.perm.planSave': { tr: 'Kapsam kalkanının dosya listesi yazılıyor', en: 'The scope shield\'s file list is being written' },
400
- 'guard.destructive.perm.planEnd': { tr: 'Kapsam kalkanı kapatılıyor', en: 'The scope shield is being closed' },
401
- 'guard.destructive.perm.commitSkip': { tr: 'Commit kapısı ve kurul denetimi atlanıyor', en: 'The commit gate and the board review are being skipped' },
402
- 'guard.destructive.perm.prefsEdit': { tr: 'Kişisel tercih dosyası (~/.vibe-kit/preferences.md) değişiyor', en: 'The personal preferences file (~/.vibe-kit/preferences.md) is changing' },
403
- 'guard.destructive.perm.gateApprove': { tr: 'Deterministik kapının çalıştıracağı komutlar onaylanıyor', en: 'The commands the deterministic gate will run are being approved' },
404
- 'guard.destructive.perm.protectedShell': { tr: 'Kural veya koruma dosyası kabuk komutuyla değiştiriliyor', en: 'A rule or guard file is being changed with a shell command' },
405
- 'guard.destructive.unclearNetPath': { tr: 'hedef ağ yolu ({path})', en: 'target is a network path ({path})' },
406
- 'guard.destructive.unclearVar': { tr: 'hedef değişken veya komut içeriyor ({path})', en: 'target contains a variable or command ({path})' },
407
- 'guard.destructive.unclearBrace': { tr: 'hedef süslü parantez açılımı içeriyor ({path})', en: 'target contains a brace expansion ({path})' },
408
- 'guard.destructive.unclearCd': { tr: '{name} hedefi doğrulanamadı ({target}); sonraki komutların klasörü bilinmiyor', en: 'could not verify the {name} target ({target}); the folder of the following commands is unknown' },
409
- 'guard.destructive.homeDir': { tr: 'ev dizini', en: 'home directory' },
410
- 'guard.destructive.unclearXargs': { tr: 'xargs {command} hedef dosyayı göstermiyor', en: 'xargs {command} does not show its target file' },
411
- 'guard.destructive.unclearNoTarget': { tr: '{command} hedef dosyayı göstermiyor', en: '{command} does not show its target file' },
412
- 'guard.destructive.unclearBranch': { tr: 'git {sub} {arg}: yol değil (dal olabilir)', en: 'git {sub} {arg}: not a path (may be a branch)' },
413
- 'guard.destructive.prefsFile': { tr: '{path}: kişisel tercih dosyası (kullanıcı klasörü); kabukla değiştirilmez, node .claude/hooks/prefs.mjs --add / --remove kullanılır. Kullanıcı onayı gerekli.', en: '{path}: personal preferences file (user folder); it is not changed with the shell, use node .claude/hooks/prefs.mjs --add / --remove. User approval required.' },
414
- 'guard.destructive.gateApproval': { tr: '{path}: kapı komut onayı kaydı (kullanıcı klasörü); kabukla değiştirilmez, node .claude/hooks/gate.mjs --approve kullanılır. Kullanıcı onayı gerekli.', en: '{path}: gate command approval record (user folder); it is not changed with the shell, use node .claude/hooks/gate.mjs --approve. User approval required.' },
415
- 'guard.destructive.protectedShell': { tr: '{rel}: {text} Kabuk komutuyla değiştiriliyor; kilit, plan ve onay durumları için ilgili kit komutunu kullan. Kullanıcı onayı gerekli.', en: '{rel}: {text} It is being changed with a shell command; for lock, plan and approval states use the matching kit command. User approval required.' },
416
- 'guard.destructive.unclearRule': { tr: '{unclear}; komut kural veya koruma dosyası adını içeriyor (.claude, .git, AGENTS.md…), hedef doğrulanamadı. Kullanıcı onayı gerekli.', en: '{unclear}; the command names a rule or guard file (.claude, .git, AGENTS.md…) and the target could not be verified. User approval required.' },
417
- 'guard.destructive.labelLock': { tr: 'Düzenleme kilidi ({lock}/)', en: 'Edit lock ({lock}/)' },
418
- 'guard.destructive.labelPlan': { tr: 'Kapsam kalkanı (görev {task})', en: 'Scope shield (task {task})' },
419
- 'guard.destructive.scopeUnclear': { tr: '{label}: {unclear}; hangi dosyaların değişeceği bilinemiyor. Gerekliyse kullanıcıya sor.', en: '{label}: {unclear}; it is not possible to tell which files will change. Ask the user if needed.' },
420
- 'guard.destructive.scopeRoot': { tr: '{label}: komut proje kökünü veya üst klasörünü hedefliyor ({rel}); kilit/plan dışındaki dosyalar da değişebilir. Gerekliyse kullanıcıya sor.', en: '{label}: the command targets the project root or a parent folder ({rel}); files outside the lock/plan may change too. Ask the user if needed.' },
421
- 'guard.destructive.lockOutside': { tr: 'Düzenleme kilidi: {rel} kilit ({lock}/) dışında ve komut onu değiştirebilir. Gerekliyse kullanıcıya sor.', en: 'Edit lock: {rel} is outside the lock ({lock}/) and the command may change it. Ask the user if needed.' },
422
- 'guard.destructive.planOutside': { tr: 'Kapsam kalkanı: {rel} onaylı planda yok (görev {task}) ve komut onu değiştirebilir. Gerekliyse kullanıcıya sor; onaylarsa node .claude/hooks/freeze-guard.mjs --plan-add <yol>.', en: 'Scope shield: {rel} is not in the approved plan (task {task}) and the command may change it. Ask the user if needed; if they approve, run node .claude/hooks/freeze-guard.mjs --plan-add <path>.' },
423
- 'guard.destructive.prefix': { tr: 'Kalkan: {reason}', en: 'Shield: {reason}' },
424
- 'guard.freeze.protectedAsk': { tr: 'Kural, koruma ve iş akışı dosyaları kullanıcı onayıyla değişir.', en: 'Rule, guard and workflow files change only with user approval.' },
425
- 'guard.freeze.prefsFile': { tr: '{path}: kişisel tercih dosyası; elle yazılmaz, node .claude/hooks/prefs.mjs --add / --remove kullanılır.', en: '{path}: personal preferences file; do not write it by hand, use node .claude/hooks/prefs.mjs --add / --remove.' },
426
- 'guard.freeze.gateApproval': { tr: '{path}: kapı komut onayı kaydı; elle yazılmaz, node .claude/hooks/gate.mjs --approve kullanılır.', en: '{path}: gate command approval record; do not write it by hand, use node .claude/hooks/gate.mjs --approve.' },
427
- 'guard.freeze.scopeAsk': { tr: 'Kapsam kalkanı: {rel} onaylı planda yok (görev {task}). Gerekliyse kullanıcıya sor; onaylarsa node .claude/hooks/freeze-guard.mjs --plan-add <yol>. Görev bittiyse --plan-end.', en: 'Scope shield: {rel} is not in the approved plan (task {task}). Ask the user if needed; if they approve, run node .claude/hooks/freeze-guard.mjs --plan-add <path>. When the task is done, run --plan-end.' },
428
- 'guard.freeze.unknownPath': { tr: '(yol bilinmiyor)', en: '(unknown path)' },
429
- 'guard.package.npmMissing': { tr: 'npm kayıt defterinde böyle bir paket yok', en: 'no such package in the npm registry' },
430
- 'guard.package.npmStatus': { tr: 'npm yanıtı {status}', en: 'npm responded {status}' },
431
- 'guard.package.similar': { tr: 'popüler "{similar}" paketine çok benziyor (yazım hatası tuzağı olabilir)', en: 'very similar to the popular package "{similar}" (could be a typosquat)' },
432
- 'guard.package.newNpm': { tr: '{age} gün önce yayımlanmış', en: 'published {age} days ago' },
433
- 'guard.package.lowDownloads': { tr: 'haftalık indirme {downloads}', en: '{downloads} weekly downloads' },
434
- 'guard.package.pypiMissing': { tr: 'PyPI\'da böyle bir paket yok', en: 'no such package on PyPI' },
435
- 'guard.package.pypiStatus': { tr: 'PyPI yanıtı {status}', en: 'PyPI responded {status}' },
436
- 'guard.package.newPypi': { tr: 'ilk sürümü {age} gün önce yayımlanmış', en: 'first release was published {age} days ago' },
437
- 'guard.package.timeout': { tr: 'doğrulanamadı (zaman aşımı)', en: 'could not be verified (timeout)' },
438
- 'guard.package.network': { tr: 'doğrulanamadı (ağ hatası)', en: 'could not be verified (network error)' },
439
- 'guard.package.ask': { tr: 'Paket kapısı uyarısı: {list}. Kurmadan önce paketin gerçekten istenen paket olduğundan emin ol.', en: 'Package gate warning: {list}. Before installing, make sure the package is really the one you want.' },
440
- 'guard.structure.offMap': { tr: '"{rel}" yapı haritasında yok (.claude/structure.json). Doğru yer muhtemelen şunlardan biri: {top}. Geçici veya deneme ise sandbox/ altına yaz. Kalıcı yeni bir yer gerekiyorsa bunu teknik karar olarak sor ve haritayı güncelle (docs/architecture/structure.md).', en: '"{rel}" is not in the structure map (.claude/structure.json). The right place is probably one of: {top}. If it is temporary or a trial, write it under sandbox/. If a new permanent place is needed, ask it as a technical decision and update the map (docs/architecture/structure.md).' },
441
- 'guard.structure.prefix': { tr: 'Yapı: {reason}', en: 'Structure: {reason}' },
442
- 'guard.test.skip': { tr: 'test atlanıyor veya tek teste odaklanıyor (.skip / .only / skipIf / xit / pytest skip)', en: 'a test is skipped or focused alone (.skip / .only / skipIf / xit / pytest skip)' },
443
- 'guard.test.expectRemoved': { tr: 'beklenti (expect/assert) siliniyor veya yoruma alınıyor', en: 'an expectation (expect/assert) is deleted or commented out' },
444
- 'guard.test.expectWeak': { tr: 'beklenti gevşetiliyor (toBeTruthy, toBeDefined, expect.anything, matcher\'sız expect, assert True)', en: 'an expectation is loosened (toBeTruthy, toBeDefined, expect.anything, expect without a matcher, assert True)' },
445
- 'guard.test.configRisk': { tr: 'testlerin kapsamını belirleyen ayar değişiyor (include/exclude, testMatch, passWithNoTests, eşik, test script\'i)', en: 'a setting that decides which tests run is changing (include/exclude, testMatch, passWithNoTests, threshold, test script)' },
446
- 'guard.test.configDeleted': { tr: 'test ayar dosyası siliniyor', en: 'a test config file is deleted' },
447
- 'guard.test.fileDeleted': { tr: 'test dosyası siliniyor', en: 'a test file is deleted' },
448
- 'guard.test.movedAway': { tr: 'test dosyası çalışmayan bir yola taşınıyor ({source})', en: 'a test file is moved to a path where it will not run ({source})' },
449
- 'guard.test.moveOverwrite': { tr: 'taşıma var olan dosyanın üstüne yazıyor ({source} → {path})', en: 'the move overwrites an existing file ({source} → {path})' },
450
- 'guard.test.ask': { tr: 'Test koruması: {name} içinde {reason}. Testi geçirmek için testi zayıflatmak yasak (AGENTS.md kural 7). Gerekçe gerçekse (yanlış test, değişen kabul kriteri) kullanıcıya söyle ve onayını al; değilse kodu düzelt.', en: 'Test protection: in {name}, {reason}. Weakening a test to make it pass is forbidden (AGENTS.md rule 7). If the reason is real (a wrong test, a changed acceptance criterion), tell the user and get their approval; otherwise fix the code.' },
451
- 'statusRead.defaultProject': { tr: 'Proje', en: 'Project' },
452
- 'statusRead.checklist.security': { tr: 'Güvenlik', en: 'Security' },
453
- 'statusRead.checklist.release': { tr: 'Canlıya alma', en: 'Go-live' },
454
- 'statusRead.checklist.legal': { tr: 'Yasal / KVKK', en: 'Legal / privacy' },
455
- 'statusRead.checklist.ai': { tr: 'AI', en: 'AI' },
456
- 'statusRead.checklist.launch': { tr: 'Lansman', en: 'Launch' },
457
- 'qaReport.title': { tr: '# QA raporu · {stamp}', en: '# QA report · {stamp}' },
458
- 'qaReport.result': { tr: '**Sonuç:** {summary} (PRD\'de {count} kriter, kaynak: `{junit}`)', en: '**Result:** {summary} ({count} criteria in the PRD, source: `{junit}`)' },
459
- 'qaReport.summary': { tr: '{passed} geçti · {failed} kaldı · {notRun} koşulmadı', en: '{passed} passed · {failed} failed · {notRun} not run' },
460
- 'qaReport.tableHeader': { tr: '| Kriter | Sonuç | Kanıt | Not |', en: '| Criterion | Result | Evidence | Note |' },
461
- 'models.role.plan': { tr: 'Planlama ve mimari', en: 'Planning and architecture' },
462
- 'models.role.code': { tr: 'Kod yazma', en: 'Writing code' },
463
- 'models.role.test': { tr: 'Test yazma', en: 'Writing tests' },
464
- 'models.role.review': { tr: 'İnceleme ve denetim', en: 'Review and audit' },
465
- 'models.role.docs': { tr: 'Doküman ve araştırma', en: 'Documents and research' },
466
- 'models.noRecord': { tr: 'kayıt yok: önerilenler', en: 'no saved choice: recommended values' },
467
- 'models.unreadable': { tr: 'kayıt okunamadı: önerilenler; --set ile yeniden yaz', en: 'saved choice unreadable: recommended values; rewrite it with --set' },
468
- 'statusline.notSetUp': { tr: '◆ Kit kurulmadı · başlamak için: /start [fikrin] · var olan kod: /adopt', en: '◆ Kit not set up · to begin: /start [your idea] · existing code: /adopt' },
469
- 'statusline.step': { tr: 'adım {step}', en: 'step {step}' },
470
- 'statusline.task': { tr: 'görev {done}/{total}', en: 'task {done}/{total}' },
471
- 'statusline.question': { tr: 'soru: {mode}', en: 'questions: {mode}' },
472
- 'statusline.modeOpen': { tr: 'açık', en: 'open' },
473
- 'statusline.modeOff': { tr: 'kapalı', en: 'off' },
474
- 'statusline.closed': { tr: '(kapalı: {topics})', en: '(closed: {topics})' },
475
- 'statusline.pending': { tr: 'bekleyen karar: {count}', en: 'pending decisions: {count}' },
476
- 'statusline.limit5h': { tr: '5s %{percent}', en: '5h {percent}%' },
477
- 'statusline.limitWeek': { tr: 'hf %{percent}', en: 'weekly {percent}%' },
478
- 'statusline.context': { tr: 'bağlam %{percent}', en: 'context {percent}%' },
479
- 'statusline.unreadable': { tr: '▶ durum okunamadı', en: '▶ status unreadable' },
480
- 'usage.none': { tr: 'Limit bilgisi yok. Masaüstü uygulamasındaysan get_usage aracını kullan. Terminal/IDE\'de durum çubuğu ilk API yanıtından sonra yazar. İkisi de yoksa kullanıcıdan /usage sonucunu iste.', en: 'No limit data. In the desktop app, use the get_usage tool. In the terminal or IDE the status line writes it after the first API response. If neither exists, ask the user for the /usage result.' },
481
- 'usage.window5h': { tr: '5 saatlik', en: '5-hour' },
482
- 'usage.windowWeek': { tr: 'haftalık', en: 'weekly' },
483
- 'usage.windowPart': { tr: '{name}: %{percent}{tail}', en: '{name}: {percent}%{tail}' },
484
- 'usage.renewed': { tr: '(yenilendi)', en: '(renewed)' },
485
- 'usage.resets': { tr: 'sıfırlanma {clock}, {left} sonra', en: 'resets {clock}, in {left}' },
486
- 'usage.leftDays': { tr: '{days} gün {hours} sa', en: '{days} d {hours} h' },
487
- 'usage.leftHours': { tr: '{hours} sa {minutes} dk', en: '{hours} h {minutes} min' },
488
- 'usage.stale': { tr: ' — eski olabilir, get_usage veya /usage ile doğrula', en: ' — may be outdated, verify with get_usage or /usage' },
489
- 'usage.summary': { tr: '{parts} · seviye: {level} · {age} dk önce okundu{stale}', en: '{parts} · level: {level} · read {age} min ago{stale}' },
490
- 'usage.level.green': { tr: 'yeşil', en: 'green' },
491
- 'usage.level.yellow': { tr: 'sarı', en: 'yellow' },
492
- 'usage.level.red': { tr: 'kırmızı', en: 'red' },
493
- 'usage.level.unknown': { tr: 'bilinmiyor', en: 'unknown' },
494
- 'notify.done': { tr: 'İş bitti ({minutes} dk). Sonuca bakabilirsin.', en: 'Job finished ({minutes} min). You can check the result.' },
495
- 'notify.waiting': { tr: 'Claude cevabını bekliyor.', en: 'Claude is waiting for your answer.' },
5
+ 'session.begin': { en: 'To begin: /start [your project idea] · existing project: /adopt' },
6
+ 'session.resume': { en: 'Continue: {command} (step {step})' },
7
+ 'session.next': { en: 'Next: /build {code} · {title}' },
8
+ 'session.handoff': { en: 'Handoff note waiting: /handoff take' },
9
+ 'session.handoffThen': { en: 'Handoff note waiting: /handoff take · then {next}' },
10
+ 'dashboard.title': { en: 'Dashboard' },
11
+ 'dashboard.sevCritical': { en: 'Critical' },
12
+ 'dashboard.sevWarn': { en: 'Attention' },
13
+ 'dashboard.sevInfo': { en: 'Info' },
14
+ 'dashboard.sevGood': { en: 'On track' },
15
+ 'dashboard.healthWarn': { en: 'Needs attention' },
16
+ 'dashboard.healthCritical': { en: 'Blocked' },
17
+ 'dashboard.kitNotInstalled': { en: 'kit not set up' },
18
+ 'dashboard.kitVersion': { en: 'kit {version}' },
19
+ 'dashboard.autoRefresh': { en: 'Refresh every 30 s' },
20
+ 'dashboard.now': { en: 'Now' },
21
+ 'dashboard.questionMode': { en: 'Question mode' },
22
+ 'dashboard.profile': { en: 'Profile' },
23
+ 'dashboard.lastUpdate': { en: 'Last updated' },
24
+ 'dashboard.startStep': { en: 'Start step' },
25
+ 'dashboard.nextStep': { en: 'Next step' },
26
+ 'dashboard.pasteHint': { en: 'Copy it and paste it into the Claude chat.' },
27
+ 'dashboard.status': { en: 'Status' },
28
+ 'dashboard.attention': { en: 'Needs attention' },
29
+ 'dashboard.moreItems': { en: '{count} more' },
30
+ 'dashboard.allGood': { en: 'All good' },
31
+ 'dashboard.allGoodText': { en: 'No pending decision, critical finding or open issue.' },
32
+ 'dashboard.copy': { en: 'Copy' },
33
+ 'dashboard.copied': { en: 'Copied' },
34
+ 'dashboard.copyFailed': { en: 'Copy failed' },
35
+ 'dashboard.copyAria': { en: 'Copy the {command} command' },
36
+ 'dashboard.startIdeaCode': { en: '`/start [your idea]`' },
37
+ 'dashboard.kpiTasks': { en: 'Tasks' },
38
+ 'dashboard.donePct': { en: '{percent}% done' },
39
+ 'dashboard.acceptanceTests': { en: 'Acceptance tests' },
40
+ 'dashboard.criteriaTested': { en: '{count} criteria have a test' },
41
+ 'dashboard.kpiMvp': { en: 'MVP criteria' },
42
+ 'dashboard.featuresCount': { en: '{count} features' },
43
+ 'dashboard.kpiDecisions': { en: 'Decisions' },
44
+ 'dashboard.usersAuto': { en: '{user} user · {auto} auto' },
45
+ 'dashboard.board': { en: 'Board' },
46
+ 'dashboard.rejects': { en: '{count} rejected' },
47
+ 'dashboard.kpiRejects': { en: 'Rejected' },
48
+ 'dashboard.membersCount': { en: '{count} members' },
49
+ 'dashboard.kpiCommits7': { en: 'Commits · 7 days' },
50
+ 'dashboard.filesWaiting': { en: '{count} files waiting' },
51
+ 'dashboard.noGit': { en: 'no git' },
52
+ 'dashboard.kpiLimit': { en: 'Limit' },
53
+ 'dashboard.weeklyLevel': { en: 'weekly {percent}% · {level}' },
54
+ 'dashboard.unknown': { en: 'unknown' },
55
+ 'dashboard.tabsLabel': { en: 'Sections' },
56
+ 'dashboard.tabOverview': { en: 'Overview' },
57
+ 'dashboard.tabRoadmap': { en: 'Roadmap' },
58
+ 'dashboard.tabDecisions': { en: 'Decisions' },
59
+ 'dashboard.tabFindings': { en: 'Findings' },
60
+ 'dashboard.tabQuality': { en: 'Quality' },
61
+ 'dashboard.tabActivity': { en: 'Activity' },
62
+ 'dashboard.tabProduct': { en: 'Product and tech' },
63
+ 'dashboard.tabOperations': { en: 'Operations' },
64
+ 'dashboard.tabLimit': { en: 'Limit and cost' },
65
+ 'dashboard.footer': { en: 'Generated: {when} · Source: docs/*.md, git, .claude/state/usage.json · Updated automatically after every Claude answer (<code>node .claude/hooks/dashboard.mjs</code>)' },
66
+ 'dashboard.statusSummary': { en: 'Status summary' },
67
+ 'dashboard.noSummary': { en: 'No summary yet.' },
68
+ 'dashboard.lastSession': { en: 'In the last session' },
69
+ 'dashboard.noRecords': { en: 'No records.' },
70
+ 'dashboard.recentActivity': { en: 'Recent activity' },
71
+ 'dashboard.noActivity': { en: 'No activity yet.' },
72
+ 'dashboard.stages': { en: 'Stages' },
73
+ 'dashboard.stageStart': { en: 'Start' },
74
+ 'dashboard.stageStartLetter': { en: 'S' },
75
+ 'dashboard.feedCommit': { en: 'commit' },
76
+ 'dashboard.feedDecision': { en: 'decision' },
77
+ 'dashboard.feedBoard': { en: 'board' },
78
+ 'dashboard.feedMaintenance': { en: 'maintenance' },
79
+ 'dashboard.commitKindOther': { en: 'other' },
80
+ 'dashboard.noRoadmap': { en: 'The roadmap does not exist yet. It is created in `/start` step 8.' },
81
+ 'dashboard.topicFilter': { en: 'Topic filter' },
82
+ 'dashboard.all': { en: 'All' },
83
+ 'dashboard.auto': { en: 'auto' },
84
+ 'dashboard.oneWay': { en: 'one-way' },
85
+ 'dashboard.user': { en: 'user' },
86
+ 'dashboard.noDecisions': { en: 'No decision made yet. Decisions start with `/start`.' },
87
+ 'dashboard.members': { en: 'Members' },
88
+ 'dashboard.boardSetUp': { en: 'set up' },
89
+ 'dashboard.notSetUp': { en: 'not set up' },
90
+ 'dashboard.boardNotSetUp': { en: 'The board is not set up.' },
91
+ 'dashboard.commitReview': { en: 'Commit review: {value}' },
92
+ 'dashboard.on': { en: 'on' },
93
+ 'dashboard.off': { en: 'off' },
94
+ 'dashboard.summary': { en: 'Summary' },
95
+ 'dashboard.kpiMeetings': { en: 'Meetings' },
96
+ 'dashboard.kpiApproval': { en: 'Approval rate' },
97
+ 'dashboard.criticalFinding': { en: 'critical finding' },
98
+ 'dashboard.councilHeading': { en: 'Council · first opinion → anonymous cross vote → chair' },
99
+ 'dashboard.noDecision': { en: 'no decision' },
100
+ 'dashboard.latestCouncil': { en: 'Latest: {topic}' },
101
+ 'dashboard.low': { en: 'low' },
102
+ 'dashboard.kpiDisputed': { en: 'Disputed' },
103
+ 'dashboard.kpiEliminated': { en: 'Eliminated' },
104
+ 'dashboard.byCrossVote': { en: 'by cross vote' },
105
+ 'dashboard.overallRanking': { en: 'Overall ranking' },
106
+ 'dashboard.opinion': { en: 'Opinion {letter}' },
107
+ 'dashboard.avg': { en: 'avg. {average}' },
108
+ 'dashboard.open': { en: 'open' },
109
+ 'dashboard.noCouncil': { en: 'No council has met yet. It meets automatically for plans, end of phase, going live and one-way decisions.' },
110
+ 'dashboard.meetingLog': { en: 'Meeting log' },
111
+ 'dashboard.noMeetings': { en: 'No meeting held yet.' },
112
+ 'dashboard.checklists': { en: 'Checklists' },
113
+ 'dashboard.codeHealth': { en: 'Code health · last 30 days' },
114
+ 'dashboard.fixRate': { en: 'Fix rate' },
115
+ 'dashboard.uncommitted': { en: 'Uncommitted' },
116
+ 'dashboard.fixRateNote': { en: 'A high fix rate can mean new features break often; discuss it in the retro.' },
117
+ 'dashboard.lastQa': { en: 'Last QA · {name}' },
118
+ 'dashboard.passed': { en: 'Passed' },
119
+ 'dashboard.failed': { en: 'Failed' },
120
+ 'dashboard.notRun': { en: 'Not run' },
121
+ 'dashboard.withEvidence': { en: 'with evidence' },
122
+ 'dashboard.openReport': { en: 'open report' },
123
+ 'dashboard.kpiTested': { en: 'With a test' },
124
+ 'dashboard.kpiPassing': { en: 'Passing' },
125
+ 'dashboard.reportTime': { en: 'report: {when}' },
126
+ 'dashboard.noJunit': { en: 'No JUnit report' },
127
+ 'dashboard.noAcceptanceIds': { en: 'The PRD has no acceptance criteria with an id (`AC-01.1` format).' },
128
+ 'dashboard.metricsMonthly': { en: 'Metrics · monthly' },
129
+ 'dashboard.noMetrics': { en: 'No metrics recorded yet. `/maintain monthly` and `/retro` add them.' },
130
+ 'dashboard.criticalFlowTests': { en: 'Critical flow tests' },
131
+ 'dashboard.present': { en: 'present' },
132
+ 'dashboard.missing': { en: 'missing' },
133
+ 'dashboard.noTestPlan': { en: 'No test plan.' },
134
+ 'dashboard.maintenanceLog': { en: 'Maintenance log' },
135
+ 'dashboard.noMaintenance': { en: 'No maintenance done yet.' },
136
+ 'dashboard.lastRetro': { en: 'Last retro: {value}' },
137
+ 'dashboard.commitsLast14': { en: 'Commits · last 14 days' },
138
+ 'dashboard.totalParen': { en: '(total {total})' },
139
+ 'dashboard.sparkAria': { en: 'Daily commit count over the last 14 days' },
140
+ 'dashboard.commitTip': { en: '{date}: {count} commits' },
141
+ 'dashboard.today': { en: 'today' },
142
+ 'dashboard.showTable': { en: 'Show as table' },
143
+ 'dashboard.feed': { en: 'Feed' },
144
+ 'dashboard.product': { en: 'Product' },
145
+ 'dashboard.problem': { en: 'Problem' },
146
+ 'dashboard.noPrd': { en: 'The PRD has not been written yet.' },
147
+ 'dashboard.valueProp': { en: 'Value proposition' },
148
+ 'dashboard.outOfScope': { en: 'Out of scope' },
149
+ 'dashboard.mvpFeatures': { en: 'MVP features' },
150
+ 'dashboard.noMvp': { en: 'The MVP is not defined yet.' },
151
+ 'dashboard.criteriaResults': { en: 'Acceptance criteria · test result' },
152
+ 'dashboard.passedBadge': { en: 'passed' },
153
+ 'dashboard.failedBadge': { en: 'failed' },
154
+ 'dashboard.noResult': { en: 'no result' },
155
+ 'dashboard.noTest': { en: 'no test' },
156
+ 'dashboard.technology': { en: 'Technology' },
157
+ 'dashboard.noStack': { en: 'No stack chosen.' },
158
+ 'dashboard.design': { en: 'Design' },
159
+ 'dashboard.noDesign': { en: 'No design direction chosen.' },
160
+ 'dashboard.previews': { en: 'Previews' },
161
+ 'dashboard.unitEconomics': { en: 'Unit economics' },
162
+ 'dashboard.kpiMargin': { en: 'Contribution margin' },
163
+ 'dashboard.perPayingUserMonth': { en: 'per paying user / month' },
164
+ 'dashboard.kpiBreakEven': { en: 'Break-even' },
165
+ 'dashboard.payingUsers': { en: 'paying users' },
166
+ 'dashboard.negativeMargin': { en: 'negative margin' },
167
+ 'dashboard.atTarget': { en: 'At target ({target} users)' },
168
+ 'dashboard.monthlyProfitLoss': { en: 'monthly profit / loss' },
169
+ 'dashboard.variableOverPrice': { en: 'Variable / price' },
170
+ 'dashboard.over30': { en: 'over 30%' },
171
+ 'dashboard.noInputs': { en: 'Inputs are empty.' },
172
+ 'dashboard.userFeedback': { en: 'User feedback' },
173
+ 'dashboard.kpiTotal': { en: 'Total' },
174
+ 'dashboard.kpiNew': { en: 'New' },
175
+ 'dashboard.kpiPlanned': { en: 'Planned' },
176
+ 'dashboard.topThemes': { en: 'Top themes' },
177
+ 'dashboard.noFeedback': { en: 'No feedback yet.' },
178
+ 'dashboard.learning': { en: 'Learning · comprehension check' },
179
+ 'dashboard.kpiRight': { en: 'Right' },
180
+ 'dashboard.kpiWrong': { en: 'Wrong' },
181
+ 'dashboard.kpiSuccess': { en: 'Success rate' },
182
+ 'dashboard.oftenMissed': { en: 'Often missed concepts' },
183
+ 'dashboard.brandPack': { en: 'Brand pack' },
184
+ 'dashboard.filesCount': { en: '{count} files' },
185
+ 'dashboard.usageRules': { en: 'usage rules' },
186
+ 'dashboard.noLogo': { en: 'No logo yet.' },
187
+ 'dashboard.promoResearch': { en: 'Promo and research' },
188
+ 'dashboard.videos': { en: 'Videos' },
189
+ 'dashboard.noRender': { en: 'no render' },
190
+ 'dashboard.noVideos': { en: 'No videos.' },
191
+ 'dashboard.researchNotes': { en: 'Research notes' },
192
+ 'dashboard.noNotes': { en: 'No notes.' },
193
+ 'dashboard.unreleased': { en: 'Unreleased changes (CHANGELOG)' },
194
+ 'dashboard.noUnreleased': { en: 'No unreleased changes.' },
195
+ 'dashboard.limit5h': { en: '5-hour' },
196
+ 'dashboard.limitWeeklyLower': { en: 'weekly' },
197
+ 'dashboard.limitWeekly': { en: 'Weekly' },
198
+ 'dashboard.yellowThreshold': { en: 'yellow threshold' },
199
+ 'dashboard.redThreshold': { en: 'red threshold' },
200
+ 'dashboard.resetsLabel': { en: 'Resets: {when}' },
201
+ 'dashboard.resetsParen': { en: '(resets {when})' },
202
+ 'dashboard.renewed': { en: 'Renewed' },
203
+ 'dashboard.thresholdsNote': { en: 'thresholds {yellow}% / {red}%' },
204
+ 'dashboard.usageLimit': { en: 'Usage limit' },
205
+ 'dashboard.contextWindow': { en: 'Context window' },
206
+ 'dashboard.lastSessionShort': { en: 'Last session' },
207
+ 'dashboard.contextHint': { en: '/wrap-up + /clear is suggested at 50% · as of {time}' },
208
+ 'dashboard.noContext': { en: 'No context data (the status line writes it).' },
209
+ 'dashboard.modelEffort': { en: 'Model and effort · per role' },
210
+ 'dashboard.modelsHint': { en: '/build asks at the start of every task (docs/workflow/models.md).' },
211
+ 'dashboard.tokenCost': { en: 'Tokens and cost · last 30 days' },
212
+ 'dashboard.totalTokens': { en: 'Total tokens' },
213
+ 'dashboard.apiEquivalent': { en: 'API equivalent' },
214
+ 'dashboard.notBilled': { en: 'not a bill on a subscription' },
215
+ 'dashboard.dailyAvg': { en: 'Daily average' },
216
+ 'dashboard.activeDays': { en: '{count} active days' },
217
+ 'dashboard.ccusageNote': { en: 'ccusage · as of {when} · for details see <code>/session-report</code>' },
218
+ 'dashboard.noData': { en: 'No data.' },
219
+ 'dashboard.costLog': { en: 'Cost log' },
220
+ 'dashboard.avgSize': { en: 'Average · {size}' },
221
+ 'dashboard.recordsCount': { en: '{count} records' },
222
+ 'dashboard.noCostRecords': { en: 'No records yet. `/build` writes each task\'s limit cost here.' },
223
+ 'dashboard.accountsDeadlines': { en: 'Accounts and deadlines' },
224
+ 'dashboard.noAccounts': { en: 'The account inventory is empty.' },
225
+ 'dashboard.none': { en: 'none' },
226
+ 'dashboard.daysOverdue': { en: '{days} days overdue' },
227
+ 'dashboard.daysLeft': { en: '{days} days' },
228
+ 'dashboard.dateExpiry': { en: 'expiry' },
229
+ 'dashboard.dateKeyRotation': { en: 'key rotation' },
230
+ 'dashboard.spendAlarms': { en: 'Spend alarms' },
231
+ 'dashboard.noSpendAlarms': { en: 'No alarm recorded for a paid service.' },
232
+ 'dashboard.notSet': { en: 'not set' },
233
+ 'dashboard.checkIt': { en: 'check' },
234
+ 'dashboard.flagsHeading': { en: 'Feature flags' },
235
+ 'dashboard.overdue': { en: 'overdue' },
236
+ 'dashboard.untested': { en: 'not tested' },
237
+ 'dashboard.tested': { en: 'tested' },
238
+ 'dashboard.noFlags': { en: 'No flags.' },
239
+ 'dashboard.liveMonitoring': { en: 'Live monitoring' },
240
+ 'dashboard.liveLastRun': { en: 'last run' },
241
+ 'dashboard.liveUrlHint': { en: 'Add LIVE_URL under GitHub → Settings → Variables' },
242
+ 'dashboard.succeeded': { en: 'succeeded' },
243
+ 'dashboard.failedRun': { en: 'failed' },
244
+ 'dashboard.logLink': { en: 'log' },
245
+ 'dashboard.liveBroken': { en: 'Live monitoring is broken' },
246
+ 'dashboard.recentWorkflows': { en: 'Recent workflows' },
247
+ 'dashboard.noRuns': { en: 'No runs yet.' },
248
+ 'dashboard.openPrs': { en: 'Open PRs' },
249
+ 'dashboard.draft': { en: 'draft' },
250
+ 'dashboard.noPrs': { en: 'No open PRs.' },
251
+ 'dashboard.ghNote': { en: 'Read with the gh CLI, refreshed every 5 minutes.' },
252
+ 'dashboard.noGithub': { en: 'No GitHub data: the gh CLI must be installed and logged in, and the repo must be linked to GitHub.' },
253
+ 'dashboard.healthHealthy': { en: 'Healthy' },
254
+ 'dashboard.healthGood': { en: 'Good' },
255
+ 'dashboard.healthRisky': { en: 'At risk' },
256
+ 'dashboard.areaScores': { en: 'Health score by area' },
257
+ 'dashboard.findingsLine': { en: '{date} · {findings} findings' },
258
+ 'dashboard.findingsCritical': { en: ' · {critical} critical' },
259
+ 'dashboard.noReportYet': { en: 'Without a report yet:' },
260
+ 'dashboard.noFindingReports': { en: 'No finding report yet. To start:' },
261
+ 'dashboard.reportHistory': { en: 'Report history' },
262
+ 'dashboard.noReports': { en: 'No reports.' },
263
+ 'dashboard.scoringNote': { en: 'Scoring: finding severity = impact (40) + likelihood (25) + spread (20) + urgency (15); health = 100 − penalty (critical 15, high 8, medium 4, low 1). Method: <code>.claude/findings/protocol.md</code>' },
264
+ 'dashboard.findingKind.tech': { en: 'Technical' },
265
+ 'dashboard.findingKind.business': { en: 'Business' },
266
+ 'dashboard.findingKind.security': { en: 'Security' },
267
+ 'dashboard.findingKind.ux': { en: 'UX' },
268
+ 'dashboard.findingKind.perf': { en: 'Performance' },
269
+ 'dashboard.findingKind.legal': { en: 'Legal' },
270
+ 'dashboard.th.date': { en: 'Date' },
271
+ 'dashboard.th.stage': { en: 'Stage' },
272
+ 'dashboard.th.topic': { en: 'Topic' },
273
+ 'dashboard.th.question': { en: 'Question' },
274
+ 'dashboard.th.chosen': { en: 'Chosen' },
275
+ 'dashboard.th.door': { en: 'Door' },
276
+ 'dashboard.th.decidedBy': { en: 'Decided by' },
277
+ 'dashboard.th.kind': { en: 'Type' },
278
+ 'dashboard.th.decision': { en: 'Decision' },
279
+ 'dashboard.th.consensus': { en: 'Consensus' },
280
+ 'dashboard.th.minutes': { en: 'Minutes' },
281
+ 'dashboard.th.scope': { en: 'Scope' },
282
+ 'dashboard.th.attendees': { en: 'Attendees' },
283
+ 'dashboard.th.result': { en: 'Result' },
284
+ 'dashboard.th.critical': { en: 'Critical' },
285
+ 'dashboard.th.userDecision': { en: 'User decision' },
286
+ 'dashboard.th.period': { en: 'Period' },
287
+ 'dashboard.th.task': { en: 'Task' },
288
+ 'dashboard.th.avgMinutes': { en: 'Avg. time (min)' },
289
+ 'dashboard.th.avgLimit': { en: 'Avg. limit' },
290
+ 'dashboard.th.fixes': { en: 'Fixes' },
291
+ 'dashboard.th.reverts': { en: 'Reverts' },
292
+ 'dashboard.th.duplicateCode': { en: 'Duplicate code' },
293
+ 'dashboard.th.openCritical': { en: 'Open critical' },
294
+ 'dashboard.th.acceptance': { en: 'Acceptance' },
295
+ 'dashboard.th.flow': { en: 'Flow' },
296
+ 'dashboard.th.testKind': { en: 'Test type' },
297
+ 'dashboard.th.file': { en: 'File' },
298
+ 'dashboard.th.day': { en: 'Day' },
299
+ 'dashboard.th.commit': { en: 'Commits' },
300
+ 'dashboard.th.criterion': { en: 'Criterion' },
301
+ 'dashboard.th.test': { en: 'Test' },
302
+ 'dashboard.th.job': { en: 'Job' },
303
+ 'dashboard.th.size': { en: 'Size' },
304
+ 'dashboard.th.usage5h': { en: '5h usage' },
305
+ 'dashboard.th.service': { en: 'Service' },
306
+ 'dashboard.th.purpose': { en: 'Purpose' },
307
+ 'dashboard.th.owner': { en: 'Owner' },
308
+ 'dashboard.th.dates': { en: 'Dates' },
309
+ 'dashboard.th.amount': { en: 'Amount' },
310
+ 'dashboard.th.alertThresholds': { en: 'Alert thresholds' },
311
+ 'dashboard.th.lastCheck': { en: 'Last check' },
312
+ 'dashboard.th.flag': { en: 'Flag' },
313
+ 'dashboard.th.removal': { en: 'Removal' },
314
+ 'dashboard.th.killSwitch': { en: 'Kill switch' },
315
+ 'dashboard.th.workflow': { en: 'Workflow' },
316
+ 'dashboard.th.branch': { en: 'Branch' },
317
+ 'dashboard.th.time': { en: 'Time' },
318
+ 'dashboard.th.health': { en: 'Health' },
319
+ 'dashboard.th.change': { en: 'Change' },
320
+ 'dashboard.th.finding': { en: 'Finding' },
321
+ 'dashboard.th.report': { en: 'Report' },
322
+ 'dashboard.alert.kitPending': { en: 'Project is not set up yet. To bring existing code into the kit, run /adopt.' },
323
+ 'dashboard.act.startIdea': { en: '/start [your idea]' },
324
+ 'dashboard.alert.handoffPending': { en: 'Handoff note waiting: the project is being taken over from another person or account (docs/workflow/handoff.md).' },
325
+ 'dashboard.alert.unknownVerdict': { en: 'Board result not readable ({kind}, {scope}): "{result}" — write APPROVE, CONDITIONAL or REJECT' },
326
+ 'dashboard.alert.boardReject': { en: 'The board rejected ({kind}, {scope}): {critical}' },
327
+ 'dashboard.act.askClaudeFix': { en: 'Ask Claude: fix / accept the risk' },
328
+ 'dashboard.alert.limitRed': { en: 'Usage limit is red: {short}' },
329
+ 'dashboard.act.limitRed': { en: 'Weigh the options before new work (Limit tab)' },
330
+ 'dashboard.alert.limitYellow': { en: 'Usage limit is yellow: {short}' },
331
+ 'dashboard.act.limitYellow': { en: 'Plan big tasks around the limit' },
332
+ 'dashboard.alert.pendingDecision': { en: 'Pending decision: {text}' },
333
+ 'dashboard.act.claudeWaiting': { en: 'Claude is waiting for you' },
334
+ 'dashboard.alert.leftOff': { en: 'Unfinished work: {text}' },
335
+ 'dashboard.act.buildContinue': { en: '/build to continue' },
336
+ 'dashboard.alert.openIssue': { en: 'Open issue: {text}' },
337
+ 'dashboard.alert.repeatedBug': { en: 'Same bug class {count} times: {cls} ({specs}). A rule that prevents the repeat could be added.' },
338
+ 'dashboard.alert.uncommitted': { en: '{count} files are not committed.' },
339
+ 'dashboard.act.commitOrWrapUp': { en: 'Commit or /wrap-up' },
340
+ 'dashboard.alert.progressStale': { en: 'docs/workflow/progress.md has not been updated for {count} commits.' },
341
+ 'dashboard.alert.closedTopics': { en: 'Question mode closed topics: {topics}. Decisions on these topics are made automatically.' },
342
+ 'dashboard.act.askModeOpen': { en: '/ask-mode on <topic>' },
343
+ 'dashboard.alert.boardNotSetUp': { en: 'The expert board is not set up.' },
344
+ 'dashboard.alert.liveMonitoring': { en: 'Live monitoring: {title}' },
345
+ 'dashboard.act.fixLive': { en: '/fix-bug live monitoring #{number}' },
346
+ 'dashboard.alert.liveRunFailed': { en: 'The last live monitoring run failed.' },
347
+ 'dashboard.act.fixLiveShort': { en: '/fix-bug live monitoring' },
348
+ 'dashboard.alert.ciFailed': { en: 'The last CI run on the main branch failed.' },
349
+ 'dashboard.act.operationsTab': { en: 'Operations tab' },
350
+ 'dashboard.alert.dateOverdue': { en: '{service}: {kind} date has passed ({date}).' },
351
+ 'dashboard.alert.dateSoon': { en: '{service}: {kind} in {left} days ({date}).' },
352
+ 'dashboard.act.renew': { en: 'Renew or turn on auto-renewal' },
353
+ 'dashboard.alert.noTwoFactor': { en: 'The {service} account has no 2FA.' },
354
+ 'dashboard.alert.spendUnset': { en: '{service}: spend cap or alert is not set.' },
355
+ 'dashboard.alert.negativeEconomics': { en: 'Unit economics are negative: every paying user costs you {amount} {currency}.' },
356
+ 'dashboard.act.priceDecision': { en: 'Price or cost decision (/plan-task)' },
357
+ 'dashboard.alert.acceptRed': { en: '{id} is marked done in the PRD but its acceptance test is red.' },
358
+ 'dashboard.alert.acceptNoResult': { en: '{id} is marked done in the PRD but its acceptance test has no result.' },
359
+ 'dashboard.alert.acceptMissing': { en: '{id} is marked done in the PRD but it has no acceptance test.' },
360
+ 'dashboard.act.acceptFix': { en: 'Run the test or remove the mark' },
361
+ 'dashboard.alert.flagsOverdue': { en: '{count} flags past their removal date: {names}.' },
362
+ 'dashboard.act.removeFlag': { en: 'Remove the flag and the old code path' },
363
+ 'dashboard.alert.newFeedback': { en: '{count} user feedback items have not been processed.' },
364
+ 'dashboard.alert.packagesOn': { en: 'Context packages that are on: {names}. They add load to the skill list in every session.' },
365
+ 'dashboard.act.packagesOff': { en: 'If you do not use them: /tools off <package>' },
366
+ 'dashboard.alert.cmdListLight': { en: 'The profile is Full but the command list is light: descriptions of rarely used commands are not in the context.' },
367
+ 'dashboard.act.cmdFull': { en: '/tools commands full' },
368
+ 'dashboard.alert.cmdListHeavy': { en: 'The command list is {mode}: descriptions of rarely used commands enter the context in every session (~1,100 tokens).' },
369
+ 'dashboard.cmdModeFull': { en: 'full' },
370
+ 'dashboard.cmdModeMixed': { en: 'mixed' },
371
+ 'dashboard.act.cmdLight': { en: 'If the profile is not Full: /tools commands light' },
372
+ 'dashboard.alert.codeMapStale': { en: 'The code map for humans (Understand-Anything) has not been updated for {days} days.' },
373
+ 'dashboard.act.understand': { en: '/understand (reads only what changed; release package)' },
374
+ 'dashboard.alert.contextFull': { en: 'Context is {percent}% full; answer quality may drop.' },
375
+ 'dashboard.act.wrapUpClear': { en: '/wrap-up and /clear' },
376
+ 'dashboard.alert.findingsCritical': { en: 'The {kind} finding report has {critical} critical findings (health {health}/100).' },
377
+ 'dashboardData.prodRefInMcp': { en: 'The prod project\'s ref ({ref}) is in .mcp.json: the AI can connect to prod.' },
378
+ 'dashboardData.prodRefAction': { en: '.mcp.json → dev ref (docs/operations/accounts.md → Environments)' },
379
+ 'dashboardData.rlsMissing': { en: 'Supabase is in use but there is no RLS attacker test (tests/security/rls.mjs).' },
380
+ 'dashboardData.rlsAction': { en: 'Get the template with /kit-update, add the tables to TABLES' },
381
+ 'guard.commit.skipAsk': { en: 'Commit gate: --skip bypasses the board review and the deterministic gate. Approve only if the user explicitly asks.' },
382
+ 'guard.commit.noCommands': { en: '(no commands defined)' },
383
+ 'guard.commit.gateApprovalAsk': { en: 'Gate command approval: from now on the gate runs these commands from AGENTS.md → Commands every time:\n{list}\nApprove only if you trust them.' },
384
+ 'guard.commit.gateUnknownKeys': { en: 'These keys under AGENTS.md → Commands do not run (the gate reads dev, preview, test, lint, type check, build): {keys}' },
385
+ 'guard.destructive.approvalSuffix': { en: '{reason}. User approval required.' },
386
+ 'guard.destructive.prodDeploy': { en: 'Deploy to the prod environment' },
387
+ 'guard.destructive.promoteRollback': { en: 'The prod environment is changing (promote/rollback)' },
388
+ 'guard.destructive.unclearEnv': { en: 'Environment variables are being pulled but the environment is not plain development/preview (a variable or custom environment: could be prod)' },
389
+ 'guard.destructive.serverDeploy': { en: 'Deploy to a server' },
390
+ 'guard.destructive.storeSubmit': { en: 'Store submission, prod OTA update or rollback' },
391
+ 'guard.destructive.pushMain': { en: 'Direct push to the main branch' },
392
+ 'guard.destructive.rewriteHistory': { en: 'Git history is being rewritten' },
393
+ 'guard.destructive.migration': { en: 'A migration is being applied (check the target environment)' },
394
+ 'guard.destructive.remoteDb': { en: 'The command connects to a database other than localhost (could be prod). User approval required; the AI must not use prod access credentials.' },
395
+ 'guard.destructive.testShell': { en: 'A test file is being changed, moved or deleted with a shell command. Weakening a test to make it pass is forbidden (AGENTS.md rule 7); edit tests with a file tool. User approval required.' },
396
+ 'guard.destructive.inlineTest': { en: 'An inline script names a test path; it may write to a test file. Only the test-writer agent writes to test files (AGENTS.md rule 7). User approval required.' },
397
+ 'guard.destructive.obfuscated': { en: 'The command looks obfuscated (line ending \\, $\'..\', $(...), `...` or ${...}) and contains a guarded operation. User approval required.' },
398
+ 'guard.destructive.indirectHook': { en: 'A kit guard script is run with an indirect spelling ($VARIABLE, $(...), `...`, ${...} or * ?); the rule text cannot see inside it. User approval required.' },
399
+ 'guard.destructive.perm.freezeOff': { en: 'The edit lock is being removed' },
400
+ 'guard.destructive.perm.toolsCommands': { en: 'The shared .claude/settings.json → skillOverrides is changing (command list)' },
401
+ 'guard.destructive.perm.planAdd': { en: 'The approved plan\'s file list is widening (scope shield)' },
402
+ 'guard.destructive.perm.planSave': { en: 'The scope shield\'s file list is being written' },
403
+ 'guard.destructive.perm.planEnd': { en: 'The scope shield is being closed' },
404
+ 'guard.destructive.perm.commitSkip': { en: 'The commit gate and the board review are being skipped' },
405
+ 'guard.destructive.perm.prefsEdit': { en: 'The personal preferences file (~/.vibe-kit/preferences.md) is changing' },
406
+ 'guard.destructive.perm.gateApprove': { en: 'The commands the deterministic gate will run are being approved' },
407
+ 'guard.destructive.perm.protectedShell': { en: 'A rule or guard file is being changed with a shell command' },
408
+ 'guard.destructive.unclearNetPath': { en: 'target is a network path ({path})' },
409
+ 'guard.destructive.unclearVar': { en: 'target contains a variable or command ({path})' },
410
+ 'guard.destructive.unclearBrace': { en: 'target contains a brace expansion ({path})' },
411
+ 'guard.destructive.unclearCd': { en: 'could not verify the {name} target ({target}); the folder of the following commands is unknown' },
412
+ 'guard.destructive.homeDir': { en: 'home directory' },
413
+ 'guard.destructive.unclearXargs': { en: 'xargs {command} does not show its target file' },
414
+ 'guard.destructive.unclearNoTarget': { en: '{command} does not show its target file' },
415
+ 'guard.destructive.unclearBranch': { en: 'git {sub} {arg}: not a path (may be a branch)' },
416
+ 'guard.destructive.prefsFile': { en: '{path}: personal preferences file (user folder); it is not changed with the shell, use node .claude/hooks/prefs.mjs --add / --remove. User approval required.' },
417
+ 'guard.destructive.gateApproval': { en: '{path}: gate command approval record (user folder); it is not changed with the shell, use node .claude/hooks/gate.mjs --approve. User approval required.' },
418
+ 'guard.destructive.protectedShell': { en: '{rel}: {text} It is being changed with a shell command; for lock, plan and approval states use the matching kit command. User approval required.' },
419
+ 'guard.destructive.unclearRule': { en: '{unclear}; the command names a rule or guard file (.claude, .git, AGENTS.md…) and the target could not be verified. User approval required.' },
420
+ 'guard.destructive.labelLock': { en: 'Edit lock ({lock}/)' },
421
+ 'guard.destructive.labelPlan': { en: 'Scope shield (task {task})' },
422
+ 'guard.destructive.scopeUnclear': { en: '{label}: {unclear}; it is not possible to tell which files will change. Ask the user if needed.' },
423
+ 'guard.destructive.scopeRoot': { en: '{label}: the command targets the project root or a parent folder ({rel}); files outside the lock/plan may change too. Ask the user if needed.' },
424
+ 'guard.destructive.lockOutside': { en: 'Edit lock: {rel} is outside the lock ({lock}/) and the command may change it. Ask the user if needed.' },
425
+ 'guard.destructive.planOutside': { en: 'Scope shield: {rel} is not in the approved plan (task {task}) and the command may change it. Ask the user if needed; if they approve, run node .claude/hooks/freeze-guard.mjs --plan-add <path>.' },
426
+ 'guard.destructive.prefix': { en: 'Shield: {reason}' },
427
+ 'guard.freeze.protectedAsk': { en: 'Rule, guard and workflow files change only with user approval.' },
428
+ 'guard.freeze.prefsFile': { en: '{path}: personal preferences file; do not write it by hand, use node .claude/hooks/prefs.mjs --add / --remove.' },
429
+ 'guard.freeze.gateApproval': { en: '{path}: gate command approval record; do not write it by hand, use node .claude/hooks/gate.mjs --approve.' },
430
+ 'guard.freeze.scopeAsk': { en: 'Scope shield: {rel} is not in the approved plan (task {task}). Ask the user if needed; if they approve, run node .claude/hooks/freeze-guard.mjs --plan-add <path>. When the task is done, run --plan-end.' },
431
+ 'guard.freeze.unknownPath': { en: '(unknown path)' },
432
+ 'guard.package.npmMissing': { en: 'no such package in the npm registry' },
433
+ 'guard.package.npmStatus': { en: 'npm responded {status}' },
434
+ 'guard.package.similar': { en: 'very similar to the popular package "{similar}" (could be a typosquat)' },
435
+ 'guard.package.newNpm': { en: 'published {age} days ago' },
436
+ 'guard.package.lowDownloads': { en: '{downloads} weekly downloads' },
437
+ 'guard.package.pypiMissing': { en: 'no such package on PyPI' },
438
+ 'guard.package.pypiStatus': { en: 'PyPI responded {status}' },
439
+ 'guard.package.newPypi': { en: 'first release was published {age} days ago' },
440
+ 'guard.package.timeout': { en: 'could not be verified (timeout)' },
441
+ 'guard.package.network': { en: 'could not be verified (network error)' },
442
+ 'guard.package.ask': { en: 'Package gate warning: {list}. Before installing, make sure the package is really the one you want.' },
443
+ 'guard.structure.offMap': { en: '"{rel}" is not in the structure map (.claude/structure.json). The right place is probably one of: {top}. If it is temporary or a trial, write it under sandbox/. If a new permanent place is needed, ask it as a technical decision and update the map (docs/architecture/structure.md).' },
444
+ 'guard.structure.prefix': { en: 'Structure: {reason}' },
445
+ 'guard.test.skip': { en: 'a test is skipped or focused alone (.skip / .only / skipIf / xit / pytest skip)' },
446
+ 'guard.test.expectRemoved': { en: 'an expectation (expect/assert) is deleted or commented out' },
447
+ 'guard.test.expectWeak': { en: 'an expectation is loosened (toBeTruthy, toBeDefined, expect.anything, expect without a matcher, assert True)' },
448
+ 'guard.test.configRisk': { en: 'a setting that decides which tests run is changing (include/exclude, testMatch, passWithNoTests, threshold, test script)' },
449
+ 'guard.test.configDeleted': { en: 'a test config file is deleted' },
450
+ 'guard.test.fileDeleted': { en: 'a test file is deleted' },
451
+ 'guard.test.movedAway': { en: 'a test file is moved to a path where it will not run ({source})' },
452
+ 'guard.test.moveOverwrite': { en: 'the move overwrites an existing file ({source} → {path})' },
453
+ 'guard.test.ask': { en: 'Test protection: in {name}, {reason}. Weakening a test to make it pass is forbidden (AGENTS.md rule 7). If the reason is real (a wrong test, a changed acceptance criterion), tell the user and get their approval; otherwise fix the code.' },
454
+ 'statusRead.defaultProject': { en: 'Project' },
455
+ 'statusRead.checklist.security': { en: 'Security' },
456
+ 'statusRead.checklist.release': { en: 'Go-live' },
457
+ 'statusRead.checklist.legal': { en: 'Legal / privacy' },
458
+ 'statusRead.checklist.ai': { en: 'AI' },
459
+ 'statusRead.checklist.launch': { en: 'Launch' },
460
+ 'qaReport.title': { en: '# QA report · {stamp}' },
461
+ 'qaReport.result': { en: '**Result:** {summary} ({count} criteria in the PRD, source: `{junit}`)' },
462
+ 'qaReport.summary': { en: '{passed} passed · {failed} failed · {notRun} not run' },
463
+ 'qaReport.tableHeader': { en: '| Criterion | Result | Evidence | Note |' },
464
+ 'models.role.plan': { en: 'Planning and architecture' },
465
+ 'models.role.code': { en: 'Writing code' },
466
+ 'models.role.test': { en: 'Writing tests' },
467
+ 'models.role.review': { en: 'Review and audit' },
468
+ 'models.role.docs': { en: 'Documents and research' },
469
+ 'models.noRecord': { en: 'no saved choice: recommended values' },
470
+ 'models.unreadable': { en: 'saved choice unreadable: recommended values; rewrite it with --set' },
471
+ 'statusline.notSetUp': { en: '◆ Kit not set up · to begin: /start [your idea] · existing code: /adopt' },
472
+ 'statusline.step': { en: 'step {step}' },
473
+ 'statusline.task': { en: 'task {done}/{total}' },
474
+ 'statusline.question': { en: 'questions: {mode}' },
475
+ 'statusline.modeOpen': { en: 'open' },
476
+ 'statusline.modeOff': { en: 'off' },
477
+ 'statusline.closed': { en: '(closed: {topics})' },
478
+ 'statusline.pending': { en: 'pending decisions: {count}' },
479
+ 'statusline.limit5h': { en: '5h {percent}%' },
480
+ 'statusline.limitWeek': { en: 'weekly {percent}%' },
481
+ 'statusline.context': { en: 'context {percent}%' },
482
+ 'statusline.unreadable': { en: '▶ status unreadable' },
483
+ 'usage.none': { en: 'No limit data. In the desktop app, use the get_usage tool. In the terminal or IDE the status line writes it after the first API response. If neither exists, ask the user for the /usage result.' },
484
+ 'usage.window5h': { en: '5-hour' },
485
+ 'usage.windowWeek': { en: 'weekly' },
486
+ 'usage.windowPart': { en: '{name}: {percent}%{tail}' },
487
+ 'usage.renewed': { en: '(renewed)' },
488
+ 'usage.resets': { en: 'resets {clock}, in {left}' },
489
+ 'usage.leftDays': { en: '{days} d {hours} h' },
490
+ 'usage.leftHours': { en: '{hours} h {minutes} min' },
491
+ 'usage.stale': { en: ' — may be outdated, verify with get_usage or /usage' },
492
+ 'usage.summary': { en: '{parts} · level: {level} · read {age} min ago{stale}' },
493
+ 'usage.level.green': { en: 'green' },
494
+ 'usage.level.yellow': { en: 'yellow' },
495
+ 'usage.level.red': { en: 'red' },
496
+ 'usage.level.unknown': { en: 'unknown' },
497
+ 'notify.done': { en: 'Job finished ({minutes} min). You can check the result.' },
498
+ 'notify.waiting': { en: 'Claude is waiting for your answer.' },
496
499
  };