duaer-spec 0.27.0 → 0.27.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/.claude/rules/agents-workflow.md +2 -0
  2. package/.claude/rules/duaer-spec.md +1 -0
  3. package/.cursor/rules/agents-workflow.mdc +2 -0
  4. package/.cursor/rules/duaer-spec.mdc +1 -0
  5. package/.duaer/active-job.json +3 -3
  6. package/.duaer/specs/270-patch-version/delivery.json +7 -0
  7. package/.duaer/specs/270-patch-version/spec.md +19 -0
  8. package/.duaer/specs/270-patch-version/tasks.md +4 -0
  9. package/.duaer/specs/271-fde04-compat/delivery.json +9 -0
  10. package/.duaer/specs/271-fde04-compat/spec.md +25 -0
  11. package/.duaer/specs/271-fde04-compat/tasks.md +5 -0
  12. package/.duaer/specs/272-fde03-env-check/delivery.json +9 -0
  13. package/.duaer/specs/272-fde03-env-check/spec.md +34 -0
  14. package/.duaer/specs/272-fde03-env-check/tasks.md +5 -0
  15. package/.duaer/specs/273-fde06-data-precheck/delivery.json +9 -0
  16. package/.duaer/specs/273-fde06-data-precheck/spec.md +37 -0
  17. package/.duaer/specs/273-fde06-data-precheck/tasks.md +5 -0
  18. package/.duaer/specs/274-fde05-external-deps/delivery.json +9 -0
  19. package/.duaer/specs/274-fde05-external-deps/spec.md +37 -0
  20. package/.duaer/specs/274-fde05-external-deps/tasks.md +5 -0
  21. package/.duaer/specs/275-release-0271/delivery.json +9 -0
  22. package/.duaer/specs/275-release-0271/spec.md +13 -0
  23. package/.duaer/specs/275-release-0271/tasks.md +4 -0
  24. package/.duaer/specs/276-fde08-perf-budget/delivery.json +9 -0
  25. package/.duaer/specs/276-fde08-perf-budget/spec.md +38 -0
  26. package/.duaer/specs/276-fde08-perf-budget/tasks.md +5 -0
  27. package/.duaer/specs/277-project-dir-reuse/delivery.json +9 -0
  28. package/.duaer/specs/277-project-dir-reuse/spec.md +31 -0
  29. package/.duaer/specs/277-project-dir-reuse/tasks.md +5 -0
  30. package/.duaer/specs/278-project-create-unique/delivery.json +9 -0
  31. package/.duaer/specs/278-project-create-unique/spec.md +27 -0
  32. package/.duaer/specs/278-project-create-unique/tasks.md +5 -0
  33. package/.duaer/specs/279-arch-side-detour/delivery.json +8 -0
  34. package/.duaer/specs/279-arch-side-detour/spec.md +28 -0
  35. package/.duaer/specs/279-arch-side-detour/tasks.md +5 -0
  36. package/.duaer/specs/280-arch-bottom-via-label/delivery.json +8 -0
  37. package/.duaer/specs/280-arch-bottom-via-label/spec.md +22 -0
  38. package/.duaer/specs/280-arch-bottom-via-label/tasks.md +5 -0
  39. package/.duaer/specs/281-release-0272/spec.md +13 -0
  40. package/.duaer/specs/281-release-0272/tasks.md +4 -0
  41. package/AGENTS.md +5 -2
  42. package/CHANGELOG.md +69 -0
  43. package/bin/duaer-live.mjs +202 -23
  44. package/bin/live-archify.mjs +382 -26
  45. package/bin/live-deliverables.mjs +16 -0
  46. package/bin/live-modules.mjs +81 -1
  47. package/bin/live-project-chat.mjs +8 -0
  48. package/bin/live-repo-path.mjs +91 -2
  49. package/docs/agent/branching-and-release.md +16 -0
  50. package/docs/agent/e2e-test-plan.md +10 -0
  51. package/docs/agent/live-desk.md +34 -4
  52. package/docs/agent/workflow.md +2 -0
  53. package/package.json +1 -1
  54. package/web/live-dev/app.js +95 -2
  55. package/web/live-dev/baseline.mjs +4 -0
  56. package/web/live-dev/compat-matrix.mjs +38 -0
  57. package/web/live-dev/confirm-card.mjs +4 -0
  58. package/web/live-dev/data-precheck.mjs +35 -0
  59. package/web/live-dev/env-check.mjs +41 -0
  60. package/web/live-dev/external-deps.mjs +35 -0
  61. package/web/live-dev/i18n-de.js +25 -10
  62. package/web/live-dev/i18n-es.js +25 -10
  63. package/web/live-dev/i18n-fr.js +25 -10
  64. package/web/live-dev/i18n-ja.js +25 -10
  65. package/web/live-dev/i18n-ko.js +25 -10
  66. package/web/live-dev/i18n-pt-BR.js +25 -10
  67. package/web/live-dev/i18n-ru.js +25 -10
  68. package/web/live-dev/i18n-vi.js +25 -10
  69. package/web/live-dev/i18n-zh-TW.js +25 -10
  70. package/web/live-dev/i18n.js +50 -20
  71. package/web/live-dev/index.html +33 -9
  72. package/web/live-dev/perf-budget.mjs +38 -0
@@ -40,23 +40,26 @@ export const de = {
40
40
  "project.title": "Projekte & Chats",
41
41
  "project.close": "Schließen",
42
42
  "project.restore": "Auf den Desk zurückholen",
43
- "project.createTitle": "Projekt erstellen / öffnen",
43
+ "project.createTitle": "Create project",
44
44
  "project.listTitle": "Projekte",
45
45
  "project.convTitle": "Chats in diesem Projekt",
46
- "project.nameLabel": "Ordnername oder absoluter Pfad",
47
- "project.namePh": "my-app oder /Users/…/my-app",
48
- "project.folderLabel": "Ordnername oder absoluter Pfad",
49
- "project.folderPh": "my-app oder /Users/…/my-app",
46
+ "project.nameLabel": "New folder name",
47
+ "project.namePh": "my-app",
48
+ "project.folderLabel": "New folder name",
49
+ "project.folderPh": "my-app",
50
50
  "project.titleLabel": "Projektname",
51
51
  "project.titlePh": "z. B. Rechnungs-Desk",
52
52
  "project.descLabel": "Background",
53
53
  "project.descPh": "Ein oder zwei Zeilen: für wen und was es löst…",
54
54
  "project.needTitle": "Projektnamen eingeben",
55
55
  "project.needDesc": "Kurze Hintergrundbeschreibung eingeben",
56
- "project.activate": "Als aktuelles Projekt verwenden",
56
+ "project.activate": "Create and open",
57
57
  "project.working": "Projekt wird gewechselt…",
58
- "project.browse": "Durchsuchen…",
59
- "project.createHint": "Neue Projekte brauchen Name und Hintergrund. Kurze Namen werden unter dem übergeordneten Ordner erstellt.",
58
+ "project.browse": "Browse to open…",
59
+ "project.createHint": "Pick a parent folder, then a short folder name, title, and background. No paths in the folder name, and no reuse of an existing folder or project title. Open existing projects from the list below or Browse to open…",
60
+ "project.pathExists": "That project folder already exists. Choose another name, or open it from Existing projects",
61
+ "project.needShortName": "Create only accepts a short folder name, not an absolute path",
62
+ "project.titleExists": "A project with that title already exists. Choose another title, or open it from Existing projects",
60
63
  "project.gateHint": "Noch kein Projekt — tippen Sie Projekte (oben rechts)",
61
64
  "project.noneBadge": "Kein Projekt",
62
65
  "project.activeBadge": "Projekt: {name}",
@@ -203,8 +206,8 @@ export const de = {
203
206
  "card.acceptHint": "Prüfbares Ergebnis: wo öffnen / was sehen / welcher Befehl besteht (nicht „sieht besser aus“)",
204
207
  "card.assume": "Annahmen",
205
208
  "card.device": "Browser / device matrix",
206
- "card.deviceHint": "e.g. latest two Chrome, mobile Safari — not “modern browsers”",
207
- "card.devicePh": "e.g. latest two Chrome, mobile Safari",
209
+ "card.deviceHint": "Name at least two browsers or domestic clients, plus screenshot/cloud evidence and a fallback",
210
+ "card.devicePh": "e.g. latest two Chrome, mobile Safari, UOS; screenshots in compat/; old shell shows upgrade",
208
211
  "card.paths": "Critical paths",
209
212
  "card.pathsHint": "Main paths that joint debugging must cover",
210
213
  "card.pathsPh": "e.g. sign-in → home → submit form",
@@ -214,6 +217,18 @@ export const de = {
214
217
  "card.apiContract": "API contract",
215
218
  "card.apiContractHint": "OpenAPI/types path; or write “no HTTP API for this module”",
216
219
  "card.apiContractPh": "e.g. openapi/openapi.yaml or no HTTP API for this module",
220
+ "card.envChecklist": "Environment checklist",
221
+ "card.envChecklistHint": "DNS, TLS, CORS, auth, and third-party must all pass before kickoff; or write “no customer environment”",
222
+ "card.envChecklistPh": "e.g. DNS pass; TLS pass; CORS pass; auth pass; third-party reachable. Or no customer environment",
223
+ "card.dataPrecheck": "Data precheck",
224
+ "card.dataPrecheckHint": "Name the field mapping, the import failure list, and that it can be exported; or write “no import”",
225
+ "card.dataPrecheckPh": "e.g. field mapping in mapping.csv; import precheck failure list; export for cleanup. Or no import",
226
+ "card.externalDeps": "External dependencies",
227
+ "card.externalDepsHint": "For a third party, ERP, or SSO, name the blocker, SLA, backup mock, and a parallel path; or write “no external dependency”",
228
+ "card.externalDepsPh": "e.g. blocker: vendor API; SLA 2 days; backup mock; parallel path without SSO. Or no external dependency",
229
+ "card.perfBudget": "Performance budget",
230
+ "card.perfBudgetHint": "Name LCP, INP, bundle size, virtualized long lists, a weak-network check, and a large-data check. “Pretty fast” fails. If there is no page, write “no page performance”",
231
+ "card.perfBudgetPh": "e.g. LCP 2.5s; INP 200ms; bundle under 200kb; virtual scroll for long lists; weak network 3G; large data load test. Or no page performance",
217
232
  "baseline.mark": "Scope + acceptance baseline (FDE-01)",
218
233
  "baseline.hint": "No unsigned baseline may kick off; changes need a change order and re-sign",
219
234
  "baseline.signer": "Signer",
@@ -40,23 +40,26 @@ export const es = {
40
40
  "project.title": "Proyectos y chats",
41
41
  "project.close": "Cerrar",
42
42
  "project.restore": "Restaurar en el escritorio",
43
- "project.createTitle": "Crear / abrir proyecto",
43
+ "project.createTitle": "Create project",
44
44
  "project.listTitle": "Proyectos",
45
45
  "project.convTitle": "Chats en este proyecto",
46
- "project.nameLabel": "Nombre de carpeta o ruta absoluta",
47
- "project.namePh": "my-app o /Users/…/my-app",
48
- "project.folderLabel": "Nombre de carpeta o ruta absoluta",
49
- "project.folderPh": "my-app o /Users/…/my-app",
46
+ "project.nameLabel": "New folder name",
47
+ "project.namePh": "my-app",
48
+ "project.folderLabel": "New folder name",
49
+ "project.folderPh": "my-app",
50
50
  "project.titleLabel": "Nombre del proyecto",
51
51
  "project.titlePh": "p. ej. Escritorio de facturas",
52
52
  "project.descLabel": "Background",
53
53
  "project.descPh": "Una o dos líneas: para quién es y qué resuelve…",
54
54
  "project.needTitle": "Introduce un nombre de proyecto",
55
55
  "project.needDesc": "Introduce una descripción breve de contexto",
56
- "project.activate": "Usar como proyecto actual",
56
+ "project.activate": "Create and open",
57
57
  "project.working": "Cambiando de proyecto…",
58
- "project.browse": "Examinar…",
59
- "project.createHint": "Los proyectos nuevos necesitan nombre y contexto. Los nombres cortos se crean bajo la carpeta padre.",
58
+ "project.browse": "Browse to open…",
59
+ "project.createHint": "Pick a parent folder, then a short folder name, title, and background. No paths in the folder name, and no reuse of an existing folder or project title. Open existing projects from the list below or Browse to open…",
60
+ "project.pathExists": "That project folder already exists. Choose another name, or open it from Existing projects",
61
+ "project.needShortName": "Create only accepts a short folder name, not an absolute path",
62
+ "project.titleExists": "A project with that title already exists. Choose another title, or open it from Existing projects",
60
63
  "project.gateHint": "Aún no hay proyecto — toca Proyectos (arriba a la derecha)",
61
64
  "project.noneBadge": "Sin proyecto",
62
65
  "project.activeBadge": "Proyecto: {name}",
@@ -203,8 +206,8 @@ export const es = {
203
206
  "card.acceptHint": "Resultado verificable: abrir dónde / ver qué / qué comando pasa (no «se ve mejor»)",
204
207
  "card.assume": "Suposiciones",
205
208
  "card.device": "Browser / device matrix",
206
- "card.deviceHint": "e.g. latest two Chrome, mobile Safari — not “modern browsers”",
207
- "card.devicePh": "e.g. latest two Chrome, mobile Safari",
209
+ "card.deviceHint": "Name at least two browsers or domestic clients, plus screenshot/cloud evidence and a fallback",
210
+ "card.devicePh": "e.g. latest two Chrome, mobile Safari, UOS; screenshots in compat/; old shell shows upgrade",
208
211
  "card.paths": "Critical paths",
209
212
  "card.pathsHint": "Main paths that joint debugging must cover",
210
213
  "card.pathsPh": "e.g. sign-in → home → submit form",
@@ -214,6 +217,18 @@ export const es = {
214
217
  "card.apiContract": "API contract",
215
218
  "card.apiContractHint": "OpenAPI/types path; or write “no HTTP API for this module”",
216
219
  "card.apiContractPh": "e.g. openapi/openapi.yaml or no HTTP API for this module",
220
+ "card.envChecklist": "Environment checklist",
221
+ "card.envChecklistHint": "DNS, TLS, CORS, auth, and third-party must all pass before kickoff; or write “no customer environment”",
222
+ "card.envChecklistPh": "e.g. DNS pass; TLS pass; CORS pass; auth pass; third-party reachable. Or no customer environment",
223
+ "card.dataPrecheck": "Data precheck",
224
+ "card.dataPrecheckHint": "Name the field mapping, the import failure list, and that it can be exported; or write “no import”",
225
+ "card.dataPrecheckPh": "e.g. field mapping in mapping.csv; import precheck failure list; export for cleanup. Or no import",
226
+ "card.externalDeps": "External dependencies",
227
+ "card.externalDepsHint": "For a third party, ERP, or SSO, name the blocker, SLA, backup mock, and a parallel path; or write “no external dependency”",
228
+ "card.externalDepsPh": "e.g. blocker: vendor API; SLA 2 days; backup mock; parallel path without SSO. Or no external dependency",
229
+ "card.perfBudget": "Performance budget",
230
+ "card.perfBudgetHint": "Name LCP, INP, bundle size, virtualized long lists, a weak-network check, and a large-data check. “Pretty fast” fails. If there is no page, write “no page performance”",
231
+ "card.perfBudgetPh": "e.g. LCP 2.5s; INP 200ms; bundle under 200kb; virtual scroll for long lists; weak network 3G; large data load test. Or no page performance",
217
232
  "baseline.mark": "Scope + acceptance baseline (FDE-01)",
218
233
  "baseline.hint": "No unsigned baseline may kick off; changes need a change order and re-sign",
219
234
  "baseline.signer": "Signer",
@@ -40,23 +40,26 @@ export const fr = {
40
40
  "project.title": "Projets et chats",
41
41
  "project.close": "Fermer",
42
42
  "project.restore": "Restaurer sur le bureau",
43
- "project.createTitle": "Créer / ouvrir un projet",
43
+ "project.createTitle": "Create project",
44
44
  "project.listTitle": "Projets",
45
45
  "project.convTitle": "Chats de ce projet",
46
- "project.nameLabel": "Nom de dossier ou chemin absolu",
47
- "project.namePh": "my-app ou /Users/…/my-app",
48
- "project.folderLabel": "Nom de dossier ou chemin absolu",
49
- "project.folderPh": "my-app ou /Users/…/my-app",
46
+ "project.nameLabel": "New folder name",
47
+ "project.namePh": "my-app",
48
+ "project.folderLabel": "New folder name",
49
+ "project.folderPh": "my-app",
50
50
  "project.titleLabel": "Nom du projet",
51
51
  "project.titlePh": "ex. Bureau factures",
52
52
  "project.descLabel": "Background",
53
53
  "project.descPh": "Une ou deux lignes : pour qui et ce que ça résout…",
54
54
  "project.needTitle": "Saisissez un nom de projet",
55
55
  "project.needDesc": "Saisissez une courte description de contexte",
56
- "project.activate": "Utiliser comme projet actuel",
56
+ "project.activate": "Create and open",
57
57
  "project.working": "Changement de projet…",
58
- "project.browse": "Parcourir…",
59
- "project.createHint": "Les nouveaux projets nécessitent un nom et un contexte. Les noms courts sont créés sous le dossier parent.",
58
+ "project.browse": "Browse to open…",
59
+ "project.createHint": "Pick a parent folder, then a short folder name, title, and background. No paths in the folder name, and no reuse of an existing folder or project title. Open existing projects from the list below or Browse to open…",
60
+ "project.pathExists": "That project folder already exists. Choose another name, or open it from Existing projects",
61
+ "project.needShortName": "Create only accepts a short folder name, not an absolute path",
62
+ "project.titleExists": "A project with that title already exists. Choose another title, or open it from Existing projects",
60
63
  "project.gateHint": "Aucun projet — touchez Projets (en haut à droite)",
61
64
  "project.noneBadge": "Aucun projet",
62
65
  "project.activeBadge": "Projet : {name}",
@@ -203,8 +206,8 @@ export const fr = {
203
206
  "card.acceptHint": "Résultat vérifiable : ouvrir où / voir quoi / quelle commande réussit (pas « plus joli »)",
204
207
  "card.assume": "Hypothèses",
205
208
  "card.device": "Browser / device matrix",
206
- "card.deviceHint": "e.g. latest two Chrome, mobile Safari — not “modern browsers”",
207
- "card.devicePh": "e.g. latest two Chrome, mobile Safari",
209
+ "card.deviceHint": "Name at least two browsers or domestic clients, plus screenshot/cloud evidence and a fallback",
210
+ "card.devicePh": "e.g. latest two Chrome, mobile Safari, UOS; screenshots in compat/; old shell shows upgrade",
208
211
  "card.paths": "Critical paths",
209
212
  "card.pathsHint": "Main paths that joint debugging must cover",
210
213
  "card.pathsPh": "e.g. sign-in → home → submit form",
@@ -214,6 +217,18 @@ export const fr = {
214
217
  "card.apiContract": "API contract",
215
218
  "card.apiContractHint": "OpenAPI/types path; or write “no HTTP API for this module”",
216
219
  "card.apiContractPh": "e.g. openapi/openapi.yaml or no HTTP API for this module",
220
+ "card.envChecklist": "Environment checklist",
221
+ "card.envChecklistHint": "DNS, TLS, CORS, auth, and third-party must all pass before kickoff; or write “no customer environment”",
222
+ "card.envChecklistPh": "e.g. DNS pass; TLS pass; CORS pass; auth pass; third-party reachable. Or no customer environment",
223
+ "card.dataPrecheck": "Data precheck",
224
+ "card.dataPrecheckHint": "Name the field mapping, the import failure list, and that it can be exported; or write “no import”",
225
+ "card.dataPrecheckPh": "e.g. field mapping in mapping.csv; import precheck failure list; export for cleanup. Or no import",
226
+ "card.externalDeps": "External dependencies",
227
+ "card.externalDepsHint": "For a third party, ERP, or SSO, name the blocker, SLA, backup mock, and a parallel path; or write “no external dependency”",
228
+ "card.externalDepsPh": "e.g. blocker: vendor API; SLA 2 days; backup mock; parallel path without SSO. Or no external dependency",
229
+ "card.perfBudget": "Performance budget",
230
+ "card.perfBudgetHint": "Name LCP, INP, bundle size, virtualized long lists, a weak-network check, and a large-data check. “Pretty fast” fails. If there is no page, write “no page performance”",
231
+ "card.perfBudgetPh": "e.g. LCP 2.5s; INP 200ms; bundle under 200kb; virtual scroll for long lists; weak network 3G; large data load test. Or no page performance",
217
232
  "baseline.mark": "Scope + acceptance baseline (FDE-01)",
218
233
  "baseline.hint": "No unsigned baseline may kick off; changes need a change order and re-sign",
219
234
  "baseline.signer": "Signer",
@@ -40,23 +40,26 @@ export const ja = {
40
40
  "project.title": "プロジェクトとチャット",
41
41
  "project.close": "閉じる",
42
42
  "project.restore": "デスクに復元",
43
- "project.createTitle": "プロジェクトを作成 / 開く",
43
+ "project.createTitle": "Create project",
44
44
  "project.listTitle": "プロジェクト",
45
45
  "project.convTitle": "このプロジェクトのチャット",
46
- "project.nameLabel": "フォルダ名または絶対パス",
47
- "project.namePh": "my-app または /Users/…/my-app",
48
- "project.folderLabel": "フォルダ名または絶対パス",
49
- "project.folderPh": "my-app または /Users/…/my-app",
46
+ "project.nameLabel": "New folder name",
47
+ "project.namePh": "my-app",
48
+ "project.folderLabel": "New folder name",
49
+ "project.folderPh": "my-app",
50
50
  "project.titleLabel": "プロジェクト名",
51
51
  "project.titlePh": "例:請求書デスク",
52
52
  "project.descLabel": "Background",
53
53
  "project.descPh": "1〜2行:誰向けで、何を解決するか…",
54
54
  "project.needTitle": "プロジェクト名を入力してください",
55
55
  "project.needDesc": "短い背景説明を入力してください",
56
- "project.activate": "現在のプロジェクトにする",
56
+ "project.activate": "Create and open",
57
57
  "project.working": "プロジェクトを切り替えています…",
58
- "project.browse": "参照…",
59
- "project.createHint": "新規プロジェクトには名前と背景が必要です。短い名前は親フォルダ配下に作成されます。",
58
+ "project.browse": "Browse to open…",
59
+ "project.createHint": "Pick a parent folder, then a short folder name, title, and background. No paths in the folder name, and no reuse of an existing folder or project title. Open existing projects from the list below or Browse to open…",
60
+ "project.pathExists": "That project folder already exists. Choose another name, or open it from Existing projects",
61
+ "project.needShortName": "Create only accepts a short folder name, not an absolute path",
62
+ "project.titleExists": "A project with that title already exists. Choose another title, or open it from Existing projects",
60
63
  "project.gateHint": "プロジェクトがありません — 右上の「プロジェクト」をタップ",
61
64
  "project.noneBadge": "プロジェクトなし",
62
65
  "project.activeBadge": "プロジェクト: {name}",
@@ -203,8 +206,8 @@ export const ja = {
203
206
  "card.acceptHint": "検証可能な結果: どこを開き / 何が見え / どのコマンドが通るか(「見た目が良く」は不可)",
204
207
  "card.assume": "前提",
205
208
  "card.device": "ブラウザ/端末マトリクス",
206
- "card.deviceHint": "e.g. latest two Chrome, mobile Safari — not “modern browsers”",
207
- "card.devicePh": "e.g. latest two Chrome, mobile Safari",
209
+ "card.deviceHint": "Name at least two browsers or domestic clients, plus screenshot/cloud evidence and a fallback",
210
+ "card.devicePh": "e.g. latest two Chrome, mobile Safari, UOS; screenshots in compat/; old shell shows upgrade",
208
211
  "card.paths": "重要パス",
209
212
  "card.pathsHint": "Main paths that joint debugging must cover",
210
213
  "card.pathsPh": "e.g. sign-in → home → submit form",
@@ -214,6 +217,18 @@ export const ja = {
214
217
  "card.apiContract": "API contract",
215
218
  "card.apiContractHint": "OpenAPI/types path; or write “no HTTP API for this module”",
216
219
  "card.apiContractPh": "e.g. openapi/openapi.yaml or no HTTP API for this module",
220
+ "card.envChecklist": "Environment checklist",
221
+ "card.envChecklistHint": "DNS, TLS, CORS, auth, and third-party must all pass before kickoff; or write “no customer environment”",
222
+ "card.envChecklistPh": "e.g. DNS pass; TLS pass; CORS pass; auth pass; third-party reachable. Or no customer environment",
223
+ "card.dataPrecheck": "Data precheck",
224
+ "card.dataPrecheckHint": "Name the field mapping, the import failure list, and that it can be exported; or write “no import”",
225
+ "card.dataPrecheckPh": "e.g. field mapping in mapping.csv; import precheck failure list; export for cleanup. Or no import",
226
+ "card.externalDeps": "External dependencies",
227
+ "card.externalDepsHint": "For a third party, ERP, or SSO, name the blocker, SLA, backup mock, and a parallel path; or write “no external dependency”",
228
+ "card.externalDepsPh": "e.g. blocker: vendor API; SLA 2 days; backup mock; parallel path without SSO. Or no external dependency",
229
+ "card.perfBudget": "Performance budget",
230
+ "card.perfBudgetHint": "Name LCP, INP, bundle size, virtualized long lists, a weak-network check, and a large-data check. “Pretty fast” fails. If there is no page, write “no page performance”",
231
+ "card.perfBudgetPh": "e.g. LCP 2.5s; INP 200ms; bundle under 200kb; virtual scroll for long lists; weak network 3G; large data load test. Or no page performance",
217
232
  "baseline.mark": "範囲+受入ベースライン(FDE-01)",
218
233
  "baseline.hint": "No unsigned baseline may kick off; changes need a change order and re-sign",
219
234
  "baseline.signer": "署名者",
@@ -40,23 +40,26 @@ export const ko = {
40
40
  "project.title": "프로젝트와 채팅",
41
41
  "project.close": "닫기",
42
42
  "project.restore": "데스크로 복원",
43
- "project.createTitle": "프로젝트 만들기 / 열기",
43
+ "project.createTitle": "Create project",
44
44
  "project.listTitle": "프로젝트",
45
45
  "project.convTitle": "이 프로젝트의 채팅",
46
- "project.nameLabel": "폴더 이름 또는 절대 경로",
47
- "project.namePh": "my-app 또는 /Users/…/my-app",
48
- "project.folderLabel": "폴더 이름 또는 절대 경로",
49
- "project.folderPh": "my-app 또는 /Users/…/my-app",
46
+ "project.nameLabel": "New folder name",
47
+ "project.namePh": "my-app",
48
+ "project.folderLabel": "New folder name",
49
+ "project.folderPh": "my-app",
50
50
  "project.titleLabel": "프로젝트 이름",
51
51
  "project.titlePh": "예: 송장 데스크",
52
52
  "project.descLabel": "Background",
53
53
  "project.descPh": "한두 줄: 누구를 위한 것이며 무엇을 해결하는지…",
54
54
  "project.needTitle": "프로젝트 이름을 입력하세요",
55
55
  "project.needDesc": "짧은 배경 설명을 입력하세요",
56
- "project.activate": "현재 프로젝트로 사용",
56
+ "project.activate": "Create and open",
57
57
  "project.working": "프로젝트를 전환하는 중…",
58
- "project.browse": "찾아보기…",
59
- "project.createHint": "새 프로젝트에는 이름과 배경이 필요합니다. 짧은 이름은 상위 폴더 아래에 만들어집니다.",
58
+ "project.browse": "Browse to open…",
59
+ "project.createHint": "Pick a parent folder, then a short folder name, title, and background. No paths in the folder name, and no reuse of an existing folder or project title. Open existing projects from the list below or Browse to open…",
60
+ "project.pathExists": "That project folder already exists. Choose another name, or open it from Existing projects",
61
+ "project.needShortName": "Create only accepts a short folder name, not an absolute path",
62
+ "project.titleExists": "A project with that title already exists. Choose another title, or open it from Existing projects",
60
63
  "project.gateHint": "아직 프로젝트 없음 — 오른쪽 위「프로젝트」를 탭하세요",
61
64
  "project.noneBadge": "프로젝트 없음",
62
65
  "project.activeBadge": "프로젝트: {name}",
@@ -203,8 +206,8 @@ export const ko = {
203
206
  "card.acceptHint": "검증 가능한 결과: 어디를 열고 / 무엇이 보이고 / 어떤 명령이 통과하는지(「더 좋아 보임」은 안 됨)",
204
207
  "card.assume": "가정",
205
208
  "card.device": "Browser / device matrix",
206
- "card.deviceHint": "e.g. latest two Chrome, mobile Safari — not “modern browsers”",
207
- "card.devicePh": "e.g. latest two Chrome, mobile Safari",
209
+ "card.deviceHint": "Name at least two browsers or domestic clients, plus screenshot/cloud evidence and a fallback",
210
+ "card.devicePh": "e.g. latest two Chrome, mobile Safari, UOS; screenshots in compat/; old shell shows upgrade",
208
211
  "card.paths": "Critical paths",
209
212
  "card.pathsHint": "Main paths that joint debugging must cover",
210
213
  "card.pathsPh": "e.g. sign-in → home → submit form",
@@ -214,6 +217,18 @@ export const ko = {
214
217
  "card.apiContract": "API contract",
215
218
  "card.apiContractHint": "OpenAPI/types path; or write “no HTTP API for this module”",
216
219
  "card.apiContractPh": "e.g. openapi/openapi.yaml or no HTTP API for this module",
220
+ "card.envChecklist": "Environment checklist",
221
+ "card.envChecklistHint": "DNS, TLS, CORS, auth, and third-party must all pass before kickoff; or write “no customer environment”",
222
+ "card.envChecklistPh": "e.g. DNS pass; TLS pass; CORS pass; auth pass; third-party reachable. Or no customer environment",
223
+ "card.dataPrecheck": "Data precheck",
224
+ "card.dataPrecheckHint": "Name the field mapping, the import failure list, and that it can be exported; or write “no import”",
225
+ "card.dataPrecheckPh": "e.g. field mapping in mapping.csv; import precheck failure list; export for cleanup. Or no import",
226
+ "card.externalDeps": "External dependencies",
227
+ "card.externalDepsHint": "For a third party, ERP, or SSO, name the blocker, SLA, backup mock, and a parallel path; or write “no external dependency”",
228
+ "card.externalDepsPh": "e.g. blocker: vendor API; SLA 2 days; backup mock; parallel path without SSO. Or no external dependency",
229
+ "card.perfBudget": "Performance budget",
230
+ "card.perfBudgetHint": "Name LCP, INP, bundle size, virtualized long lists, a weak-network check, and a large-data check. “Pretty fast” fails. If there is no page, write “no page performance”",
231
+ "card.perfBudgetPh": "e.g. LCP 2.5s; INP 200ms; bundle under 200kb; virtual scroll for long lists; weak network 3G; large data load test. Or no page performance",
217
232
  "baseline.mark": "Scope + acceptance baseline (FDE-01)",
218
233
  "baseline.hint": "No unsigned baseline may kick off; changes need a change order and re-sign",
219
234
  "baseline.signer": "Signer",
@@ -40,23 +40,26 @@ export const ptBR = {
40
40
  "project.title": "Projetos e conversas",
41
41
  "project.close": "Fechar",
42
42
  "project.restore": "Restaurar na mesa",
43
- "project.createTitle": "Criar / abrir projeto",
43
+ "project.createTitle": "Create project",
44
44
  "project.listTitle": "Projetos",
45
45
  "project.convTitle": "Conversas neste projeto",
46
- "project.nameLabel": "Nome da pasta ou caminho absoluto",
47
- "project.namePh": "my-app ou /Users/…/my-app",
48
- "project.folderLabel": "Nome da pasta ou caminho absoluto",
49
- "project.folderPh": "my-app ou /Users/…/my-app",
46
+ "project.nameLabel": "New folder name",
47
+ "project.namePh": "my-app",
48
+ "project.folderLabel": "New folder name",
49
+ "project.folderPh": "my-app",
50
50
  "project.titleLabel": "Nome do projeto",
51
51
  "project.titlePh": "ex.: Mesa de faturas",
52
52
  "project.descLabel": "Background",
53
53
  "project.descPh": "Uma ou duas linhas: para quem é e o que resolve…",
54
54
  "project.needTitle": "Informe um nome de projeto",
55
55
  "project.needDesc": "Informe uma descrição curta de contexto",
56
- "project.activate": "Usar como projeto atual",
56
+ "project.activate": "Create and open",
57
57
  "project.working": "Trocando de projeto…",
58
- "project.browse": "Procurar…",
59
- "project.createHint": "Projetos novos precisam de nome e contexto. Nomes curtos são criados na pasta pai.",
58
+ "project.browse": "Browse to open…",
59
+ "project.createHint": "Pick a parent folder, then a short folder name, title, and background. No paths in the folder name, and no reuse of an existing folder or project title. Open existing projects from the list below or Browse to open…",
60
+ "project.pathExists": "That project folder already exists. Choose another name, or open it from Existing projects",
61
+ "project.needShortName": "Create only accepts a short folder name, not an absolute path",
62
+ "project.titleExists": "A project with that title already exists. Choose another title, or open it from Existing projects",
60
63
  "project.gateHint": "Nenhum projeto ainda — toque em Projetos (canto superior direito)",
61
64
  "project.noneBadge": "Sem projeto",
62
65
  "project.activeBadge": "Projeto: {name}",
@@ -203,8 +206,8 @@ export const ptBR = {
203
206
  "card.acceptHint": "Resultado verificável: abrir onde / ver o quê / qual comando passa (não “ficou melhor”)",
204
207
  "card.assume": "Premissas",
205
208
  "card.device": "Browser / device matrix",
206
- "card.deviceHint": "e.g. latest two Chrome, mobile Safari — not “modern browsers”",
207
- "card.devicePh": "e.g. latest two Chrome, mobile Safari",
209
+ "card.deviceHint": "Name at least two browsers or domestic clients, plus screenshot/cloud evidence and a fallback",
210
+ "card.devicePh": "e.g. latest two Chrome, mobile Safari, UOS; screenshots in compat/; old shell shows upgrade",
208
211
  "card.paths": "Critical paths",
209
212
  "card.pathsHint": "Main paths that joint debugging must cover",
210
213
  "card.pathsPh": "e.g. sign-in → home → submit form",
@@ -214,6 +217,18 @@ export const ptBR = {
214
217
  "card.apiContract": "API contract",
215
218
  "card.apiContractHint": "OpenAPI/types path; or write “no HTTP API for this module”",
216
219
  "card.apiContractPh": "e.g. openapi/openapi.yaml or no HTTP API for this module",
220
+ "card.envChecklist": "Environment checklist",
221
+ "card.envChecklistHint": "DNS, TLS, CORS, auth, and third-party must all pass before kickoff; or write “no customer environment”",
222
+ "card.envChecklistPh": "e.g. DNS pass; TLS pass; CORS pass; auth pass; third-party reachable. Or no customer environment",
223
+ "card.dataPrecheck": "Data precheck",
224
+ "card.dataPrecheckHint": "Name the field mapping, the import failure list, and that it can be exported; or write “no import”",
225
+ "card.dataPrecheckPh": "e.g. field mapping in mapping.csv; import precheck failure list; export for cleanup. Or no import",
226
+ "card.externalDeps": "External dependencies",
227
+ "card.externalDepsHint": "For a third party, ERP, or SSO, name the blocker, SLA, backup mock, and a parallel path; or write “no external dependency”",
228
+ "card.externalDepsPh": "e.g. blocker: vendor API; SLA 2 days; backup mock; parallel path without SSO. Or no external dependency",
229
+ "card.perfBudget": "Performance budget",
230
+ "card.perfBudgetHint": "Name LCP, INP, bundle size, virtualized long lists, a weak-network check, and a large-data check. “Pretty fast” fails. If there is no page, write “no page performance”",
231
+ "card.perfBudgetPh": "e.g. LCP 2.5s; INP 200ms; bundle under 200kb; virtual scroll for long lists; weak network 3G; large data load test. Or no page performance",
217
232
  "baseline.mark": "Scope + acceptance baseline (FDE-01)",
218
233
  "baseline.hint": "No unsigned baseline may kick off; changes need a change order and re-sign",
219
234
  "baseline.signer": "Signer",
@@ -40,23 +40,26 @@ export const ru = {
40
40
  "project.title": "Проекты и чаты",
41
41
  "project.close": "Закрыть",
42
42
  "project.restore": "Восстановить на стол",
43
- "project.createTitle": "Создать / открыть проект",
43
+ "project.createTitle": "Create project",
44
44
  "project.listTitle": "Проекты",
45
45
  "project.convTitle": "Чаты в этом проекте",
46
- "project.nameLabel": "Имя папки или абсолютный путь",
47
- "project.namePh": "my-app или /Users/…/my-app",
48
- "project.folderLabel": "Имя папки или абсолютный путь",
49
- "project.folderPh": "my-app или /Users/…/my-app",
46
+ "project.nameLabel": "New folder name",
47
+ "project.namePh": "my-app",
48
+ "project.folderLabel": "New folder name",
49
+ "project.folderPh": "my-app",
50
50
  "project.titleLabel": "Название проекта",
51
51
  "project.titlePh": "напр. Invoice desk",
52
52
  "project.descLabel": "Background",
53
53
  "project.descPh": "Одна-две строки: для кого и какую задачу решает…",
54
54
  "project.needTitle": "Введите название проекта",
55
55
  "project.needDesc": "Введите краткое описание фона",
56
- "project.activate": "Сделать текущим проектом",
56
+ "project.activate": "Create and open",
57
57
  "project.working": "Переключение проекта…",
58
- "project.browse": "Обзор…",
59
- "project.createHint": "Новому проекту нужны имя и фон. Короткие имена создаются в родительской папке.",
58
+ "project.browse": "Browse to open…",
59
+ "project.createHint": "Pick a parent folder, then a short folder name, title, and background. No paths in the folder name, and no reuse of an existing folder or project title. Open existing projects from the list below or Browse to open…",
60
+ "project.pathExists": "That project folder already exists. Choose another name, or open it from Existing projects",
61
+ "project.needShortName": "Create only accepts a short folder name, not an absolute path",
62
+ "project.titleExists": "A project with that title already exists. Choose another title, or open it from Existing projects",
60
63
  "project.gateHint": "Проекта ещё нет — нажмите «Проекты» (справа вверху)",
61
64
  "project.noneBadge": "Нет проекта",
62
65
  "project.activeBadge": "Проект: {name}",
@@ -203,8 +206,8 @@ export const ru = {
203
206
  "card.acceptHint": "Проверяемый результат: где открыть / что увидеть / какая команда проходит (не «выглядит лучше»)",
204
207
  "card.assume": "Допущения",
205
208
  "card.device": "Browser / device matrix",
206
- "card.deviceHint": "e.g. latest two Chrome, mobile Safari — not “modern browsers”",
207
- "card.devicePh": "e.g. latest two Chrome, mobile Safari",
209
+ "card.deviceHint": "Name at least two browsers or domestic clients, plus screenshot/cloud evidence and a fallback",
210
+ "card.devicePh": "e.g. latest two Chrome, mobile Safari, UOS; screenshots in compat/; old shell shows upgrade",
208
211
  "card.paths": "Critical paths",
209
212
  "card.pathsHint": "Main paths that joint debugging must cover",
210
213
  "card.pathsPh": "e.g. sign-in → home → submit form",
@@ -214,6 +217,18 @@ export const ru = {
214
217
  "card.apiContract": "API contract",
215
218
  "card.apiContractHint": "OpenAPI/types path; or write “no HTTP API for this module”",
216
219
  "card.apiContractPh": "e.g. openapi/openapi.yaml or no HTTP API for this module",
220
+ "card.envChecklist": "Environment checklist",
221
+ "card.envChecklistHint": "DNS, TLS, CORS, auth, and third-party must all pass before kickoff; or write “no customer environment”",
222
+ "card.envChecklistPh": "e.g. DNS pass; TLS pass; CORS pass; auth pass; third-party reachable. Or no customer environment",
223
+ "card.dataPrecheck": "Data precheck",
224
+ "card.dataPrecheckHint": "Name the field mapping, the import failure list, and that it can be exported; or write “no import”",
225
+ "card.dataPrecheckPh": "e.g. field mapping in mapping.csv; import precheck failure list; export for cleanup. Or no import",
226
+ "card.externalDeps": "External dependencies",
227
+ "card.externalDepsHint": "For a third party, ERP, or SSO, name the blocker, SLA, backup mock, and a parallel path; or write “no external dependency”",
228
+ "card.externalDepsPh": "e.g. blocker: vendor API; SLA 2 days; backup mock; parallel path without SSO. Or no external dependency",
229
+ "card.perfBudget": "Performance budget",
230
+ "card.perfBudgetHint": "Name LCP, INP, bundle size, virtualized long lists, a weak-network check, and a large-data check. “Pretty fast” fails. If there is no page, write “no page performance”",
231
+ "card.perfBudgetPh": "e.g. LCP 2.5s; INP 200ms; bundle under 200kb; virtual scroll for long lists; weak network 3G; large data load test. Or no page performance",
217
232
  "baseline.mark": "Scope + acceptance baseline (FDE-01)",
218
233
  "baseline.hint": "No unsigned baseline may kick off; changes need a change order and re-sign",
219
234
  "baseline.signer": "Signer",
@@ -40,23 +40,26 @@ export const vi = {
40
40
  "project.title": "Dự án & trò chuyện",
41
41
  "project.close": "Đóng",
42
42
  "project.restore": "Khôi phục lên bàn",
43
- "project.createTitle": "Tạo / mở dự án",
43
+ "project.createTitle": "Create project",
44
44
  "project.listTitle": "Dự án",
45
45
  "project.convTitle": "Trò chuyện trong dự án này",
46
- "project.nameLabel": "Tên thư mục hoặc đường dẫn tuyệt đối",
47
- "project.namePh": "my-app hoặc /Users/…/my-app",
48
- "project.folderLabel": "Tên thư mục hoặc đường dẫn tuyệt đối",
49
- "project.folderPh": "my-app hoặc /Users/…/my-app",
46
+ "project.nameLabel": "New folder name",
47
+ "project.namePh": "my-app",
48
+ "project.folderLabel": "New folder name",
49
+ "project.folderPh": "my-app",
50
50
  "project.titleLabel": "Tên dự án",
51
51
  "project.titlePh": "vd. Invoice desk",
52
52
  "project.descLabel": "Background",
53
53
  "project.descPh": "Một hoặc hai dòng: dành cho ai và giải quyết gì…",
54
54
  "project.needTitle": "Nhập tên dự án",
55
55
  "project.needDesc": "Nhập mô tả nền tảng ngắn",
56
- "project.activate": "Dùng làm dự án hiện tại",
56
+ "project.activate": "Create and open",
57
57
  "project.working": "Đang chuyển dự án…",
58
- "project.browse": "Duyệt…",
59
- "project.createHint": "Dự án mới cần tên và nền tảng. Tên ngắn sẽ được tạo trong thư mục cha.",
58
+ "project.browse": "Browse to open…",
59
+ "project.createHint": "Pick a parent folder, then a short folder name, title, and background. No paths in the folder name, and no reuse of an existing folder or project title. Open existing projects from the list below or Browse to open…",
60
+ "project.pathExists": "That project folder already exists. Choose another name, or open it from Existing projects",
61
+ "project.needShortName": "Create only accepts a short folder name, not an absolute path",
62
+ "project.titleExists": "A project with that title already exists. Choose another title, or open it from Existing projects",
60
63
  "project.gateHint": "Chưa có dự án — chạm Dự án (góc trên phải)",
61
64
  "project.noneBadge": "Không có dự án",
62
65
  "project.activeBadge": "Dự án: {name}",
@@ -203,8 +206,8 @@ export const vi = {
203
206
  "card.acceptHint": "Kết quả kiểm chứng được: mở ở đâu / thấy gì / lệnh nào pass (không phải «trông đẹp hơn»)",
204
207
  "card.assume": "Giả định",
205
208
  "card.device": "Browser / device matrix",
206
- "card.deviceHint": "e.g. latest two Chrome, mobile Safari — not “modern browsers”",
207
- "card.devicePh": "e.g. latest two Chrome, mobile Safari",
209
+ "card.deviceHint": "Name at least two browsers or domestic clients, plus screenshot/cloud evidence and a fallback",
210
+ "card.devicePh": "e.g. latest two Chrome, mobile Safari, UOS; screenshots in compat/; old shell shows upgrade",
208
211
  "card.paths": "Critical paths",
209
212
  "card.pathsHint": "Main paths that joint debugging must cover",
210
213
  "card.pathsPh": "e.g. sign-in → home → submit form",
@@ -214,6 +217,18 @@ export const vi = {
214
217
  "card.apiContract": "API contract",
215
218
  "card.apiContractHint": "OpenAPI/types path; or write “no HTTP API for this module”",
216
219
  "card.apiContractPh": "e.g. openapi/openapi.yaml or no HTTP API for this module",
220
+ "card.envChecklist": "Environment checklist",
221
+ "card.envChecklistHint": "DNS, TLS, CORS, auth, and third-party must all pass before kickoff; or write “no customer environment”",
222
+ "card.envChecklistPh": "e.g. DNS pass; TLS pass; CORS pass; auth pass; third-party reachable. Or no customer environment",
223
+ "card.dataPrecheck": "Data precheck",
224
+ "card.dataPrecheckHint": "Name the field mapping, the import failure list, and that it can be exported; or write “no import”",
225
+ "card.dataPrecheckPh": "e.g. field mapping in mapping.csv; import precheck failure list; export for cleanup. Or no import",
226
+ "card.externalDeps": "External dependencies",
227
+ "card.externalDepsHint": "For a third party, ERP, or SSO, name the blocker, SLA, backup mock, and a parallel path; or write “no external dependency”",
228
+ "card.externalDepsPh": "e.g. blocker: vendor API; SLA 2 days; backup mock; parallel path without SSO. Or no external dependency",
229
+ "card.perfBudget": "Performance budget",
230
+ "card.perfBudgetHint": "Name LCP, INP, bundle size, virtualized long lists, a weak-network check, and a large-data check. “Pretty fast” fails. If there is no page, write “no page performance”",
231
+ "card.perfBudgetPh": "e.g. LCP 2.5s; INP 200ms; bundle under 200kb; virtual scroll for long lists; weak network 3G; large data load test. Or no page performance",
217
232
  "baseline.mark": "Scope + acceptance baseline (FDE-01)",
218
233
  "baseline.hint": "No unsigned baseline may kick off; changes need a change order and re-sign",
219
234
  "baseline.signer": "Signer",