本文へ移動
cccskills
無料GitHub で公開

interface-text

Rules for every string rendered inside the app, plus the sweep that removes in-app prose. Use when writing or changing a label, hint, description, tooltip, empty state or KPI tile in a .tsx file, or when running Pattern Patrol P14 or asked to find or fix long UI text.

インストール方法を見る

含まれるファイル(6)

  • SKILL.md6.4 KB
  • confirm.md2.6 KB
  • discover.md5.0 KB
  • evals.md6.3 KB
  • fix.md6.7 KB
  • review.md4.7 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

<!-- SYNCED COPY — do not edit here. Canonical: common-docs/skills/interface-text/SKILL.md This file is distributed to every consuming repo by common-docs/meta/scripts/sync_skills.py. Edit the canonical, run the sync, and commit each repo. Edits made here are overwritten and lost. -->

interface-text — in-app text is layout

Doctrine (read once): common-docs/policies/interface-text-is-layout.md.

You are writing interface text, not prose. Every string the app renders sits in a slot owned by a component, has a character budget, and has siblings that must match. The screen is not where you explain, justify, or prove anything — that is what the commit message, the code comment and FEATURE.md are for.

The card — apply to every string you write or touch

  1. Who is this sentence for? If it helps someone reading the diff — a formula, a function or table name, where the number comes from, what changed, what is not built yet, which other page agrees with it — it is author-facing. Put it in a code comment or the commit. It never renders.
  2. Label first, tooltip always. Make the label carry the meaning (Batch savings (7d)). Then give every label, icon button, abbreviation or number a newcomer might not understand a one-sentence tooltip: title= on KpiTile, components/official/InfoHint everywhere else (hover, keyboard and touch — a native title= attribute is unreachable on phones). A complex thing gets a help popover (CompactHelpPopover, components/official/settings/SettingsRow.tsx). When you delete prose, ask what a newcomer loses and move that into a tooltip — never just delete (Arman, 2026-10-10: "our changes need to push for ALWAYS tooltips").
  3. Fit the slot. Secondary text ≤ 60 chars, one line, never two sentences. Tooltip ≤ 140, one sentence. Placeholder ≤ 60, an example value. Dialog description / empty / error state ≤ 140, at most two sentences: what happened, what to do. No sentence under a page or section title — ever.
  4. Look at the row and the column. Your text sets the height of every tile in its row and the width of every cell in its column. Fill a visible slot on all siblings, at similar length and in the same shape, or on none. Tooltips are hidden and per need — never add one to a sibling just to match.
  5. Use the primitive that enforces the budget. components/official/kpi/KpiTile + KpiGrid for KPI rows (one-line hint, title tooltip). If the official primitive "cuts off" your text, your text is too long — shorten it; never hand-roll a component to escape the limit. A local component that renders unbounded secondary text is itself a finding.
  6. A tooltip states only what you verified in the code or the data contract. Cannot prove the definition ("since midnight", "today's budget")? Write no tooltip — a wrong definition is worse than none.
  7. Honesty is state, not prose. Unmeasured → — with the reason in the tooltip. Partial feature → the Coming Soon registry. Never "not yet reported by the backend", never "Backfill brings this up to 100%".
  8. See it rendered, then check it. In matrx-frontend run pnpm check:interface-text --changed before committing; any other repo: node ../matrx-frontend/scripts/interface-text/check-interface-text.mjs --root=. --changed. Every NOVEL line on your diff is fixed before commit.

Rationalizations

From the 2026-09-30 baseline runs (evals.md) — each one produced a defect.

Excuse (verbatim)Reality
"the shared tile cuts off long hints"That is the budget working. Shorten the text; keep the primitive.
"swapping only this row would make one page look two ways… should be its own change"Adopt the primitive for the whole page in this change; it is a few lines.
"the rule that every number names its window and item count"The label (7d) names the window; a count fits a 60-char hint. A sentence is not required.
"Both are a screen lying." → adds a sentenceHonesty is — + tooltip, a badge, or a registry entry.
"in the same words the Platform Spend 'Saved by batching' headline uses"Consistency means the same label, not the same paragraph copied to two pages.
(with the skill) tooltips added to all six tiles "so the row matches" — two invented "since midnight" / "today's budget"Parity is for visible slots. An unverified definition is fabrication; leave the tooltip out.

Red flags — stop and re-read the card

  • You are about to paste words from your commit message, FEATURE.md or a code comment into JSX.
  • Your string contains a dot-separated or snake_case name, a backtick, "backend", "server", or "not yet".
  • One sibling gets a hint and the others do not.
  • You are writing a second sentence in a hint or description.
  • You are choosing a local component over components/official/* because of text length.
  • You are writing a tooltip definition you did not read in the code or the data contract.

The sweep — Discover → Review → Fix → Confirm (Pattern Patrol P14)

Each phase is its own agent. Read only the file for the phase you were given:

PhaseLaneRead
Discover — build units for a slice, classify each, propose the exact fix; the validator must passquick with sonnet (haiku mapped rules to verdicts without reading and cut rewrites mid-sentence — 2026-09-30)discover.md
Review — accept or correct the classifications, find primitive-level fixes, batch the work, pick what goes to Armanstandard (opus — judgment over the classifications)review.md
Fix — apply a reviewed batch in its filesquick (sonnet) for mechanical batches, standard otherwisefix.md
Confirm — independent check of a fixed batchstandard (sonnet), never the fixerconfirm.md

The proof record and regression scenario for this skill is evals.md; the next editor reruns it.

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

Admin debug system wiring for the floating AdminIndicator's live debug data and Copy Full Context. Use when adding debug visibility to a route or feature, wiring useDebugContext or the debug panel, capturing console errors, or enabling the copy-context workflow for a page.

日本語の概要は準備中です。原文の説明を表示しています。

armanisadeghi/ai-matrx32026年10月12日 更新

Compact two-icon Copy / Copy-for-AI controls (components/agent-copy). Use when adding copy buttons to a row, card, list, or record; merging duplicate Copy/JSON/AI controls; continuing the copy rollout; or writing a Copy-for-AI payload. NOT for markdown content actions (use rich-document-actions).

日本語の概要は準備中です。原文の説明を表示しています。

armanisadeghi/ai-matrx32026年10月12日 更新

Disclosing a surface's existing fixed AI jobs in the shell's top Agents menu. Use when a page, panel, overlay, or window already runs a mandate behind a button, assist, automatic action, or mode; when the agent-disclosure guard names a file; or during a surface check.

日本語の概要は準備中です。原文の説明を表示しています。

armanisadeghi/ai-matrx32026年10月12日 更新

The watch-fix-rerun method for making an existing platform agent or automated process efficient and correct: baseline its ledger, run one unit yourself, fix the class behind every wasted call, rerun, record. Use when asked to improve, optimize, watch, or 'make efficient' an agent, a sandbox session, a sync job, or any recurring automated process.

日本語の概要は準備中です。原文の説明を表示しています。

armanisadeghi/ai-matrx32026年10月12日 更新

Redux state for agent execution and firing agent shortcuts. Use when editing features/agents/redux/, building agent UI, creating a conversation, touching assembleRequest or NDJSON stream state, wiring agent-state selectors, adding a per-conversation capability, or triggering a shortcut from a button, menu, or code (useShortcutTrigger, launchAgentExecution).

日本語の概要は準備中です。原文の説明を表示しています。

armanisadeghi/ai-matrx32026年10月12日 更新

The provision for a call site: the exhaustive menu of values that place in the code can realistically produce. Use before creating or fixing a mandate or agent that reasons about more than its own input, when deciding whether an agent can answer at all with what it is sent, or when its output 'looks right' but nobody checked it could be. NOT for building the agent (use create-agent).

日本語の概要は準備中です。原文の説明を表示しています。

armanisadeghi/ai-matrx32026年10月12日 更新

armanisadeghi のスキルをすべて見る

このスキルの問題を報告する