98 lines
9.0 KiB
Markdown
98 lines
9.0 KiB
Markdown
# Research & Design Decisions — i18n-frontend-comments
|
||
|
||
## Summary
|
||
|
||
- **Feature**: `i18n-frontend-comments`
|
||
- **Discovery Scope**: Simple Addition (documentation-only translation pass; no architectural change)
|
||
- **Key Findings**:
|
||
- 20 files in `frontend/src/` contain Chinese characters (902 total occurrences). Concentration follows file size: `Process.vue` (191), `Step4Report.vue` (176), `HistoryDatabase.vue` (124), `GraphPanel.vue` (84), `Step2EnvSetup.vue` (76), `Step3Simulation.vue` (52). The remaining 14 files have ≤43 hits each.
|
||
- Chinese appears in three comment shapes (JS line `//`, JSDoc `/** */`, Vue `<!-- -->`) and — unexpectedly — inside two flavors of string literal: `console.error('…')` developer logs (low risk to translate) and LLM prompt template strings in `Step5Interaction.vue` (behavior risk if translated, since the default LLM is Chinese-tuned).
|
||
- The codebase has no enforced linter/formatter (per `tech.md`) and `dev-guidelines.md` already states "comment the *why*, not the *what*". The existing comment density skews toward restating-the-code in Chinese; a meaningful share will be deleted rather than translated.
|
||
|
||
## Research Log
|
||
|
||
### Inventory and shape of Chinese content
|
||
|
||
- **Context**: Need to decide whether one pass can mechanically translate or whether per-file judgment is required.
|
||
- **Sources Consulted**: `rg [\x{4e00}-\x{9fff}] frontend/src/` (full count) and content-mode samples of `api/index.js`, `api/simulation.js`, `views/Home.vue`, `components/Step1GraphBuild.vue`, `components/Step5Interaction.vue`.
|
||
- **Findings**:
|
||
- Comments are syntactically standard (`//`, `/** */`, `<!-- -->`); no inline-Chinese identifiers.
|
||
- JSDoc blocks in `api/simulation.js` (and likely `api/graph.js`, `api/report.js`) include `@returns`, `@param` annotations with Chinese descriptions — translate only the natural-language portion, keep tag structure.
|
||
- `console.error` strings in `components/Step1GraphBuild.vue` (3 hits at lines 216, 237, 241) are dev-facing only, not user-facing.
|
||
- LLM prompt template strings in `components/Step5Interaction.vue` (lines 725–727) are sent to a Chinese-tuned model; translation is a behavior change.
|
||
- **Implications**: Per-file judgment pass is required. String literals are out of scope by default (Req 4.4); only `console.*` Chinese strings are in scope as a documented exception (developer-facing).
|
||
|
||
### Tooling decision: manual vs scripted
|
||
|
||
- **Context**: ~900 occurrences across 20 files — would automation help?
|
||
- **Sources Consulted**: Steering `tech.md` ("No enforced linter or formatter in this repo by design… Discuss with the user before introducing ESLint/Prettier/Ruff/Black"); `dev-guidelines.md` ("comment the *why*"); gap-analysis Option B trade-offs.
|
||
- **Findings**: Automation undercuts Req 2 (drop redundant comments requires human judgment). The project explicitly disallows new tooling without discussion. The work fits an S-effort manual pass.
|
||
- **Implications**: No new scripts; no new dependencies; manual translation file-by-file.
|
||
|
||
### Verification path
|
||
|
||
- **Context**: How does the reviewer confirm acceptance?
|
||
- **Sources Consulted**: Ticket body acceptance criteria; project's Vite build (`npm run build`).
|
||
- **Findings**: A single ripgrep command confirms Req 1.1; `npm run build` confirms Req 4.1; manual smoke confirms Req 4.3. No new test harness is justified for a doc-only change (per steering "Don't add a heavy test harness without discussing scope").
|
||
- **Implications**: PR description carries the verification one-liner; the build is the proof.
|
||
|
||
## Architecture Pattern Evaluation
|
||
|
||
| Option | Description | Strengths | Risks / Limitations | Notes |
|
||
|--------|-------------|-----------|---------------------|-------|
|
||
| A. Single-pass translation, no tooling | Translate all 20 files in one PR; manual judgment per comment | Simple, low overhead | Long diff for the largest 6 files | Matches "manual style" steering ethos |
|
||
| B. Automated LLM-driven script + manual review | Script extracts Chinese comments, LLM translates, dev reviews diff | Faster on long files | Adds dependency; undercuts judgment requirement; risk of touching strings/identifiers | Rejected — clashes with "no new tooling" steering |
|
||
| C. File-grouped manual pass (selected) | Same translation effort as A, but tasks split into file groups: high-touch / mid-touch / light | Reviewable progress, matches project's task-tracking pattern | A few extra task headings | Selected — pairs cleanly with `tasks.md` structure |
|
||
|
||
## Design Decisions
|
||
|
||
### Decision: Manual file-grouped translation, no tooling
|
||
|
||
- **Context**: 20 files, ~900 occurrences, mixed comment shapes plus a small set of in-scope dev-log strings.
|
||
- **Alternatives Considered**:
|
||
1. Single mass pass (Option A) — workable but reviewer-unfriendly for the largest files
|
||
2. Automated LLM translation script (Option B) — fast but loses per-comment judgment and adds tooling
|
||
3. File-grouped manual pass (Option C) — same effort as A with clearer task decomposition
|
||
- **Selected Approach**: Group files into three batches by occurrence count and translate each batch as one task. After each batch, run the verification ripgrep to check progress.
|
||
- **Rationale**: Aligns with `tech.md` steering ("match the surrounding file's style"), `dev-guidelines.md` ("comment the *why*"), and lets `tasks.md` mirror the existing project task-tracking pattern. The S-effort estimate fits one work session.
|
||
- **Trade-offs**: A few extra task headings vs. cleaner reviewability. No infrastructure cost.
|
||
- **Follow-up**: Confirm `console.*` Chinese strings are translated; confirm LLM prompts in `Step5Interaction.vue` are documented as retained in PR description.
|
||
|
||
### Decision: String-literal scope rule
|
||
|
||
- **Context**: Some Chinese appears in string literals, not just comments.
|
||
- **Alternatives Considered**:
|
||
1. Strict: comments only — leaves dev-facing `console.*` Chinese which any maintainer reading dev console would still see in Chinese
|
||
2. Permissive: all string literals — translates LLM prompt templates, changing model behavior
|
||
3. Targeted: comments + dev-facing log strings (`console.*`); retain LLM prompts as documented exceptions
|
||
- **Selected Approach**: Targeted (option 3). Translate `console.error`, `console.warn`, `console.log` strings whose content is Chinese. Leave LLM prompt template strings alone and list them in the PR description per Req 1.5.
|
||
- **Rationale**: Honors the spirit of the ticket ("English-readable code") while preserving Req 4 ("no runtime behavior change") for the LLM-bound strings. Matches Req 4.4 (string literals untouched *except* where dev-log translation is unambiguous).
|
||
- **Trade-offs**: Reviewer needs to verify the exception list in the PR description against the residual ripgrep matches. Mitigated by Req 5.1 (PR description must document residuals).
|
||
- **Follow-up**: During implementation, confirm there are no other categories of Chinese-string-literal beyond `console.*` and LLM prompts. If discovered, add to the documented exception list rather than expanding scope.
|
||
|
||
### Decision: TODO/FIXME ticket reference policy
|
||
|
||
- **Context**: Req 3 mandates ticket references on TODO/FIXME markers.
|
||
- **Alternatives Considered**:
|
||
1. Skip the sweep entirely if no markers exist
|
||
2. Sweep `frontend/src/` for `TODO|FIXME` once at the start; append `(#9)` only where missing
|
||
- **Selected Approach**: Run a single `rg 'TODO|FIXME' frontend/src/` sweep before the file-translation loop; record any matches; apply Req 3.1–3.3 inline with each file's translation.
|
||
- **Rationale**: Lightest-weight implementation of Req 3. If no markers exist (likely for `frontend/src/`), the requirement is satisfied vacuously and noted in the PR description.
|
||
- **Trade-offs**: None.
|
||
- **Follow-up**: If markers exist in non-Chinese form (English TODOs without ticket refs), the requirement says only to act on *Chinese* markers; out of scope to retrofit unrelated existing English TODOs.
|
||
|
||
## Risks & Mitigations
|
||
|
||
- **Risk**: Accidentally translating an LLM prompt string and shifting model behavior. **Mitigation**: Req 4.4 + Decision "String-literal scope rule"; document retained Chinese strings in PR.
|
||
- **Risk**: Misinterpreting a Chinese comment and translating to wrong meaning. **Mitigation**: Req 2.3 (conservative when ambiguous; keep + translate rather than delete).
|
||
- **Risk**: Reviewer churn over which comments to delete vs. translate. **Mitigation**: `dev-guidelines.md` is the rubric; Decision documents the rule (delete only when comment paraphrases the next statement; translate when the comment encodes intent).
|
||
- **Risk**: PR is too large to review (Process.vue alone has ~191 hits). **Mitigation**: File-grouped tasks + per-group ripgrep checkpoint; each group is reviewable as a unit.
|
||
|
||
## References
|
||
|
||
- `dev-guidelines.md` (project) — comment philosophy and Conventional Commits.
|
||
- `tech.md` (steering) — "No enforced linter or formatter… match the surrounding file's style."
|
||
- `structure.md` (steering) — `frontend/src/` directory layout (views/components/api/store).
|
||
- Ticket #9 body — acceptance criteria, branch and commit naming.
|
||
- Gap analysis (`gap-analysis.md`) — Option C trade-offs and effort/risk estimate.
|