duaer-spec 0.25.0 → 0.25.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.
@@ -1,5 +1,5 @@
1
1
  {
2
- "feature": "250-release-025",
3
- "specPath": ".duaer/specs/250-release-025/spec.md",
2
+ "feature": "252-release-0251",
3
+ "specPath": ".duaer/specs/252-release-0251/spec.md",
4
4
  "source": "chat"
5
5
  }
@@ -0,0 +1,17 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-20T06:20:00.000Z",
4
+ "verification": {
5
+ "levels": ["docs"],
6
+ "commands": [
7
+ "gh release view v0.25.0",
8
+ "gh run list --workflow=npm-publish.yml"
9
+ ],
10
+ "result": "pass",
11
+ "notes": "GitHub Release published; npm Trusted Publishing succeeded for 0.25.0 (registry may lag briefly)"
12
+ },
13
+ "preview": {
14
+ "url": "https://github.com/fujiezee/duaer-spec/releases/tag/v0.25.0",
15
+ "label": "GitHub Release v0.25.0"
16
+ }
17
+ }
@@ -2,4 +2,4 @@
2
2
 
3
3
  - [x] T001 Bump package.json to 0.25.0 and fold CHANGELOG
4
4
  - [x] T002 Update README feature bullets (en + zh-CN)
5
- - [ ] T003 Merge to develop, promote main, push, GitHub release
5
+ - [x] T003 Merge to develop, promote main, push, GitHub release
@@ -0,0 +1,13 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-20T06:50:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0", "L1", "L3"],
6
+ "commands": [
7
+ "node --check web/live-dev/app.js",
8
+ "npm test",
9
+ "npm run test:live"
10
+ ],
11
+ "result": "pass"
12
+ }
13
+ }
@@ -0,0 +1,23 @@
1
+ # Fix: architecture chat must not claim diagram ready without render
2
+
3
+ ## Symptom
4
+
5
+ Left chat shows「架构图已生成」(or equivalent) while the middle「系统架构」
6
+ panel has no diagram. Users think the desk failed silently.
7
+
8
+ ## Cause
9
+
10
+ The model is prompted to say “diagram ready” in prose while putting IR after
11
+ `<<<JSON>>>`. When IR is missing or fails to render, the desk already shows a
12
+ missing hint, but the **original bubble still claims success**.
13
+
14
+ ## Acceptance
15
+
16
+ 1. If architecture chat claims ready but no `architectureUrl` / renderable IR,
17
+ the **same** assistant bubble is rewritten to the missing-diagram copy (no
18
+ leftover “已生成” text).
19
+ 2. That bubble offers「重新生成架构图」; middle panel uses `missing` hint.
20
+ 3. Continue chips are not shown as if a diagram already exists when there is
21
+ no render URL / no components.
22
+ 4. E2E catalog row + L0/L1/L3 smoke markers updated.
23
+ 5. English docs stay CJK-free.
@@ -0,0 +1,5 @@
1
+ - [x] T001 Rewrite claim-without-render bubble (no duplicate “已生成”)
2
+ - [x] T002 Tighten continue-options gate (need URL or components)
3
+ - [x] T003 i18n copy: missing diagram, not “model said ready”
4
+ - [x] T004 E2E catalog + smoke assertion; verify L0/L1/L3
5
+ - [x] T005 Stamp delivery.json
@@ -0,0 +1,13 @@
1
+ # Feature Specification: Release 0.25.1
2
+
3
+ ## Goal
4
+
5
+ Ship 0.25.1: architecture chat no longer leaves a false “diagram ready” line
6
+ when the middle panel has no diagram; promote develop → main; GitHub Release;
7
+ npm Trusted Publishing.
8
+
9
+ ## Acceptance
10
+
11
+ 1. `package.json` is `0.25.1`; CHANGELOG has `0.25.1` (Unreleased cleared).
12
+ 2. README notes the architecture claim / regenerate behavior (en + zh-CN).
13
+ 3. Tag `v0.25.1` on main; GitHub Release published; npm shows `0.25.1`.
@@ -0,0 +1,3 @@
1
+ - [x] T001 Bump package.json to 0.25.1 and fold CHANGELOG
2
+ - [x] T002 Update README architecture note (en + zh-CN)
3
+ - [ ] T003 Merge develop, promote main, push, GitHub release + npm
package/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.25.1 — 2026-09-20
6
+
7
+ ### Fix: architecture chat must not keep a false “diagram ready” line
8
+
9
+ - When chat claims the diagram is ready but no renderable IR/URL arrives, the
10
+ same assistant bubble is rewritten to the missing-diagram copy with
11
+ Regenerate — the left chat no longer leaves a false “diagram ready” line
12
+ without a middle-panel diagram
13
+ - Continue chips only clear when a render URL or real components exist
14
+
5
15
  ## 0.25.0 — 2026-09-20
6
16
 
7
17
  ### Feat: bug path, project timeline, and desk navigation
package/README.md CHANGED
@@ -63,7 +63,7 @@ A local web desk (`duaer live`) for “chat → confirm → dispatch → watch
63
63
  - **Projects.** Create and switch projects; each keeps its own chat and progress.
64
64
  - **Chat until the ask is clear.** Left chat; center confirm cards (goal / out of scope / checkable acceptance). Vague acceptance cannot be confirmed.
65
65
  - **Split big work into modules.** Confirm module by module; nothing starts until you kick off after the ones you care about are confirmed.
66
- - **Architecture diagram.** After requirements, review the system diagram; click it for fullscreen; kickoff waits until architecture is confirmed.
66
+ - **Architecture diagram.** After requirements, review the system diagram; click it for fullscreen; kickoff waits until architecture is confirmed. If chat claims the diagram is ready but the middle panel is empty, the same bubble offers Regenerate — it does not leave a false “ready” line.
67
67
  - **Dispatch digital employees to code.** Pick a product folder and Cursor Agent or Claude Code; work happens in an isolated worktree, not directly on your long-lived branches.
68
68
  - **Visible task progress.** Work is a checklist; each finished item is checked off and the desk refreshes; dependent tasks release in waves so agents don’t pile on blocked work.
69
69
  - **Employee roles.** Top-bar **digital employee** directory (Implementer / Functional regression / Deployer). Optional parallel workers on the same CLI. See the next section.
package/README.zh-CN.md CHANGED
@@ -30,7 +30,7 @@
30
30
  - **项目管理。** 建项目、切换项目;每个项目自己的对话和进度,互不搅在一起。
31
31
  - **聊着把需求聊清楚。** 左边聊天;中间把目标、边界、验收写成确认卡;空话验收过不了,得能检查才给确认。
32
32
  - **大需求可拆成多个模块。** 一块一块确认,确认完一块不会立刻开工,全部谈妥再一起派。
33
- - **系统架构图。** 确认需求后一起看架构;点图可全屏查看;架构确认后才能派工。
33
+ - **系统架构图。** 确认需求后一起看架构;点图可全屏查看;架构确认后才能派工。若对话称已生成但中间栏没有图,同一条气泡会改成提示并提供「重新生成架构图」,不会留下假的「已生成」。
34
34
  - **一键派数字员工写代码。** 选产品目录、选 Cursor Agent 或 Claude Code,点开工;它在隔离目录里改代码,不直接乱动你的主分支。
35
35
  - **任务进度看得见。** 任务拆成一条条可勾选项;做完勾一项,台面实时刷新;有依赖的任务会排队放行,不会一窝蜂乱做。
36
36
  - **数字员工分工。** 顶部有「数字员工」目录(实现 / 功能回归 / 部署);可开多个并行(同一套 CLI)。详见下一节。
@@ -164,6 +164,7 @@ the table for their app.
164
164
  | E2E-192 | Project timeline merges initial/revise/bug by time; chat quick-nav jumps to 4 anchors | `npm test` + `npm run test:live` + manual |
165
165
  | E2E-193 | Chat quick-nav stays visible inside chat column (not clipped/covered) | `npm run test:live` + manual |
166
166
  | E2E-194 | After deploy, result bar still offers 再改一版 and 修 bug | `npm run test:live` + manual |
167
+ | E2E-195 | Architecture claim-ready without IR rewrites the same chat bubble (no leftover false “diagram ready”) + regenerate | `npm run test:live` + manual |
167
168
 
168
169
  | E2E-156 | Accepted chat bubble preview URL is a clickable `<a>` (http(s) or /api/…) | `npm test` + `npm run test:live` |
169
170
  | E2E-157 | `http://host/api/result/…` chat links render as one clean `<a>` (no nested HTML garble) | `npm test` |
@@ -393,4 +394,5 @@ the table for their app.
393
394
  | E2E-192 | `247-timeline-quicknav` | timeline sort + chat quick nav |
394
395
  | E2E-193 | `248-quicknav-visible` | quick-nav not clipped by overflow |
395
396
  | E2E-194 | `249-result-cta-after-deploy` | result CTAs remain after deploy |
397
+ | E2E-195 | `251-arch-claim-no-diagram` | rewrite claim-ready bubble when IR missing |
396
398
 
@@ -76,6 +76,9 @@ registry linking into the requirements document (no duplicate full cards).
76
76
  **not** start Terminal workers.
77
77
  4. When all relevant modules are confirmed, the desk unlocks architecture
78
78
  review (Archify). After **architecture confirm**, kickoff UI opens.
79
+ Architecture chat may claim the diagram is ready before IR arrives; if the
80
+ middle panel has no diagram, the **same** chat bubble is rewritten to offer
81
+ Regenerate diagram (it must not leave a false “diagram ready” line).
79
82
 
80
83
  ## Bug dispatch (defect path)
81
84
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "duaer-spec",
3
- "version": "0.25.0",
3
+ "version": "0.25.1",
4
4
  "description": "Norms → satisfactory delivery: digital employees for Cursor, Claude, Codex, Copilot, Windsurf, Cline, Continue, Gemini, Aider",
5
5
  "type": "module",
6
6
  "bin": {
@@ -2591,10 +2591,12 @@ function afterChatBubbleUi({ forceRight = false } = {}) {
2591
2591
  }
2592
2592
 
2593
2593
  function architectureContinueOptions(parsed) {
2594
- const hasIr =
2595
- parsed?.ready &&
2596
- (Array.isArray(parsed.components) || parsed.diagram_type === "architecture");
2597
- if (hasIr) return [];
2594
+ // Only treat as “diagram ready” when we have a render URL or real components.
2595
+ // ready + diagram_type alone is a common false claim from the model.
2596
+ const hasRenderable =
2597
+ Boolean(String(parsed?.architectureUrl || "").trim()) ||
2598
+ (Array.isArray(parsed?.components) && parsed.components.length > 0);
2599
+ if (hasRenderable) return [];
2598
2600
  if (Array.isArray(parsed?.options) && parsed.options.length) {
2599
2601
  return parsed.options;
2600
2602
  }
@@ -4722,16 +4724,8 @@ async function finishArchitectureChatResult(data, streamBubble, bag) {
4722
4724
  }
4723
4725
  if (architectureClaimedReady(data?.reply, data)) {
4724
4726
  syncArchitecturePanel("missing");
4725
- addBubble("bot", t("arch.renderMissing"), {
4726
- actions: [
4727
- {
4728
- label: t("arch.retry"),
4729
- onClick: () => {
4730
- retryArchitectureDesign();
4731
- },
4732
- },
4733
- ],
4734
- });
4727
+ // Rewrite the same bubble — do not leave「架构图已生成」visible above a missing panel.
4728
+ announceArchitectureMissing(streamBubble, bag);
4735
4729
  void persistProjectChat();
4736
4730
  } else {
4737
4731
  syncArchitecturePanel();
@@ -5045,20 +5039,61 @@ async function maybeRenderArchitectureFromReply(reply) {
5045
5039
  return renderArchitectureFromIr(ir);
5046
5040
  }
5047
5041
 
5048
- /** After a successful diagram render, replace JSON-talk with a desk hint. */
5049
- function announceArchitectureRendered(streamBubble, bag) {
5050
- const msg = t("arch.renderedReady");
5042
+ function rewriteArchitectureStreamBubble(streamBubble, msg, { actions } = {}) {
5051
5043
  if (streamBubble) {
5052
5044
  streamBubble.set(msg);
5053
- const bubbles = el.chat?.querySelectorAll(".bubble.bot");
5054
- const lastBot = bubbles?.[bubbles.length - 1];
5055
- lastBot?.querySelectorAll(":scope > .options.choice-options").forEach((n) =>
5056
- n.remove(),
5057
- );
5058
- lastBot?.classList.remove("streaming");
5045
+ try {
5046
+ streamBubble.body.innerHTML = renderChatMarkdown(msg);
5047
+ } catch {
5048
+ streamBubble.body.textContent = msg;
5049
+ }
5050
+ const host = streamBubble.div;
5051
+ host?.querySelectorAll(":scope > .options").forEach((n) => n.remove());
5052
+ host?.classList.remove("streaming");
5053
+ if (actions?.length && host) {
5054
+ const row = document.createElement("div");
5055
+ row.className = "options";
5056
+ for (const act of actions) {
5057
+ const b = document.createElement("button");
5058
+ b.type = "button";
5059
+ b.className = "chip action-chip";
5060
+ b.textContent = act.label;
5061
+ b.addEventListener("click", () => {
5062
+ if (typeof act.onClick === "function") void act.onClick(b);
5063
+ });
5064
+ row.appendChild(b);
5065
+ }
5066
+ host.appendChild(row);
5067
+ }
5059
5068
  } else {
5060
- addBubble("bot", msg);
5069
+ addBubble("bot", msg, { actions });
5061
5070
  }
5071
+ }
5072
+
5073
+ /** After a successful diagram render, replace JSON-talk with a desk hint. */
5074
+ function announceArchitectureRendered(streamBubble, bag) {
5075
+ const msg = t("arch.renderedReady");
5076
+ rewriteArchitectureStreamBubble(streamBubble, msg);
5077
+ if (Array.isArray(bag) && bag.length) {
5078
+ const last = bag[bag.length - 1];
5079
+ if (last?.role === "assistant") last.content = msg;
5080
+ }
5081
+ afterChatBubbleUi({ forceRight: true });
5082
+ }
5083
+
5084
+ /** Claim-ready without IR: replace misleading「已生成」on the same bubble. */
5085
+ function announceArchitectureMissing(streamBubble, bag) {
5086
+ const msg = t("arch.renderMissing");
5087
+ rewriteArchitectureStreamBubble(streamBubble, msg, {
5088
+ actions: [
5089
+ {
5090
+ label: t("arch.retry"),
5091
+ onClick: () => {
5092
+ retryArchitectureDesign();
5093
+ },
5094
+ },
5095
+ ],
5096
+ });
5062
5097
  if (Array.isArray(bag) && bag.length) {
5063
5098
  const last = bag[bag.length - 1];
5064
5099
  if (last?.role === "assistant") last.content = msg;
@@ -275,7 +275,7 @@ export const de = {
275
275
  "arch.redesign": "Architektur geändert — Neuentwurf",
276
276
  "arch.hintNeed": "Nach Bestätigung aller Module Architektur im Chat entwerfen; vor Kickoff bestätigen",
277
277
  "arch.hintDesigning": "Entwurf im Chat — das Diagramm erscheint in diesem Panel",
278
- "arch.hintMissing": "Chat meldete das Diagramm als bereit, aber keine darstellbaren Daten kamen an. Tippen Sie Diagramm neu erzeugen.",
278
+ "arch.hintMissing": "Im mittleren Bereich ist noch kein Architekturdiagramm. Tippen Sie Diagramm neu erzeugen.",
279
279
  "arch.hintPreview": "Diagramm unten. Für Vollbild anklicken; Architektur bestätigen, dann Kickoff",
280
280
  "arch.hintConfirmed": "Architektur bestätigt — Diagramm für Vollbild anklicken. Der digitale Mitarbeiter folgt dieser Karte",
281
281
  "arch.hintStale": "Überarbeitung behält die vorherige Architektur. Nur neu bestätigen, wenn das neue Diagramm unten sie ändert. Für Vollbild anklicken",
@@ -298,7 +298,7 @@ export const de = {
298
298
  "arch.optChangePath": "Ich möchte einen anderen Hauptpfad",
299
299
  "arch.renderedReady": "Architekturdiagramm ist im mittleren Architektur-Panel bereit — prüfen, dann Architektur bestätigen tippen.",
300
300
  "arch.renderFail": "Architektur-Rendering fehlgeschlagen: {msg}",
301
- "arch.renderMissing": "Das Modell meldete das Diagramm als bereit, aber der Desk erhielt keine Architekturdaten. Tippen Sie Diagramm neu erzeugen.",
301
+ "arch.renderMissing": "Im mittleren Bereich ist noch kein Architekturdiagramm (Chat-Daten nicht gerendert). Tippen Sie Diagramm neu erzeugen.",
302
302
  "arch.retry": "Diagramm neu erzeugen",
303
303
  "arch.needConfirm": "Architektur vor Dispatch bestätigen",
304
304
  "dispatch.agentLabel": "Welches CLI-Mitarbeiter starten",
@@ -275,7 +275,7 @@ export const es = {
275
275
  "arch.redesign": "Arquitectura cambiada — rediseñar",
276
276
  "arch.hintNeed": "Tras confirmar todos los módulos, diseña la arquitectura en el chat; confírmala antes del arranque",
277
277
  "arch.hintDesigning": "Diseñando en el chat — el diagrama aparecerá en este panel",
278
- "arch.hintMissing": "El chat dijo que el diagrama estaba listo, pero no llegaron datos renderizables. Toca Regenerar diagrama.",
278
+ "arch.hintMissing": "Aún no hay diagrama de arquitectura en el panel del medio. Toca Regenerar diagrama.",
279
279
  "arch.hintPreview": "El diagrama está abajo. Clic para pantalla completa; confirma arquitectura y luego arranca",
280
280
  "arch.hintConfirmed": "Arquitectura confirmada — clic en el diagrama para pantalla completa. El empleado digital seguirá este mapa",
281
281
  "arch.hintStale": "Revisar mantiene la arquitectura previa. Vuelve a confirmar solo si el diagrama nuevo abajo la cambia. Clic para pantalla completa",
@@ -298,7 +298,7 @@ export const es = {
298
298
  "arch.optChangePath": "Quiero otra ruta principal",
299
299
  "arch.renderedReady": "El diagrama de arquitectura está listo en el panel central Arquitectura — revísalo y toca Confirmar arquitectura.",
300
300
  "arch.renderFail": "Error al renderizar arquitectura: {msg}",
301
- "arch.renderMissing": "El modelo dijo que el diagrama estaba listo, pero el escritorio no recibió datos de arquitectura. Toca Regenerar diagrama.",
301
+ "arch.renderMissing": "Aún no hay diagrama de arquitectura en el panel del medio (los datos del chat no se renderizaron). Toca Regenerar diagrama.",
302
302
  "arch.retry": "Regenerar diagrama",
303
303
  "arch.needConfirm": "Confirma arquitectura antes del despacho",
304
304
  "dispatch.agentLabel": "Qué CLI de empleado digital lanzar",
@@ -275,7 +275,7 @@ export const fr = {
275
275
  "arch.redesign": "Architecture modifiée — reconception",
276
276
  "arch.hintNeed": "Après confirmation de tous les modules, concevez l’architecture dans le chat ; confirmez-la avant le kickoff",
277
277
  "arch.hintDesigning": "Conception dans le chat — le diagramme apparaîtra dans ce panneau",
278
- "arch.hintMissing": "Le chat a indiqué que le diagramme était prêt, mais aucune donnée affichable n’est arrivée. Touchez Régénérer le diagramme.",
278
+ "arch.hintMissing": "Pas encore de diagramme d’architecture dans le panneau du milieu. Touchez Régénérer le diagramme.",
279
279
  "arch.hintPreview": "Le diagramme est ci-dessous. Cliquez pour le plein écran ; confirmez l’architecture, puis lancez le kickoff",
280
280
  "arch.hintConfirmed": "Architecture confirmée — cliquez le diagramme pour le plein écran. L’employé numérique suivra cette carte",
281
281
  "arch.hintStale": "La révision conserve l’architecture antérieure. Reconfirmez uniquement si le nouveau diagramme ci-dessous la change. Cliquez pour le plein écran",
@@ -298,7 +298,7 @@ export const fr = {
298
298
  "arch.optChangePath": "Je veux un autre chemin principal",
299
299
  "arch.renderedReady": "Le diagramme d’architecture est prêt dans le panneau Architecture du milieu — examinez-le, puis touchez Confirmer l’architecture.",
300
300
  "arch.renderFail": "Échec du rendu d’architecture : {msg}",
301
- "arch.renderMissing": "Le modèle a indiqué que le diagramme était prêt, mais le bureau n’a reçu aucune donnée d’architecture. Touchez Régénérer le diagramme.",
301
+ "arch.renderMissing": "Pas encore de diagramme d’architecture dans le panneau du milieu (données du chat non rendues). Touchez Régénérer le diagramme.",
302
302
  "arch.retry": "Régénérer le diagramme",
303
303
  "arch.needConfirm": "Confirmez l’architecture avant le dispatch",
304
304
  "dispatch.agentLabel": "Quel CLI d’employé numérique lancer",
@@ -275,7 +275,7 @@ export const ja = {
275
275
  "arch.redesign": "アーキテクチャ変更 — 再設計",
276
276
  "arch.hintNeed": "全モジュール確認後、チャットでアーキテクチャを設計;キックオフ前に確認してください",
277
277
  "arch.hintDesigning": "チャットで設計中 — 図はこのパネルに表示されます",
278
- "arch.hintMissing": "チャットでは図の準備完了とありましたが、描画データが届きませんでした。「図を再生成」をタップ。",
278
+ "arch.hintMissing": "中央パネルにまだアーキテクチャ図がありません。「図を再生成」をタップ。",
279
279
  "arch.hintPreview": "図は下にあります。クリックで全画面;アーキテクチャを確認してからキックオフ",
280
280
  "arch.hintConfirmed": "アーキテクチャ確認済み — 図をクリックで全画面。デジタル従業員はこのマップに従います",
281
281
  "arch.hintStale": "改訂は既存アーキテクチャを維持します。下の新図が変える場合のみ再確認。クリックで全画面",
@@ -298,7 +298,7 @@ export const ja = {
298
298
  "arch.optChangePath": "別の主経路にしたい",
299
299
  "arch.renderedReady": "アーキテクチャ図が中央のアーキテクチャパネルに準備できました — 確認して「アーキテクチャを確認」をタップ。",
300
300
  "arch.renderFail": "アーキテクチャ描画に失敗: {msg}",
301
- "arch.renderMissing": "モデルは図の準備完了と言いましたが、デスクにアーキテクチャデータがありません。「図を再生成」をタップ。",
301
+ "arch.renderMissing": "中央パネルにまだアーキテクチャ図がありません(チャットデータが描画されませんでした)。「図を再生成」をタップ。",
302
302
  "arch.retry": "図を再生成",
303
303
  "arch.needConfirm": "派遣前にアーキテクチャを確認してください",
304
304
  "dispatch.agentLabel": "起動する CLI デジタル従業員",
@@ -275,7 +275,7 @@ export const ko = {
275
275
  "arch.redesign": "아키텍처 변경 — 재설계",
276
276
  "arch.hintNeed": "모든 모듈 확인 후 채팅에서 아키텍처를 설계하고; 킥오프 전에 확인하세요",
277
277
  "arch.hintDesigning": "채팅에서 설계 중 — 다이어그램이 이 패널에 표시됩니다",
278
- "arch.hintMissing": "채팅에서는 다이어그램이 준비됐다고 했지만 렌더링 데이터가 없습니다.「다이어그램 다시 생성」을 탭하세요.",
278
+ "arch.hintMissing": "가운데 패널에 아직 아키텍처 다이어그램이 없습니다.「다이어그램 다시 생성」을 탭하세요.",
279
279
  "arch.hintPreview": "다이어그램은 아래에 있습니다. 클릭하면 전체 화면; 아키텍처를 확인한 뒤 킥오프",
280
280
  "arch.hintConfirmed": "아키텍처 확인됨 — 다이어그램을 클릭하면 전체 화면. 디지털 직원은 이 맵을 따릅니다",
281
281
  "arch.hintStale": "개정은 기존 아키텍처를 유지합니다. 아래 새 다이어그램이 바꿀 때만 다시 확인. 클릭하면 전체 화면",
@@ -298,7 +298,7 @@ export const ko = {
298
298
  "arch.optChangePath": "다른 주 경로를 원합니다",
299
299
  "arch.renderedReady": "아키텍처 다이어그램이 가운데 아키텍처 패널에 준비되었습니다 — 검토한 뒤「아키텍처 확인」을 탭하세요.",
300
300
  "arch.renderFail": "아키텍처 렌더 실패: {msg}",
301
- "arch.renderMissing": "모델은 다이어그램이 준비됐다고 했지만 데스크에 아키텍처 데이터가 없습니다.「다이어그램 다시 생성」을 탭하세요.",
301
+ "arch.renderMissing": "가운데 패널에 아직 아키텍처 다이어그램이 없습니다(채팅 데이터가 렌더되지 않음).「다이어그램 다시 생성」을 탭하세요.",
302
302
  "arch.retry": "다이어그램 다시 생성",
303
303
  "arch.needConfirm": "파견 전에 아키텍처를 확인하세요",
304
304
  "dispatch.agentLabel": "실행할 CLI 디지털 직원",
@@ -275,7 +275,7 @@ export const ptBR = {
275
275
  "arch.redesign": "Arquitetura alterada — redesenhar",
276
276
  "arch.hintNeed": "Depois de confirmar todos os módulos, projete a arquitetura no chat; confirme antes do kickoff",
277
277
  "arch.hintDesigning": "Projetando no chat — o diagrama aparecerá neste painel",
278
- "arch.hintMissing": "O chat disse que o diagrama estava pronto, mas nenhum dado renderizável chegou. Toque em Regenerar diagrama.",
278
+ "arch.hintMissing": "Ainda não diagrama de arquitetura no painel do meio. Toque em Regenerar diagrama.",
279
279
  "arch.hintPreview": "O diagrama está abaixo. Clique para tela cheia; confirme a arquitetura e faça o kickoff",
280
280
  "arch.hintConfirmed": "Arquitetura confirmada — clique no diagrama para tela cheia. O funcionário digital seguirá este mapa",
281
281
  "arch.hintStale": "Revisar mantém a arquitetura anterior. Reconfirme só quando o novo diagrama abaixo a alterar. Clique para tela cheia",
@@ -298,7 +298,7 @@ export const ptBR = {
298
298
  "arch.optChangePath": "Quero um caminho principal diferente",
299
299
  "arch.renderedReady": "O diagrama de arquitetura está pronto no painel central Arquitetura — revise e toque em Confirmar arquitetura.",
300
300
  "arch.renderFail": "Falha ao renderizar arquitetura: {msg}",
301
- "arch.renderMissing": "O modelo disse que o diagrama estava pronto, mas a mesa não recebeu dados de arquitetura. Toque em Regenerar diagrama.",
301
+ "arch.renderMissing": "Ainda não diagrama de arquitetura no painel do meio (dados do chat não renderizaram). Toque em Regenerar diagrama.",
302
302
  "arch.retry": "Regenerar diagrama",
303
303
  "arch.needConfirm": "Confirme a arquitetura antes do despacho",
304
304
  "dispatch.agentLabel": "Qual CLI de funcionário digital iniciar",
@@ -275,7 +275,7 @@ export const ru = {
275
275
  "arch.redesign": "Архитектура изменилась — перепроектировать",
276
276
  "arch.hintNeed": "После подтверждения всех модулей спроектируйте архитектуру в чате; подтвердите её перед kickoff",
277
277
  "arch.hintDesigning": "Проектирование в чате — схема появится в этой панели",
278
- "arch.hintMissing": "Чат сообщил, что схема готова, но отображаемых данных нет. Нажмите «Пересоздать схему».",
278
+ "arch.hintMissing": "В средней панели ещё нет диаграммы архитектуры. Нажмите «Пересоздать схему».",
279
279
  "arch.hintPreview": "Схема ниже. Нажмите для полноэкранного режима; подтвердите архитектуру, затем kickoff",
280
280
  "arch.hintConfirmed": "Архитектура подтверждена — нажмите схему для полноэкранного режима. Цифровой сотрудник будет следовать этой карте",
281
281
  "arch.hintStale": "Доработка сохраняет прежнюю архитектуру. Подтверждайте заново только если новая схема ниже её меняет. Нажмите для полноэкранного режима",
@@ -298,7 +298,7 @@ export const ru = {
298
298
  "arch.optChangePath": "Хочу другой основной путь",
299
299
  "arch.renderedReady": "Схема архитектуры готова в средней панели «Архитектура» — просмотрите и нажмите «Подтвердить архитектуру».",
300
300
  "arch.renderFail": "Не удалось отрисовать архитектуру: {msg}",
301
- "arch.renderMissing": "Модель сообщила, что схема готова, но стол не получил данных архитектуры. Нажмите «Пересоздать схему».",
301
+ "arch.renderMissing": "В средней панели ещё нет диаграммы архитектуры (данные чата не отрисовались). Нажмите «Пересоздать схему».",
302
302
  "arch.retry": "Пересоздать схему",
303
303
  "arch.needConfirm": "Подтвердите архитектуру перед назначением",
304
304
  "dispatch.agentLabel": "Какой CLI цифрового сотрудника запустить",
@@ -275,7 +275,7 @@ export const vi = {
275
275
  "arch.redesign": "Kiến trúc đã đổi — thiết kế lại",
276
276
  "arch.hintNeed": "Sau khi xác nhận mọi module, thiết kế kiến trúc trong chat; xác nhận trước khi kickoff",
277
277
  "arch.hintDesigning": "Đang thiết kế trong chat — sơ đồ sẽ hiện ở panel này",
278
- "arch.hintMissing": "Chat báo sơ đồ đã sẵn sàng nhưng không có dữ liệu render. Chạm Tạo lại sơ đồ.",
278
+ "arch.hintMissing": "Chưa sơ đồ kiến trúc panel giữa. Chạm Tạo lại sơ đồ.",
279
279
  "arch.hintPreview": "Sơ đồ bên dưới. Nhấp để toàn màn hình; xác nhận kiến trúc, rồi kickoff",
280
280
  "arch.hintConfirmed": "Đã xác nhận kiến trúc — nhấp sơ đồ để toàn màn hình. Nhân viên số sẽ theo bản đồ này",
281
281
  "arch.hintStale": "Chỉnh sửa giữ kiến trúc trước. Chỉ xác nhận lại khi sơ đồ mới bên dưới thay đổi. Nhấp để toàn màn hình",
@@ -298,7 +298,7 @@ export const vi = {
298
298
  "arch.optChangePath": "Tôi muốn đường chính khác",
299
299
  "arch.renderedReady": "Sơ đồ kiến trúc sẵn sàng ở panel Kiến trúc giữa — xem lại, rồi chạm Xác nhận kiến trúc.",
300
300
  "arch.renderFail": "Render kiến trúc thất bại: {msg}",
301
- "arch.renderMissing": "Model báo sơ đồ sẵn sàng nhưng bàn không nhận dữ liệu kiến trúc. Chạm Tạo lại sơ đồ.",
301
+ "arch.renderMissing": "Chưa sơ đồ kiến trúc panel giữa (dữ liệu chat chưa render). Chạm Tạo lại sơ đồ.",
302
302
  "arch.retry": "Tạo lại sơ đồ",
303
303
  "arch.needConfirm": "Xác nhận kiến trúc trước khi giao việc",
304
304
  "dispatch.agentLabel": "CLI nhân viên số nào để khởi chạy",
@@ -275,7 +275,7 @@ export const zhTW = {
275
275
  "arch.redesign": "架構有變 — 重新設計",
276
276
  "arch.hintNeed": "全部模組確認後,在對話中設計架構;開工前請先確認",
277
277
  "arch.hintDesigning": "正在對話設計 — 圖表會顯示於本面板",
278
- "arch.hintMissing": "對話稱圖表已就緒,但未收到可渲染資料。請點「重新產生圖表」。",
278
+ "arch.hintMissing": "中間欄還沒有架構圖。請點「重新產生圖表」。",
279
279
  "arch.hintPreview": "圖表在下方。點擊可全螢幕;確認架構後再開工",
280
280
  "arch.hintConfirmed": "架構已確認 — 點擊圖表可全螢幕。數位員工將依此圖開發",
281
281
  "arch.hintStale": "改版沿用原架構。僅當下方新圖改變架構時再確認。點擊可全螢幕",
@@ -298,7 +298,7 @@ export const zhTW = {
298
298
  "arch.optChangePath": "我想改主路徑",
299
299
  "arch.renderedReady": "架構圖已在中間「架構」面板就緒 — 檢視後點「確認架構」。",
300
300
  "arch.renderFail": "架構渲染失敗:{msg}",
301
- "arch.renderMissing": "模型說圖表已就緒,但桌面未收到架構資料。請點「重新產生圖表」。",
301
+ "arch.renderMissing": "中間欄還沒有架構圖(對話資料未渲染成功)。請點「重新產生圖表」。",
302
302
  "arch.retry": "重新產生圖表",
303
303
  "arch.needConfirm": "派工前請先確認架構",
304
304
  "dispatch.agentLabel": "要用哪個 CLI 數位員工啟動",
@@ -311,7 +311,7 @@ const zhCN = {
311
311
  "arch.redesign": "架构有变,重新设计",
312
312
  "arch.hintNeed": "全部模块确认后,在左侧对话设计架构;确认架构后才能开工",
313
313
  "arch.hintDesigning": "正在对话设计架构;出图后会显示在本区域",
314
- "arch.hintMissing": "对话称图已生成,但台面未收到可渲染数据。请点「重新生成架构图」。",
314
+ "arch.hintMissing": "中间栏还没有架构图。请点「重新生成架构图」。",
315
315
  "arch.hintPreview": "架构图在下方。点击图可新页面全屏查看;满意则确认架构,再开工",
316
316
  "arch.hintConfirmed": "架构已确认;点击图可全屏查看。数字员工将按此图开发",
317
317
  "arch.hintStale": "改版默认沿用原架构。仅当架构变化时,确认下方新图后再派工。点击图可全屏查看",
@@ -341,7 +341,7 @@ const zhCN = {
341
341
  "arch.optChangePath": "我想改主路径",
342
342
  "arch.renderedReady": "架构图已在中间栏「系统架构」区域生成,请查看;满意后点「确认架构」。",
343
343
  "arch.renderFail": "架构图渲染失败:{msg}",
344
- "arch.renderMissing": "模型说图已生成,但台面没有收到架构数据。请点「重新生成架构图」。",
344
+ "arch.renderMissing": "中间栏还没有架构图(对话数据未渲染成功)。请点「重新生成架构图」。",
345
345
  "arch.retry": "重新生成架构图",
346
346
  "arch.needConfirm": "请先确认架构再派工",
347
347
  "dispatch.projectsRoot": "产品父目录",
@@ -911,7 +911,7 @@ const en = {
911
911
  "After all modules are confirmed, design architecture in chat; confirm it before kickoff",
912
912
  "arch.hintDesigning": "Designing in chat — the diagram will appear in this panel",
913
913
  "arch.hintMissing":
914
- "Chat claimed the diagram was ready, but no renderable data arrived. Tap Regenerate diagram.",
914
+ "No architecture diagram in the middle panel yet. Tap Regenerate diagram.",
915
915
  "arch.hintPreview":
916
916
  "Diagram is below. Click it for fullscreen; confirm architecture, then kick off",
917
917
  "arch.hintConfirmed":
@@ -948,7 +948,7 @@ const en = {
948
948
  "Architecture diagram is ready in the middle Architecture panel — review it, then tap Confirm architecture.",
949
949
  "arch.renderFail": "Architecture render failed: {msg}",
950
950
  "arch.renderMissing":
951
- "The model said the diagram was ready, but the desk got no architecture data. Tap Regenerate diagram.",
951
+ "No architecture diagram in the middle panel yet (chat data did not render). Tap Regenerate diagram.",
952
952
  "arch.retry": "Regenerate diagram",
953
953
  "arch.needConfirm": "Confirm architecture before dispatch",
954
954
  "dispatch.agentLabel": "Which CLI digital employee to launch",