Skip to content

i18n(projects): WS-G slice 4a — channel create sheet + list - #166

Merged
physercoe merged 1 commit into
mainfrom
i18n/ws-g-channel-list
Jun 10, 2026
Merged

i18n(projects): WS-G slice 4a — channel create sheet + list#166
physercoe merged 1 commit into
mainfrom
i18n/ws-g-channel-list

Conversation

@physercoe

Copy link
Copy Markdown
Owner

WS-G Projects, slice 4a (after #165). i18n full-sweep (#138 / ADR-048).

Scope

  • project_channel_create_sheet.dart
  • project_channels_list_screen.dart

(The channel chat screen project_channel_screen.dart follows as slice 4b — it parallels the WS-F team_channel_screen and reuses its message/attach/download keys.)

What changed

  • entityChannel vocab binding: "New {channel}" sheet title, the FAB label, and the "No {channels} yet — tap + to create" empty hint.
  • The scope note binds entityChannel + entityProject + entityTeam: "{channels} are scoped to this {project}. Events posted here stay off the {team}-wide feed."
  • The "Discussion" list title stays neutral — it's a surface label (like Activity), not a vocab noun; the named variant is "Discussion · {name}".
  • Reuses buttonCreate; adds createFailedError + unnamedValue. The design-review example placeholder stays literal.

ARB en/zh in lockstep — scripts/lint-arb.sh clean (1046 resource keys). No local Flutter; relying on CI.

🤖 Generated with Claude Code

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>
@physercoe
physercoe merged commit 674b2f2 into main Jun 10, 2026
4 checks passed
@physercoe
physercoe deleted the i18n/ws-g-channel-list branch June 10, 2026 12:43
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>
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant