Write docs/style-guideline.md: codify the UI design language with canonical references + AGENTS.md amendment making it mandatory for all UI work #537

Closed
opened 2026-09-14 21:07:55 +00:00 by crueber · 3 comments
Owner

What's requested

The app now has a large, de-facto design language that lives only in web/src/ui.css comments, per-page JSX, scattered AGENTS.md working rules, and a chain of filed tickets (#232, #243, #244, #273, #274, #276, #278, #319, #34, #405, #465, #495, #506, #512, #521, #533, …). Every UI ticket currently re-derives the same decisions, and divergent markup for the same pattern is the recurring failure mode. This ticket asks for a documentation deliverable only:

  1. docs/style-guideline.md — a written style guideline that interrogates the app's current design decisions into a normative document, each rule backed by a canonical reference (the file and ticket that established it).
  2. A drafted AGENTS.md enforcement amendment (text below) making the guideline mandatory for all UI work, appended in the same change per the documents-change-with-code rule (law 12).

This is a plan/docs ticket: no code changes anywhere — the only deliverables are the new doc and the AGENTS.md amendment.

Method

Read the design decisions out of the tree, not out of anyone's head. Every rule in the guideline cites its canonical implementation, and every cited ticket names the decision it settled. Where a decision is encoded in docs/go/12_web_ui.md or AGENTS.md already, the guideline references it rather than restating (one source of truth, restatements drift).

Canonical references (seed list — the guideline author verifies each against the current tree and extends it)

Foundations (already normative elsewhere)

  • Stack: SolidJS SPA, plain JSX (no TypeScript), runtime deps exactly solid-js + @solidjs/router + marked + dompurify; Tailwind v4 CSS-first, dark mode by default — AGENTS.md law 1 (D-WEB-6/D-WEB-7 amendments) and docs/go/12_web_ui.md header note.
  • Tailwind is the only styling language; no one-off CSS without shared-pattern justification — a new rule earns its place only as a shared pattern in web/src/ui.css (#405 opaque-popover precedent). AGENTS.md working rule (Forgejo #533).
  • Mobile viewport is always checked (~390px) — AGENTS.md working rule; layout changes verified rendered before merge, never code reading alone.
  • a11y floor: every keyboard-reachable control shows focus — web/src/ui.css @layer base :focus-visible.
  • Theme: dark is the shipped default (<html class="dark">, lib/store.js toggles); light is the base layer, dark: variants carry dark. Colors are theme tokens in both themes, never a hardcoded palette (graph vars precedent, ui.css --graph-*; ToggleSwitch.jsx).

Shared vocabulary — web/src/ui.css component classes (each is the ONE idiom; new UI composes them instead of re-deciding)

  • Panels/chrome: .card, .card-meta (#277 — flex+gap meta rows, never concatenated spans), .card-header (#521 — the one title treatment for sidebar/conversation cards), .site-header, .site-nav/.nav-link (#238), .brand.
  • Nav strips: internal-scroll instead of wrap at narrow widths, scrollbar hidden, keyboard-reachable — .site-nav (#273), .repo-tabs (#274), .owner-tabs (#437, vertical variant).
  • Controls: .btn / .btn.primary (emerald = primary action; exactly one primary CTA per page — issues list toolbar is the reference) / .btn.danger, .btn-active, .pill, .tab-badge (#319 — count badges white-on-emerald, hidden at 0 client-side), .input (text-field utilities never on non-text controls — #533; non-text controls use dedicated components, e.g. ToggleSwitch.jsx peer-pattern switch, role="switch" + aria-checked), .icon (#465 — 1em/currentColor, no per-icon CSS, spacing stays with the caller's gap).
  • Status chips: .chip-open/closed/merged/draft/prerelease — state color mapping is fixed (emerald/red/purple/amber/sky); new states extend the family, never inline colors.
  • Settings nav: .side-nav-* (#123, #276) — sections, aria-current="page" selected style, Danger Zone in its own danger section.
  • Forms: .setup-row/.setup-label/.setup-examples/.setup-note/.setup-callout — label column left, control right, stacks on phones; native <details> for collapsible groups (#168).
  • Tables: .data-table, .tree-table (#223 — no header row, content-hugging columns, name absorbs spare width), .blob-table (#243 — per-line <tr> so gutter/code never desync), .diff-num (#244).
  • Text: .muted, .tabular, .err-line, .warn-line; .markdown-body (#182 — designed prose, covers everything marked emits).
  • Empty states: .empty-state / .empty-state-compact (#34, #35) — icon/title/hint composition, dashed panel; zero-data renders "No X configured" + setup guidance, never a machine-internal catch-all.
  • Popovers: opaque backgrounds are the STRUCTURAL default for every floating .card (#405 structural rule — .card.absolute/.card.fixed); viewport bound max-width: calc(100vw - 1rem) on every absolute/fixed panel (#278); every popover carries the outside-click close (document listener, removed in onCleanup) copied from RefPicker/TasksOverlay; .scroll-slim for popover lists (#115).
  • Graph: .gl-N classes only, lane colors live in --graph-* vars both themes, rail hidden ≤480px, rows margin-free with padding-only separation while graph-on (#506, #512 — the continuous-gutter rule: no per-row margins or divide-y borders over a continuous visual).

Page anatomy (the issues list is the canonical reference implementation)

  • Page heading text-xl font-semibold tracking-tight + toolbar row: primary CTA right-aligned via ml-auto, secondary .btn links, feature-gated CTAs hidden via the summary flag failing CLOSED (summary && !flag) (Issues.jsx #495 toolbar).
  • Filter bars: labelled fields in a grid card, 2-up on phones → 4+action wide (#232); selects bound to URL params, deep links to deleted values stay visible, never silently dropped.
  • Deep-link honesty: URL state is resolvable or visibly degraded, never dropped; pending states disable rather than flash raw ids (#416 binding comment).

Interaction/state conventions

  • Long work is never a silent spinner (law 7): tasks, SSE attach, progress.
  • Error states are human-readable with retry; failed fetches reseed from a fresh GET; no raw TypeError strings in toasts.
  • Danger Zone: typed exact-match confirm (web/src/lib/danger.js #39).
  • SolidJS event lifecycle: never touch e.currentTarget after an await; never call a data hook inside a createEffect body.
  • State-derived icons: state mapping spelled out per surface and state (web/src/lib/icons.jsx); tab icons belong to the TAB's identity, never the viewed page.

Drafted AGENTS.md amendment (verbatim, for the implementer to append as a working rule in §2, directly after the "Tailwind is the only styling language" rule)

- **The style guideline is binding for all UI work (Forgejo #533).** `docs/style-guideline.md`
  codifies the app's design language with canonical references; it is normative, not advisory.
  Every change to `web/` composes the shared classes, components, and page-anatomy patterns it
  names — a new UI element reuses the canonical idiom (naming its reference) instead of
  re-deciding styling. Deviating from the guideline, or introducing a new pattern where a
  canonical one exists, requires either (a) extending `docs/style-guideline.md` in the same
  change with the new canonical reference and rationale, or (b) an amendment in the relevant
  doc's "Decisions & deviations" section. Reviewers reject UI changes that re-decide what the
  guideline already settles. The guideline never overrides AGENTS.md law 1 (dependency budget)
  or the Tailwind-only rule; where they conflict, the law wins and the guideline is corrected.

Acceptance criteria

  • docs/style-guideline.md exists, is normative in tone, and every rule carries a canonical reference (file path, and the ticket/doc that established it) verified against the current tree.
  • The guideline covers at minimum: stack/theme foundations, the shared ui.css vocabulary, page anatomy (issues list named as reference implementation), popover/empty-state/state-chip conventions, form/table idioms, the continuous-gutter rule, and the interaction/state conventions listed above — extended with anything the author finds in the tree that belongs there.
  • The guideline references (does not restate) rules already normative in AGENTS.md and docs/go/12_web_ui.md.
  • The AGENTS.md amendment above is appended in §2 (working rules) and cross-references docs/style-guideline.md; law 12's documents-change-together rule is honored (single change, doc + amendment together).
  • No source code, markup, or CSS changed anywhere — docs only.
  • Guideline itself states its own maintenance rule: a UI pattern becomes canonical only by landing as a shared implementation + a guideline entry in the same change.
## What's requested The app now has a large, de-facto design language that lives only in `web/src/ui.css` comments, per-page JSX, scattered AGENTS.md working rules, and a chain of filed tickets (#232, #243, #244, #273, #274, #276, #278, #319, #34, #405, #465, #495, #506, #512, #521, #533, …). Every UI ticket currently re-derives the same decisions, and divergent markup for the same pattern is the recurring failure mode. This ticket asks for a **documentation deliverable only**: 1. **`docs/style-guideline.md`** — a written style guideline that interrogates the app's current design decisions into a normative document, each rule backed by a canonical reference (the file and ticket that established it). 2. **A drafted AGENTS.md enforcement amendment** (text below) making the guideline mandatory for all UI work, appended in the same change per the documents-change-with-code rule (law 12). **This is a plan/docs ticket: no code changes anywhere — the only deliverables are the new doc and the AGENTS.md amendment.** ## Method Read the design decisions out of the tree, not out of anyone's head. Every rule in the guideline cites its canonical implementation, and every cited ticket names the decision it settled. Where a decision is encoded in `docs/go/12_web_ui.md` or AGENTS.md already, the guideline references it rather than restating (one source of truth, restatements drift). ## Canonical references (seed list — the guideline author verifies each against the current tree and extends it) ### Foundations (already normative elsewhere) - **Stack**: SolidJS SPA, plain JSX (no TypeScript), runtime deps exactly `solid-js` + `@solidjs/router` + `marked` + `dompurify`; Tailwind v4 CSS-first, dark mode by default — AGENTS.md law 1 (D-WEB-6/D-WEB-7 amendments) and `docs/go/12_web_ui.md` header note. - **Tailwind is the only styling language; no one-off CSS without shared-pattern justification** — a new rule earns its place only as a shared pattern in `web/src/ui.css` (#405 opaque-popover precedent). AGENTS.md working rule (Forgejo #533). - **Mobile viewport is always checked (~390px)** — AGENTS.md working rule; layout changes verified rendered before merge, never code reading alone. - **a11y floor**: every keyboard-reachable control shows focus — `web/src/ui.css` `@layer base` `:focus-visible`. - **Theme**: dark is the shipped default (`<html class="dark">`, `lib/store.js` toggles); light is the base layer, `dark:` variants carry dark. Colors are theme tokens in both themes, never a hardcoded palette (graph vars precedent, `ui.css` `--graph-*`; ToggleSwitch.jsx). ### Shared vocabulary — `web/src/ui.css` component classes (each is the ONE idiom; new UI composes them instead of re-deciding) - Panels/chrome: `.card`, `.card-meta` (#277 — flex+gap meta rows, never concatenated spans), `.card-header` (#521 — the one title treatment for sidebar/conversation cards), `.site-header`, `.site-nav`/`.nav-link` (#238), `.brand`. - Nav strips: internal-scroll instead of wrap at narrow widths, scrollbar hidden, keyboard-reachable — `.site-nav` (#273), `.repo-tabs` (#274), `.owner-tabs` (#437, vertical variant). - Controls: `.btn` / `.btn.primary` (emerald = primary action; exactly one primary CTA per page — issues list toolbar is the reference) / `.btn.danger`, `.btn-active`, `.pill`, `.tab-badge` (#319 — count badges white-on-emerald, hidden at 0 client-side), `.input` (text-field utilities never on non-text controls — #533; non-text controls use dedicated components, e.g. `ToggleSwitch.jsx` peer-pattern switch, `role="switch"` + `aria-checked`), `.icon` (#465 — `1em`/currentColor, no per-icon CSS, spacing stays with the caller's gap). - Status chips: `.chip-open/closed/merged/draft/prerelease` — state color mapping is fixed (emerald/red/purple/amber/sky); new states extend the family, never inline colors. - Settings nav: `.side-nav-*` (#123, #276) — sections, `aria-current="page"` selected style, Danger Zone in its own danger section. - Forms: `.setup-row/.setup-label/.setup-examples/.setup-note/.setup-callout` — label column left, control right, stacks on phones; native `<details>` for collapsible groups (#168). - Tables: `.data-table`, `.tree-table` (#223 — no header row, content-hugging columns, name absorbs spare width), `.blob-table` (#243 — per-line `<tr>` so gutter/code never desync), `.diff-num` (#244). - Text: `.muted`, `.tabular`, `.err-line`, `.warn-line`; `.markdown-body` (#182 — designed prose, covers everything marked emits). - Empty states: `.empty-state` / `.empty-state-compact` (#34, #35) — icon/title/hint composition, dashed panel; zero-data renders "No X configured" + setup guidance, never a machine-internal catch-all. - Popovers: opaque backgrounds are the STRUCTURAL default for every floating `.card` (#405 structural rule — `.card.absolute/.card.fixed`); viewport bound `max-width: calc(100vw - 1rem)` on every absolute/fixed panel (#278); every popover carries the outside-click close (document listener, removed in `onCleanup`) copied from `RefPicker`/`TasksOverlay`; `.scroll-slim` for popover lists (#115). - Graph: `.gl-N` classes only, lane colors live in `--graph-*` vars both themes, rail hidden ≤480px, rows margin-free with padding-only separation while graph-on (#506, #512 — the continuous-gutter rule: no per-row margins or divide-y borders over a continuous visual). ### Page anatomy (the issues list is the canonical reference implementation) - Page heading `text-xl font-semibold tracking-tight` + toolbar row: primary CTA right-aligned via `ml-auto`, secondary `.btn` links, feature-gated CTAs hidden via the summary flag failing CLOSED (`summary && !flag`) (Issues.jsx #495 toolbar). - Filter bars: labelled fields in a grid card, `2-up` on phones → 4+action wide (#232); selects bound to URL params, deep links to deleted values stay visible, never silently dropped. - Deep-link honesty: URL state is resolvable or visibly degraded, never dropped; pending states disable rather than flash raw ids (#416 binding comment). ### Interaction/state conventions - Long work is never a silent spinner (law 7): tasks, SSE attach, progress. - Error states are human-readable with retry; failed fetches reseed from a fresh GET; no raw `TypeError` strings in toasts. - Danger Zone: typed exact-match confirm (`web/src/lib/danger.js` #39). - SolidJS event lifecycle: never touch `e.currentTarget` after an await; never call a data hook inside a `createEffect` body. - State-derived icons: state mapping spelled out per surface and state (`web/src/lib/icons.jsx`); tab icons belong to the TAB's identity, never the viewed page. ## Drafted AGENTS.md amendment (verbatim, for the implementer to append as a working rule in §2, directly after the "Tailwind is the only styling language" rule) ```markdown - **The style guideline is binding for all UI work (Forgejo #533).** `docs/style-guideline.md` codifies the app's design language with canonical references; it is normative, not advisory. Every change to `web/` composes the shared classes, components, and page-anatomy patterns it names — a new UI element reuses the canonical idiom (naming its reference) instead of re-deciding styling. Deviating from the guideline, or introducing a new pattern where a canonical one exists, requires either (a) extending `docs/style-guideline.md` in the same change with the new canonical reference and rationale, or (b) an amendment in the relevant doc's "Decisions & deviations" section. Reviewers reject UI changes that re-decide what the guideline already settles. The guideline never overrides AGENTS.md law 1 (dependency budget) or the Tailwind-only rule; where they conflict, the law wins and the guideline is corrected. ``` ## Acceptance criteria - [ ] `docs/style-guideline.md` exists, is normative in tone, and every rule carries a canonical reference (file path, and the ticket/doc that established it) verified against the current tree. - [ ] The guideline covers at minimum: stack/theme foundations, the shared `ui.css` vocabulary, page anatomy (issues list named as reference implementation), popover/empty-state/state-chip conventions, form/table idioms, the continuous-gutter rule, and the interaction/state conventions listed above — extended with anything the author finds in the tree that belongs there. - [ ] The guideline references (does not restate) rules already normative in AGENTS.md and `docs/go/12_web_ui.md`. - [ ] The AGENTS.md amendment above is appended in §2 (working rules) and cross-references `docs/style-guideline.md`; law 12's documents-change-together rule is honored (single change, doc + amendment together). - [ ] No source code, markup, or CSS changed anywhere — docs only. - [ ] Guideline itself states its own maintenance rule: a UI pattern becomes canonical only by landing as a shared implementation + a guideline entry in the same change.
crueber added this to the v1 milestone 2026-09-14 21:08:04 +00:00
Author
Owner

PR #543 addresses this: docs/style-guideline.md + verbatim AGENTS.md §2 amendment, docs-only. #543

PR #543 addresses this: docs/style-guideline.md + verbatim AGENTS.md §2 amendment, docs-only. https://git.packden.us/crueber/walhub/pulls/543
Author
Owner

Review of PR #543 (branch fix/issue-537, commit 0c76227) against issue #537's 6 acceptance criteria. Verified read-only via git show origin/fix/issue-537 + spot-checks from main checkout; no worktree modifications, no browser/docker.

CRITERION 1 — guideline exists, normative, every rule has canonical ref: PASS. docs/style-guideline.md (359 lines) opens with an explicit normative-status block ('normative, not advisory... binding via AGENTS.md §2'), uses normative language throughout (never/MUST/rejected/ONLY). Every rule cites file + ticket/doc.

CRITERION 2 — coverage of the seed list: PASS. All seed items present: foundations (F1 dark-default html.dark + store.js toggle, F2 theme tokens + graph vars, F3 :focus-visible a11y floor, F4 ~390px no-pan); full ui.css vocabulary (.card/.card-meta #277/.card-header #521/.site-header/.nav-link #238/.brand, nav strips #273/#274/#437, .btn/.primary one-CTA/.danger/.btn-active/.pill/.tab-badge #319/.input #533 + ToggleSwitch/.icon #465, chips §6, .side-nav-* #123/#276, setup rows + details #168, tables #223/#243/#244 + .markdown-body #182, empty states #34/#35, popovers #405/#278/.scroll-slim #115, graph .gl-N/--graph-* #506/#512); page anatomy names Issues.jsx as reference (heading/toolbar #495, filter grid #232, deep-link honesty #416); interaction/state (law 7 tasks/SSE, human-readable errors + tolerateMissing/tolerateDegraded, danger.js #39, SolidJS lifecycle #270, icons per-surface). Extended beyond seed (clone honesty #37/#124, head pill #252, writeGate #502, listing sources #247, DateTime #133/#312) per the 'extended with anything found' clause.

CRITERION 3 — references, doesn't restate: PASS. §0 'What lives where' points at AGENTS.md law 1 / 12_web_ui.md §§2.4-2.6/2.9/2.10/§8/§6 + AGENTS.md §2 rules by section number instead of duplicating them; guideline states the restatement-drift rule explicitly.

CRITERION 4 — AGENTS.md amendment verbatim + placement: PASS. Added line 53 is word-for-word the issue's drafted text (compared token-by-token; earlier 2-char diff in my check script was a shell-quoting artifact of my own harness, not the patch). Placed in §2 working rules directly after the Tailwind-only rule (line 52) and before Performance-claims, i.e. exactly 'appended in §2 directly after the Tailwind rule'. Law-12 single-change honored (doc + amendment in one commit).

CRITERION 5 — maintenance rule in guideline: PASS. §11 states a pattern becomes canonical ONLY via shared implementation (ui.css class / components/ / lib/ helper) PLUS a guideline entry in the SAME change, with reject-unless-extended-or-amended enforcement and law-1/Tailwind supremacy.

CRITERION 6 — docs-only: PASS. git diff --name-only main...origin/fix/issue-537 = AGENTS.md (1-line add) + docs/style-guideline.md (new) only; name-status M + A, no code/markup/CSS touched.

REFERENCE SPOT-CHECKS (main tree): all cited files exist (36/36: index.html, store.js, ui.css, Issues.jsx, data.js, danger.js, icons.jsx, Repo.jsx, ToggleSwitch.jsx, ref-pill.js, clone.js, Empty.jsx, pull-state.js, Commits.jsx, DateTime.jsx, writeGate.js, mirror.js, blob-lines.js, diff-lines.js, DiffTable.jsx, render-md.js, milestones.js, repoFeatures.js, Setup.jsx, Tree.jsx, Blob.jsx, ActivityStamp.jsx, StarCount.jsx, format.js, releases.js, IssueNew.jsx, Settings.jsx, App.jsx, Repos.jsx, Pull.jsx, Issue.jsx, Releases.jsx). Sampled content claims all hold: index.html ships <html class=dark>; store.js THEME_KEY dark-default; ui.css :focus-visible/.card/.card-meta/.card-header/chips/graph vars/opaque-popover/viewport-bound; Issues.jsx toolbar/filter/#416 binding/empty-gate; Repo.jsx ref-stream debounce + tab-badge + IDLE_MS; data.js tolerateMissing/tolerateDegraded; icons.jsx #465 header; ToggleSwitch peer/role=switch; danger.js exact-match; writeGate #502; ref-pill/clone helpers; DateTime single renderer. Line numbers drift slightly in places (expected) — guideline explicitly disclaims line numbers ('the cited file + ticket is the reference, not the line number'), so no finding.

NORMATIVE TONE: holds throughout; Decisions & deviations entry for #537 present (law 12).

No blocking issues found. MERGE RECOMMENDATION: ready to merge.

Review of PR #543 (branch fix/issue-537, commit 0c76227) against issue #537's 6 acceptance criteria. Verified read-only via git show origin/fix/issue-537 + spot-checks from main checkout; no worktree modifications, no browser/docker. CRITERION 1 — guideline exists, normative, every rule has canonical ref: PASS. docs/style-guideline.md (359 lines) opens with an explicit normative-status block ('normative, not advisory... binding via AGENTS.md §2'), uses normative language throughout (never/MUST/rejected/ONLY). Every rule cites file + ticket/doc. CRITERION 2 — coverage of the seed list: PASS. All seed items present: foundations (F1 dark-default html.dark + store.js toggle, F2 theme tokens + graph vars, F3 :focus-visible a11y floor, F4 ~390px no-pan); full ui.css vocabulary (.card/.card-meta #277/.card-header #521/.site-header/.nav-link #238/.brand, nav strips #273/#274/#437, .btn/.primary one-CTA/.danger/.btn-active/.pill/.tab-badge #319/.input #533 + ToggleSwitch/.icon #465, chips §6, .side-nav-* #123/#276, setup rows + details #168, tables #223/#243/#244 + .markdown-body #182, empty states #34/#35, popovers #405/#278/.scroll-slim #115, graph .gl-N/--graph-* #506/#512); page anatomy names Issues.jsx as reference (heading/toolbar #495, filter grid #232, deep-link honesty #416); interaction/state (law 7 tasks/SSE, human-readable errors + tolerateMissing/tolerateDegraded, danger.js #39, SolidJS lifecycle #270, icons per-surface). Extended beyond seed (clone honesty #37/#124, head pill #252, writeGate #502, listing sources #247, DateTime #133/#312) per the 'extended with anything found' clause. CRITERION 3 — references, doesn't restate: PASS. §0 'What lives where' points at AGENTS.md law 1 / 12_web_ui.md §§2.4-2.6/2.9/2.10/§8/§6 + AGENTS.md §2 rules by section number instead of duplicating them; guideline states the restatement-drift rule explicitly. CRITERION 4 — AGENTS.md amendment verbatim + placement: PASS. Added line 53 is word-for-word the issue's drafted text (compared token-by-token; earlier 2-char diff in my check script was a shell-quoting artifact of my own harness, not the patch). Placed in §2 working rules directly after the Tailwind-only rule (line 52) and before Performance-claims, i.e. exactly 'appended in §2 directly after the Tailwind rule'. Law-12 single-change honored (doc + amendment in one commit). CRITERION 5 — maintenance rule in guideline: PASS. §11 states a pattern becomes canonical ONLY via shared implementation (ui.css class / components/ / lib/ helper) PLUS a guideline entry in the SAME change, with reject-unless-extended-or-amended enforcement and law-1/Tailwind supremacy. CRITERION 6 — docs-only: PASS. git diff --name-only main...origin/fix/issue-537 = AGENTS.md (1-line add) + docs/style-guideline.md (new) only; name-status M + A, no code/markup/CSS touched. REFERENCE SPOT-CHECKS (main tree): all cited files exist (36/36: index.html, store.js, ui.css, Issues.jsx, data.js, danger.js, icons.jsx, Repo.jsx, ToggleSwitch.jsx, ref-pill.js, clone.js, Empty.jsx, pull-state.js, Commits.jsx, DateTime.jsx, writeGate.js, mirror.js, blob-lines.js, diff-lines.js, DiffTable.jsx, render-md.js, milestones.js, repoFeatures.js, Setup.jsx, Tree.jsx, Blob.jsx, ActivityStamp.jsx, StarCount.jsx, format.js, releases.js, IssueNew.jsx, Settings.jsx, App.jsx, Repos.jsx, Pull.jsx, Issue.jsx, Releases.jsx). Sampled content claims all hold: index.html ships <html class=dark>; store.js THEME_KEY dark-default; ui.css :focus-visible/.card/.card-meta/.card-header/chips/graph vars/opaque-popover/viewport-bound; Issues.jsx toolbar/filter/#416 binding/empty-gate; Repo.jsx ref-stream debounce + tab-badge + IDLE_MS; data.js tolerateMissing/tolerateDegraded; icons.jsx #465 header; ToggleSwitch peer/role=switch; danger.js exact-match; writeGate #502; ref-pill/clone helpers; DateTime single renderer. Line numbers drift slightly in places (expected) — guideline explicitly disclaims line numbers ('the cited file + ticket is the reference, not the line number'), so no finding. NORMATIVE TONE: holds throughout; Decisions & deviations entry for #537 present (law 12). No blocking issues found. MERGE RECOMMENDATION: ready to merge.
Author
Owner

Fixed by PR #543 (review clean — all 6 criteria pass, 36/36 references verified, amendment verbatim), merged. Closing.

Fixed by PR #543 (review clean — all 6 criteria pass, 36/36 references verified, amendment verbatim), merged. Closing.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
crueber/walhub#537
No description provided.