i18n(projects): WS-G slice 4a — channel create sheet + list - #166
Merged
Conversation
Localize project_channel_create_sheet + project_channels_list_screen
(WS-G Projects). The channel chat screen follows as slice 4b.
- entityChannel vocab binding: "New {channel}" sheet title, FAB label,
"No {channels} yet" empty hint. Scope note binds entityChannel +
entityProject + entityTeam ("{channels} are scoped to this {project}…
stay off the {team}-wide feed").
- "Discussion" list title kept neutral (it's a surface label, not a
vocab noun); named variant "Discussion · {name}".
- Reuses buttonCreate; new createFailedError + unnamedValue. The
"design-review" example placeholder stays literal.
- ARB en/zh in lockstep (lint-arb clean, 1046 keys).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This was referenced Aug 5, 2026
physercoe
added a commit
that referenced
this pull request
Aug 5, 2026
…rites one (C2 + C3) (#528) * feat(desktop): author_guide — the agent looks up a format before it writes one (C2 + C3) `author_apply` refuses a malformed body rather than repairing it, which is only a fair trade if the rules are readable somewhere cheaper than a failed write. `author_guide {kind, topic?, filter?}` is that channel. The verb did not exist. The plan reads as though it shipped with lane A and only its content was missing; `AUTHOR_TOOL_NAMES` held three names, so building it — catalog entry, dispatcher arm, handler — was the larger half of C2/C3. It is the one `author_*` verb main answers alone: the others are about a document that exists and need the renderer, and a guide that went unavailable with no window open would be missing exactly when an agent is working out what to send. It joins the gated set (one capability sentence) but not the audited set — that log answers "what did an agent learn about me?", and this verb answers with static text identical for every caller. C2 — 30 vendored draw.io shape libraries. `shapes/` is a byte-exact copy of next-ai-draw-io's `docs/shape-libraries/` @6e65394 (Apache-2.0, NOTICE), so a reviewer diffs the directory and expects nothing; every correction lives in `gen-shapes.ts`, and `shapes.test.ts` fails when the generated module drifts from what those rules produce. Accuracy, not size, was the real work here. Upstream's data is wrong in three ways an agent would act on: 18 files list their own prefix as a shape (`shape=mxgraph.aws4.mxgraph.aws4` is valid XML that draws a blank box, so nothing in the apply path can catch it); the README links three libraries that have no file and omits one that does (material_design, 300 icons), so the index is generated from the files that exist rather than copied; and eight libraries enumerate less than draw.io ships (azure2 lists 354 of 608), so each body states what it carries and says outright when the list is partial — an agent reading a partial list as complete concludes a shape does not exist and invents one. The plan's "~180 KB" was wrong: 92.9 KiB. And because the verb is lazy the sum was the wrong axis anyway, so the sizing effort went into `filter`, which takes an aws4 lookup from 22.7 KiB to 486 bytes. C3 — one guide per DocKind, each naming the module that enforces the rule it states. `guide.test.ts` pins the enumerations to the renderer sources they describe, so a seventh figure renderer or document kind fails the suite rather than shipping with no way for an agent to learn it exists. The layout rules are upstream's `system-prompts.ts`, but its tool names, its "generate ONLY mxCell elements" rule and its ban on XML comments were NOT carried over: all three describe upstream's pipeline, and here `wrapWithMxFile` normalises every document level and the ops path preserves comments. A ported rule brings its premise with it. Also: the consent blurb now lists all eight gated tools in both dicts — it had said "four things" since lane A and was never updated for `author_render` or `desktop_open`, so it understated what the toggle grants. And the 2026.805.1022 changelog entry claimed `author_guide` shipped in it; corrected. Not done: the render pass. A wrong shape name is invisible to every test here — it needs a machine with a display, same class as task #166. Verified: electron 441/441 + 25 new, desktop frontend 794/794, both typechecks, esbuild bundle, 12 runnable CI lints. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix(desktop): author_guide kind enum derives from GUIDE_KINDS; regen path says .ts Two review fixes on #528: - The catalog schema's `kind` enum was a six-string literal. guide.test.ts pins GUIDE_KINDS to DocKind, so a seventh kind would get a guide — but the offer surface would stay six long, and a schema-validating client refuses the kind the handler serves. Derive the enum from GUIDE_KINDS so it cannot drift. - The generated module's header and the NOTICE told maintainers to run `gen-shapes.mjs`, a file that does not exist (it is `gen-shapes.ts`). Corrected in the generator template + NOTICE and regenerated; only the two header lines changed, which doubles as a determinism check. electron 441/441, tsc clean. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Ubuntu <ubuntu@ip-172-26-2-239.agent.ai> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
This was referenced Aug 14, 2026
physercoe
added a commit
that referenced
this pull request
Aug 16, 2026
Two halves of one gap: the transcript could describe what a tool did but
never show it. A long build sat as a silent spinner until it exited, and
an image a tool returned printed as a screen of base64.
E3's streamed output was already reaching the client and being dropped by
the renderer: `useToolMaps` folds `tool_call_update` onto its parent call
(latest-wins on toolCallId), but `ToolCallBody` took only `(p, result)`,
and `isToolCallUpdateHidden` suppresses the standalone card whenever a
visible parent exists. The fold was never the missing piece — the plan's
"fold via streamingPartials.ts" was wrong twice over (that module is in
ui/, its FOLD_KINDS is text|thought|plan, and its chains key on
message_id, which a tool_call_update does not carry). The live block
stands down when the tool_result lands, because codex's finalizing result
carries `aggregatedOutput` — measured during E3 as byte-identical to the
reassembled deltas.
Images render in both dialects our engines actually emit. claude M2
forwards claude's own tool_result content verbatim (driver_stdio.go:446),
which is Anthropic's `source:{type:"base64",media_type,data}` — measured
here by running `claude --print --output-format stream-json` over a PNG,
not assumed. The MCP/ACP shape (`mimeType`+`data`) is the other. A `url`
source is deliberately not painted: it would make the renderer fetch a
host the agent chose.
`blob:sha256/` refs are resolved rather than skipped. The old comment
called them "a future hub"; payload_externalize.go already swaps every
string leaf over 64 KiB for a ref on ingest, so for any real screenshot
the blob path is the normal one and images were vanishing at exactly the
size where they mattered. Two consequences: the MIME must come from the
event block (the hub stores the leaf as application/octet-stream), and
the fetched body is base64 TEXT, so it needs one decode — getBlobDataUrl
would double-encode it. No client had ever resolved an externalized
payload leaf; mobile's blob code is all artifact viewers.
`termipod-att://`, the plan's fourth item, is Tauri-only note plumbing
for the Read surface and has never ridden an agent event. Out of scope.
Also fixes a pre-existing Companion bug found while threading the new
prop: `result` and `callName` were handed to the wrong branches, so its
call cards folded in nothing and every standalone result was labelled
"Result". The full transcript surface was always correct.
Verification: 17 new pure-module tests (fixtures are captured producer
output, not invented shapes); 9 mutations checked, all killed — one
survived first and exposed a test passing for the wrong reason (a url
source was rejected for carrying no `data`, not by the source-type
guard), now pinned by a block claiming both. 876 frontend tests, tsc,
vite build, token ratchet, and the full doc lint set all green.
NOT visually verified — no display here, and the E2E suite does not
exercise the transcript. Adds to the standing render debt (#166).
Co-authored-by: Ubuntu <ubuntu@ip-172-26-2-239.agent.ai>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
WS-G Projects, slice 4a (after #165). i18n full-sweep (#138 / ADR-048).
Scope
project_channel_create_sheet.dartproject_channels_list_screen.dart(The channel chat screen
project_channel_screen.dartfollows as slice 4b — it parallels the WS-Fteam_channel_screenand reuses its message/attach/download keys.)What changed
buttonCreate; addscreateFailedError+unnamedValue. Thedesign-reviewexample placeholder stays literal.ARB en/zh in lockstep —
scripts/lint-arb.shclean (1046 resource keys). No local Flutter; relying on CI.🤖 Generated with Claude Code